2018年4月7日土曜日

Googleスプレッドシートの内容をGoogle Apps Scriptを使用してメール送信する

内容
Google DriveのSpreadSheetに作成されたテーブルの内容に従いメールを送信する。
  • テーブルの内容に従いメールを送信する。
  • テーブルの位置もシート内で指定する。
  • チェックのついている行のみを送信する。
  • 送信完了したら送信完了日時を記録する。
  • GASの6分制限を回避するため5分で安全に終了する。
  • 説明が面倒なので変数名を日本語にしている。
シートの例

スクリプト
function myFunction() {
  var スクリプト開始時間 = new Date();
  var アクティブシート = SpreadsheetApp.getActiveSheet();
  var テーブル範囲 = アクティブシート.getRange("シート1!A3").getValues()[0][0];
  var テーブルデータ = アクティブシート.getRange(テーブル範囲).getValues();
  var テーブル定義 = [];
  for( var i=0; i<テーブルデータ[0].length; i++ )
  {
    テーブル定義[テーブルデータ[0][i]]=i;
  }
  var len = テーブルデータ.length;
  for( var i=1; i<テーブルデータ.length; i++ )
  {
    var 今の時間 = new Date();
    // スクリプト実行開始から5分間実行していたらスクリプトを止める。
    if( (今の時間 - スクリプト開始時間) > 5*60*1000 ){
      // ★で書き込んでいるが念のため再度書き込み
      アクティブシート.getRange(テーブル範囲).setValues(テーブルデータ);
      return;
    }

    if( テーブルデータ[i][テーブル定義["送信指定"]] == "✔" && テーブルデータ[i][テーブル定義["送信完了日"]] == "" )
    {
      try{
        var 文頭         = テーブルデータ[i][テーブル定義["文頭"]];
        var 氏名         = テーブルデータ[i][テーブル定義["氏名"]];
        var メールアドレス = テーブルデータ[i][テーブル定義["メールアドレス"]];
        var ご質問       = テーブルデータ[i][テーブル定義["ご質問"]];
        var 回答         = テーブルデータ[i][テーブル定義["回答"]];

        GmailApp.sendEmail(
          メールアドレス,
          "Googleスプレッドシートの内容をメール送信するGASからのメール",
          Utilities.formatString("%s 様\n\n%s\n\n<ご質問>\n%s\n\n<ご回答>\n\n%s",氏名,文頭,ご質問,回答 ) );
        テーブルデータ[i][テーブル定義["送信完了日"]] = Utilities.formatDate(new Date(), "Asia/Tokyo","yyyyMMddHHmmss");

        // (★)スクリプトエラーが発生したときにどこまで送信したか分からなくなると困るのでこまめに書き込む
        アクティブシート.getRange(テーブル範囲).setValues(テーブルデータ);
        
        Utilities.sleep(1000);
      }catch(e)
      {
        // エラーが発生したときはセルを更新しない。
        Logger.log(e);
      }
    }
  }
  // ★で書き込んでいるが念のため再度書き込み
  アクティブシート.getRange(テーブル範囲).setValues(テーブルデータ);
}


実行結果(送信メールの例)
鈴木C助 様

お世話になります。

<ご質問>
質問です。c~

<ご回答>

回答です。c~

0 件のコメント:

コメントを投稿

質問、要望、指摘など書いていただいてもよいですが、対応できるとは限りませんのでご了承ください。私に対するものも含め他の人を嫌な気分になるようなコメントは避けてください。