GASで簡易的な自動送信メルマガを作る


目的

指定した時間に自動的に送信される簡易的なメールマガジンをGASで実装します。
エンジニア以外のメンバーに運用してもらうため、スプレッドシート上に内容を記入してもらう形にしています。

概要

スプレッドシート上に以下の項目を記入しておくと、指定した内容でメールが送信されます。

  • 送信日/時間
  • 宛先(to,cc,bcc)
  • タイトル
  • 本文(定型文)
  • 本文(都度変更文)

このような形です。

今回の例では宛先に英語圏と中国語圏を含み、本文(都度変更文)としてそれぞれの言語のメッセージボックスを用意しておき、必要に応じて挨拶を記入してもらいます。

事前準備

スプレッドシートに必要な入力項目を用意する

概要で記した通りです。日付部分や宛先部分は条件付き書式や入力制限を使ってバリデーションします。

moment.js

日付を扱うためのライブラリです。文字列からパースしたり、月末月初を求める演算ができたり、任意のフォーマットで出力できたり、と様々な機能があります。指定した時間にメールを送る処理を調べていて知り、使ってみました。

ライブラリ追加

デフォルトだと利用できないので、ライブラリの追加を行います。リソースタブからライブラリを選択します。

「Add a library」部分にMHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48を指定して「追加」を選択します。
するとMomentが表示されますので、最新バージョンを指定して追加します。

これでmoment.jsを使えるようになりました。

実装

事前準備で作成したスプレッドシートのツールタブからスクリプトエディタを選び、以下の通り貼り付けます。
sh.getRangeで取得している値はスプレッドシート上の項目の場所を参照しているので、ご利用の際は用途に応じて適当に変更してご利用ください。

sendMail.gs
function sendMail() {
  var SS_ID = "スプレッドシートID";
  var TARGET_SHEET_MAIL = "シート名";

  var sh = SpreadsheetApp.openById(SS_ID).getSheetByName(TARGET_SHEET_MAIL);
  var range = sh.getRange('B:B').getValues(); 
  var lastRow = range.filter(String).length;

  var toAdr = [];
  var ccAdr = [];
  var bccAdr = [];
  var title = sh.getRange("L11").getValue();
  var body = sh.getRange("L12").getValue();
  var EnglishGreeting = sh.getRange("L3").getValue();
  var ChineseGreeting = sh.getRange("L4").getValue();
  var deliveryDateTime = "";
  var moment = Moment.moment();

  //メール本文の置き換え
  body = body.replace("ChineseGreeting",ChineseGreeting); 
  body = body.replace("EnglishGreeting",EnglishGreeting); 

  //当月確認
  for(i=1; i<=lastRow; i++){
    var deliveryValue = sh.getRange(i + 3,2).getValue(); 
    var Month = new Date().getMonth() + 1 + "";
    if (moment.isSame(deliveryValue[i],'hour')) {
      body = body.replace("Month",Month); //本文中に記載した月の書き換え
   }
  }

  //メール宛先振り分け
  for(i=1; i<=lastRow; i++){
    var sendToValue = sh.getRange(i + 3,7).getValue()
    if (sendToValue == "to") {
       toAdr.push(sh.getRange(i + 3,9).getValue()); 
       body = body.replace("sendTo",(sh.getRange(i + 3,8).getValue())); 
    }
    if (sendToValue == "cc") ccAdr.push(sh.getRange(i + 3,9).getValue()); 
    if (sendToValue == "bcc") bccAdr.push(sh.getRange(i + 3,9).getValue()); 
  }

  //メール送付時間になったら送付する
  if (moment.isSame(deliveryDateTime,'hour')) {
    MailApp.sendEmail({to:toAdr[0], cc:ccAdr[0], bcc:bccAdr[0], subject:title, body:body});
    console.log("\nmailto: " + toAdr + "\n" + ccAdr + "\n" + bccAdr + "\n" +
             "title: " + title + "\n" +
             "body: " + body + "\n"
               );
   }
}

自動送信のための設定

Apps Script ダッシュボードからマイトリガーで以下の通り設定します。
これにより、1時間に一度スクリプトが起動し、スプレッドシートで指定した時間と重なった時に指定した宛先にメールを送信します。
重ならない時は空振りします。

結果

1時間ごとにスクリプトが実行されます。
なお、GASでのメールは1日の送信制限件数がありますので,
特に宛先が多い場合は気をつけてください。

指定した時間になると自動的にメール送信されます。