Googleクラウドサービスを利用して時間指定メール送信システムを作る（その９）

***
＜[前へ](https://qiita.com/matsuhandy/items/a481260a9fd9bc1254fc)＞
　タイムベース実行する関数を作成し，1分ごとに実行し，メール送信時間になったら，メール送信を行います。
***
#1. 1分ごとタイムベース実行されるプログラムでメール送信

![画像2.png](https://qiita-image-store.s3.amazonaws.com/0/146927/2f6cfb09-a62a-7d1f-496d-a926050d2320.png)

* フォーム入力とは非同期で実行されるプログラムで，メール送信を行う。mailフォルダに格納されているファイルのファイル名から送信する日時を比較し，送信日時を現在日時が超えていた場合に送信する。送付とウェア構成図の①1min，②1min，③1min, ④1minを行う。

1. 一定時間（たとえば１分）ごとに実行するGASプログラムで，現在日時を取得し，保存されたメールファイルの中から，送信日時が現在時刻より古いものを抽出し送信する。
1. 送信したファイルは削除する。


#2.タイムベース実行されるプログラムをスプレッドシートのGASプログラムに追加
* 次の内容を前回のプログラムのfunction main(log)の下（日付や時間のための関数群，の上）に挿入する。
* log.printがすべてリマークになっているが，これは1分ごとに実行する都合上，ログが溜まりすぎるのを回避するためである。デバッグ中はリマークにせず有効にしておく。
* リマークにしないまま放置した場合，ログが溜まり，処理に時間がかかるようになり，連続CPU使用時間の限界である30秒を超えるようになる（2,3週間）と，エラーメッセージがGoogleからメールで届くようになる。そうなるとメール送信されなくなる。

```java:
function doPeriodically(){//時間ベースで定期的に実行される関数
  log = new Doc(logID);
  var folder = DriveApp.getFolderById("0B5ucsT8e6UEMVFJ4YUNwUHA5Yk0");//mailフォルダのIDは事前に調べておく
  var files = folder.getFiles();// mailフォルダ内を検索，ファイルの一覧を取得
  var todayNow = getDateAndTime(0);//現在日時をゲット
//  log.print("現在日時は" + todayNow + "\n");
  
  while(files.hasNext()){// ファイルが一個でもあれば
    var file = files.next();//ファイルを取得
    var fileName = file.getName();//ファイル名をゲット
//    log.print(fileName + "  ");
    if(fileName<=todayNow){//送信時間に到達していた場合
//      log.print("送信する\n");
      var fileID = file.getId();//ファイルIDをゲット
      ssFile = new Ssheet(fileID);//送信するファイルからデータをゲットする準備
      
      var maxColumn = ssFile.getLastColumn(0);//最後の列番号
      for(var i=1;i<=maxColumn;i++){
        var index = ssFile.getValue(0, 1, i);
        var data  = ssFile.getValue(0, 2, i);
        if(index == "タイムスタンプ") var timeStamp = data;
        if(index == "toAdr")        var toAdr = data;
        if(index == "ccAdr")        var ccAdr = data;
        if(index == "bccAdr")       var bccAdr = data;
        //if(index == "date")         var date = data.toString().split('_')[0];
        //if(index == "time")         var time  = ("0"+ssFile.getValue(0, 2, i)).slice(-6);
        if(index == "date")         var date = data;
        if(index == "time")         var time  = data;
        if(index == "subject")      var subject = data;
        if(index == "body")         var body = data;
      }
//      log.print("データ取得完了\n");
      MailApp.sendEmail({// メール送信
        to: toAdr,
        cc: ccAdr,
        bcc: bccAdr,
        subject: subject,
        name: "時間指定メール配信システム",
        body: "送信設定日時："+getDateAndTime(timeStamp)+'\n'
        +"送信予定日時："+fileName+"\n\n"
        +body
      });
//      log.print("メール送信完了\n");
      file.setTrashed(true);
//      log.print("ファイル削除完了\n");
    }else{//送信日時に到達していない場合
//      log.print("送信しない\n");
    }
  }
}
```


***
* 現在のプロジェクトのトリガーで，doPeriodically()に対する，新しいトリガー，を追加する。

![画像4.png](https://qiita-image-store.s3.amazonaws.com/0/146927/1740fe93-92c7-ec73-cada-16a093d20618.png)

---

![画像2.png](https://qiita-image-store.s3.amazonaws.com/0/146927/b50a8de5-f7e9-7dc4-8ec2-dec73da76fd2.png)

---
* 承認の許可を求められた場合，内容を確認して許可する。

![画像31.png](https://qiita-image-store.s3.amazonaws.com/0/146927/f7f9b613-834b-0896-3565-95b8e96cc4f6.png)

---

* log2を見えるようにした状態で，フォームに数分後に送信日時を設定して，メールを送信する。間違っても人に迷惑をかけないため，送信先アドレスは自分のアドレスにする。
* 動作確認ができたら，doPeriodically()のlog.printについてコメントアウトにしておく。


***
　これで送信日時指定メール送信サーバーサイドアプリケーションのの完成です。
＜[前へ](https://qiita.com/matsuhandy/items/a481260a9fd9bc1254fc)＞
***