杉岡システム公式ブログ

https://blog.sugiokasystem.co.jp

GASで仕入予定日の自動メール通知コードを組む【サンプルコード付き】

タイトルイメージ画像

Googleスプレッドシートに入力したデータをGoogle Apps Scriptと連動させることで、特定のタイミングで任意の内容のメールを送る(通知メールの送信)設定ができます。
今回は購入商品の仕入れ予定日通知メールのコードの組み方を例に出しつつ、コードの構成をご紹介致します。
※コピペで使用できるサンプルコード付き

初期設定

以下の手順でスプレッドシートGoogle Apps Scriptを連動させます。

  1. 設定したいスプレッドシートを開く
  2. スプレッドシート上メニュー「拡張機能」>「Apps Script」
  3. Google Apps Scriptのコード編集画面(プロジェクト編集画面)に遷移

以上で、設定したいスプレッドシートGoogle Apps Scriptの連動設定は完了です。
あとはGoogle Apps Scriptのコード編集画面で組みたいコードを記述していきます。

Google Apps Script (GAS)

コードの言語は「JavaScript」に近いです。
コードの編集はGoogle Apps Scriptで直接組むことをオススメします。
デバッグ機能もありますので、操作性は高いです。
Apps Script – Google Apps Script

コードを組む - 自動メール送信設定

下記の「変数」の部分は任意に設定できます。
お好きな名前を設定してください。

  • var 変数
  • const 変数

ステップ1

function名の設定・シートの取得

function名を設定します。
function名は、組んだコード(作成したプロジェクト)を起動させるトリガーの設定時に必要になります。
トリガーの設定はGoogle Apps Script左メニュー「マイトリガー」から設定できます。

スプレッドシートの「どのシート」からデータを参照するのか指定します。

function mailSend() {
  var mySs = SpreadsheetApp.getActiveSpreadsheet(); // スプレッドシートを取得
  var Sheet = mySs.getSheetByName('シート名を記入'); // シート名を取得
}


ステップ2

シートの列の名前を定義

参照する列の名前(const 変数)を設定します。
const 変数 = シード左からn列目

/* 繰り返し計算式の変数を定義 */
/* const 変数 = 数字(左から何列目なのかを記述 - C列なら「3」と記述); */
const ORDER_DATE = 1; // A列 「発注日」を取得
const ORDER_NUMBER = 2; // B列 「注文番号」を取得
const INVOICE_NUMBER = 3; // C列 「請求書番号」を取得
const SHIPPING_DATE = 4; // D列「仕入予定日」を取得
const STATUS = 5; // E列 「状態」を取得
const SHIPPING_NUMBER = 6; // F列「追跡番号」を取得
const SHIPPING_URL = 7; // G列「追跡番号URL」を取得
const ORDERER = 9; // I列「購入者」を取得
const MODEL_NUMBER = 11; // K列 「製品型番」を取得
const USE = 12; // L列 「用途」を取得
const CATEGORY = 15; // O列 「カテゴリ」を取得
const SHOP = 16; // P列 「発注先」を取得
const PIECE = 17; // Q列 「発注数」を取得
const PRICE = 19; // S列 「合計金額」を取得


ステップ3

日付の表示内容を設定

取得した日付の表示形式と表示時間を設定します。
サンプルコードでは、日付の表示形式を「2022年6月3日(金)」、表示時間を「日本時間」に設定しています。

/* 今日の日付を取得し文字列を成形する */
const today = new Date(); // 今日の日付を取得
const options = { weekday: 'short', year: 'numeric', month: 'long', day: 'numeric', timeZone: 'Asia/Tokyo' }; // 日付の表示形式を設定・表示時間を日本時間に設定


メール送信先設定

メールの送信先と差出人名を設定します。

/* リマインダー送信アドレス設定 */
var strTo = ;
strTo.push('送信先メールアドレス'); // To
var strSender = '差出人名'; // 差出人名
var strFrom = 'Google App Script編集時にログインしているGmailアドレス'; // From 今ログインしているGmailアドレス


ステップ4

データの参照・処理範囲を指定

何行目から何行目までのデータを参照・処理するのかを指定します。
for (var i = n行目; i <= m行目; i++)

/* 繰り返し計算 */
for (var i = 3; i <= 100; i++) { // 3行目-100行目までを繰り返し処理 - どこからどこまで処理するかは必ず記述すること
}


メール本文で使用する値の定義を設定

メール本文で使用する値の定義を設定します。
var 値 = Sheet.getRange(i, ステップ2で設定した変数).getValue();

/* 仕入予定日 */
var sippingDate = Sheet.getRange(i, SHIPPING_DATE).getValue();

/* 注文内容 */
var orderDate = Sheet.getRange(i, ORDER_DATE).getValue(); // 発注日
var orderNumber = Sheet.getRange(i, ORDER_NUMBER).getValue(); // 注文番号
var invoiceNumber = Sheet.getRange(i, INVOICE_NUMBER).getValue(); // 請求書番号
var modelNumber = Sheet.getRange(i, MODEL_NUMBER).getValue(); // 製品型番
var use = Sheet.getRange(i, USE).getValue(); // 用途
var category = Sheet.getRange(i, CATEGORY).getValue(); // カテゴリ
var piece = Sheet.getRange(i, PIECE).getValue(); // 発注数
var price = Sheet.getRange(i, PRICE).getValue(); // 合計金額
var shippingDate = Sheet.getRange(i, SHIPPING_DATE).getValue(); // 仕入予定日
var orderer = Sheet.getRange(i, ORDERER).getValue(); // 購入者

/* 状態 */
var status = Sheet.getRange(i, STATUS).getValue(); // 状態
var shippingNumber = Sheet.getRange(i, SHIPPING_NUMBER).getValue(); // 追跡番号
var shippingUrl = Sheet.getRange(i, SHIPPING_URL).getValue(); // 追跡番号URL

/* 購入場所 */
var shop = Sheet.getRange(i, SHOP).getValue(); // 発注先


仕入予定日までの日数を計算し、日付を成形

/* 仕入予定日までの日数を計算し日付に変換 */
var date_shippingDate = Math.ceil((new Date(sippingDate)).getTime() / 1000 / 60 / 60 / 24); // 「仕入予定日」のDateを作成, 日付に切り上げ
var dt = Math.ceil(today.getTime() / 1000 / 60 / 60 / 24); // 今日の日付
var day = date_shippingDate - dt; // 日付の差に変換


取得した日付の表示内容を設定

ステップ3で設定した日付の表示内容になるように設定します。

/* 取得した日付を設定した表示内容・日本時間に成形する */
orderDate = orderDate.toLocaleString('ja-JP', options); // 発注日を日本時間表示
shippingDate = shippingDate.toLocaleString('ja-JP', options); // 仕入予定日を日本時間表示


ステップ5

メールを送る条件を指定 - 1

if (shippingDate == '' || status == '仕入済み' || status == 'キャンセル') {
  /* ステータスが「仕入済み」か「キャンセル」、もしくは仕入予定日が空白なら何もしない */
  continue;
}


共通するメール本文の内容を設定

今回は、仕入予定日の「7日前・1日前」「当日」「予定日を3日過ぎた時」の3タイプに分けて、メール本文を設定します。
メール3タイプの内、共通している本文内容の部分は、以下のようにあらかじめ設定しておきます。

var mailBody =
  '\n' /* 改行 */
  + '発注日:' + orderDate + '\n' /* 改行 */
  + '発注先:' + shop + '\n' /* 改行 */
  + '仕入予定日:' + shippingDate + '\n' /* 改行 */
  + 'ステータス:' + status + '\n' /* 改行 */
  + '購入者:' + orderer + '\n' /* 改行 */
  + '追跡番号:' + shippingNumber + '\n' /* 改行 */
  + '追跡番号URL:' + shippingUrl + '\n' /* 改行 */
  + '\n' /* 改行 */
  + '\n' /* 改行 */
  + '【注文内容】\n' /* 改行 */
  + '注文番号:' + orderNumber + '\n' /* 改行 */
  + '請求書番号:' + invoiceNumber + '\n' /* 改行 */
  + '注文製品型番:' + modelNumber + '\n' /* 改行 */
  + '注文製品カテゴリ:' + category + '\n' /* 改行 */
  + '使用用途:' + use + '\n' /* 改行 */
  + '\n' /* 改行 */
  + '購入数:' + piece + '点\n' /* 改行 */
  + '合計金額:' + price + '円(税込)\n';


メールを送る条件を指定 - 2

var strSubject = ''; // strSubjectの初期設定は「空白」とする
var strBody = ''; // strBodyの初期設定は「空白」とする


// メール本文


if (strSubject !== '') { // strSubjectが「空白でない」場合はメールを送信
  /* メールを送信 */
  GmailApp.sendEmail(
    strTo,
    strSubject,
    strBody,
    {
      from: strFrom,
      name: strSender
    }
  );
}


3タイプのメール本文を設定

if (day === 7 || day === 1) {
  // 仕入予定日の7日前 or 1日前
  /* メール本文を準備 */
  strSubject = '【仕入予定日のお知らせ】' + orderer + '様ご注文製品の仕入予定日まであと' + day + '日です';
  strBody = '仕入予定日まであと' + day + '日です。\n' /* 改行 */
    + modelNumber + 'の仕入予定日が近付いてきたのでお知らせします。\n' /* 改行 */
    + mailBody;
}
else if (day === 0) {
  // 仕入予定日の当日
  /* メール本文を準備 */
  strSubject = '【仕入予定日のお知らせ】' + orderer + '様ご注文製品の仕入予定日当日です';
  strBody = '仕入予定日当日になりました。\n' /* 改行 */
    + modelNumber + 'が無事発送されたか確認してください。\n' /* 改行 */
    + mailBody;
}
else if (day === -3) {
  // 仕入予定日を過ぎた後
  /* メール本文を準備 */
  strSubject = '【仕入予定日のお知らせ】' + orderer + '様ご注文製品の仕入予定日を過ぎました';
  strBody = '仕入予定日を過ぎました。\n' /* 改行 */
    + modelNumber + 'が無事発送されたか確認してください。\n' /* 改行 */
    + '発送されていない場合は仕入予定日を確認し、必要があれば、仕入予定日を変更・更新してください。\n' /* 改行 */
    + mailBody;
}

サンプルコード全文

コピー・アンド・ペーストしてご使用いただけます。

function mailSend() {
  var mySs = SpreadsheetApp.getActiveSpreadsheet(); // スプレッドシートを取得
  var Sheet = mySs.getSheetByName('シート名を記入'); // シート名を取得

  /* 繰り返し計算式の変数を定義 */
  /* const 変数 = 数字(左から何列目なのかを記述 - C列なら「3」と記述); */
  const ORDER_DATE = 1; // A列 「発注日」を取得
  const ORDER_NUMBER = 2; // B列 「注文番号」を取得
  const INVOICE_NUMBER = 3; // C列 「請求書番号」を取得
  const SHIPPING_DATE = 4; // D列「仕入予定日」を取得
  const STATUS = 5; // E列 「状態」を取得
  const SHIPPING_NUMBER = 6; // F列「追跡番号」を取得
  const SHIPPING_URL = 7; // G列「追跡番号URL」を取得
  const ORDERER = 9; // I列「購入者」を取得
  const MODEL_NUMBER = 11; // K列 「製品型番」を取得
  const USE = 12; // L列 「用途」を取得
  const CATEGORY = 15; // O列 「カテゴリ」を取得
  const SHOP = 16; // P列 「発注先」を取得
  const PIECE = 17; // Q列 「発注数」を取得
  const PRICE = 19; // S列 「合計金額」を取得

  /* 今日の日付を取得し文字列を成形する */
  const today = new Date(); // 今日の日付を取得
  const options = { weekday: 'short', year: 'numeric', month: 'long', day: 'numeric', timeZone: 'Asia/Tokyo' }; // 日付の表示形式を設定・表示時間を日本時間に設定

  /* リマインダー送信アドレス設定 */
  var strTo = ;
  strTo.push('送信先メールアドレス'); // To
  var strSender = '差出人名'; // 差出人名
  var strFrom = 'Google App Script編集時にログインしているGmailアドレス'; // From 今ログインしているGmailアドレス

  /* 繰り返し計算 */
  for (var i = 3; i <= 100; i++) { // 3行目-100行目までを繰り返し処理 - どこからどこまで処理するかは必ず記述すること
    /* 仕入予定日 */
    var sippingDate = Sheet.getRange(i, SHIPPING_DATE).getValue();

    /* 注文内容 */
    var orderDate = Sheet.getRange(i, ORDER_DATE).getValue(); // 発注日
    var orderNumber = Sheet.getRange(i, ORDER_NUMBER).getValue(); // 注文番号
    var invoiceNumber = Sheet.getRange(i, INVOICE_NUMBER).getValue(); // 請求書番号
    var modelNumber = Sheet.getRange(i, MODEL_NUMBER).getValue(); // 製品型番
    var use = Sheet.getRange(i, USE).getValue(); // 用途
    var category = Sheet.getRange(i, CATEGORY).getValue(); // カテゴリ
    var piece = Sheet.getRange(i, PIECE).getValue(); // 発注数
    var price = Sheet.getRange(i, PRICE).getValue(); // 合計金額
    var shippingDate = Sheet.getRange(i, SHIPPING_DATE).getValue(); // 仕入予定日
    var orderer = Sheet.getRange(i, ORDERER).getValue(); // 購入者
    /* 状態 */
    var status = Sheet.getRange(i, STATUS).getValue(); // 状態
    var shippingNumber = Sheet.getRange(i, SHIPPING_NUMBER).getValue(); // 追跡番号
    var shippingUrl = Sheet.getRange(i, SHIPPING_URL).getValue(); // 追跡番号URL
    /* 購入場所 */
    var shop = Sheet.getRange(i, SHOP).getValue(); // 発注先

    /* 仕入予定日までの日数を計算し日付に変換 */
    var date_shippingDate = Math.ceil((new Date(sippingDate)).getTime() / 1000 / 60 / 60 / 24); // 「仕入予定日」のDateを作成, 日付に切り上げ
    var dt = Math.ceil(today.getTime() / 1000 / 60 / 60 / 24); // 今日の日付
    var day = date_shippingDate - dt; // 日付の差に変換

    /* 取得した日付を設定した表示内容・日本時間に成形する */
    orderDate = orderDate.toLocaleString('ja-JP', options); // 発注日を日本時間表示
    shippingDate = shippingDate.toLocaleString('ja-JP', options); // 仕入予定日を日本時間表示

    if (shippingDate == '' || status == '仕入済み' || status == 'キャンセル') {
      /* ステータスが「仕入済み」か「キャンセル」、もしくは仕入予定日が空白なら何もしない */
      continue;
    }

    var mailBody =
      '\n' /* 改行 */
      + '発注日:' + orderDate + '\n' /* 改行 */
      + '発注先:' + shop + '\n' /* 改行 */
      + '仕入予定日:' + shippingDate + '\n' /* 改行 */
      + 'ステータス:' + status + '\n' /* 改行 */
      + '購入者:' + orderer + '\n' /* 改行 */
      + '追跡番号:' + shippingNumber + '\n' /* 改行 */
      + '追跡番号URL:' + shippingUrl + '\n' /* 改行 */
      + '\n' /* 改行 */
      + '\n' /* 改行 */
      + '【注文内容】\n' /* 改行 */
      + '注文番号:' + orderNumber + '\n' /* 改行 */
      + '請求書番号:' + invoiceNumber + '\n' /* 改行 */
      + '注文製品型番:' + modelNumber + '\n' /* 改行 */
      + '注文製品カテゴリ:' + category + '\n' /* 改行 */
      + '使用用途:' + use + '\n' /* 改行 */
      + '\n' /* 改行 */
      + '購入数:' + piece + '点\n' /* 改行 */
      + '合計金額:' + price + '円(税込)\n' /* 改行 */
      + '\n' /* 改行 */
      + '\n' /* 改行 */
      + 'Googleスプレッドシート「スプレッドシートA」を見る:\n' /* 改行 */
      + '該当のGoogleスプレッドシートURL';

    var strSubject = ''; // strSubjectの初期設定は「空白」とする
    var strBody = ''; // strBodyの初期設定は「空白」とする

    if (day === 7 || day === 1) {
      // 仕入予定日の7日前 or 1日前
      /* メール本文を準備 */
      strSubject = '【仕入予定日のお知らせ】' + orderer + '様ご注文製品の仕入予定日まであと' + day + '日です';
      strBody = '仕入予定日まであと' + day + '日です。\n' /* 改行 */
        + modelNumber + 'の仕入予定日が近付いてきたのでお知らせします。\n' /* 改行 */
        + mailBody;
    }
    else if (day === 0) {
      // 仕入予定日の当日
      /* メール本文を準備 */
      strSubject = '【仕入予定日のお知らせ】' + orderer + '様ご注文製品の仕入予定日当日です';
      strBody = '仕入予定日当日になりました。\n' /* 改行 */
        + modelNumber + 'が無事発送されたか確認してください。\n' /* 改行 */
        + mailBody;
    }
    else if (day === -3) {
      // 仕入予定日を過ぎた後
      /* メール本文を準備 */
      strSubject = '【仕入予定日のお知らせ】' + orderer + '様ご注文製品の仕入予定日を過ぎました';
      strBody = '仕入予定日を過ぎました。\n' /* 改行 */
        + modelNumber + 'が無事発送されたか確認してください。\n' /* 改行 */
        + '発送されていない場合は仕入予定日を確認し、必要があれば、仕入予定日を変更・更新してください。\n' /* 改行 */
        + mailBody;
    }

    if (strSubject !== '') { // strSubjectが「空白でない」場合はメールを送信
      /* メールを送信 */
      GmailApp.sendEmail(
        strTo,
        strSubject,
        strBody,
        {
          from: strFrom,
          name: strSender
        }
      );
    }
  }
}

お問い合わせはこちら

製品開発に関するご相談、お見積りなど、お気軽にお問い合わせください。

会社名

杉岡システム株式会社

電話

072-853-3553(平日10:00 - 17:30)

FAX

072-853-3577(平日10:00 - 17:30)

メール

support@sugiokasystem.co.jp(24時間受付)
営業時間外の場合、翌営業日以降に対応致します。

お問い合わせフォーム

開発依頼・お見積り・その他お問い合わせはこちら(24時間受付)

営業時間外の場合、翌営業日以降に対応致します。