Google Apps Script

Google Apps Scriptで締め切り通知メールを送る方法

 

スケジュール管理システムで避けては通れない「締め切り」のリマインドアラートです。

今回はスプレッドシートに該当日付までにチェックが入っていなかったら指定したメールにメールが届く仕様にスクリプトを組みました。

今回スクリプトを書く上でハマった沼は少ないものの、スプレッドシートにテスト用で複数日付を埋め込んで、インストーラブルトリガーを設定した翌朝に笑えない数(実際大爆笑)のアラートメールが入っていました。

実働させるギリギリまでトリガーを設定しないようにしましょう。(真顔)

 

全体のスクリプト文

 

ソースコード

 

function sendAlart(){
  var ss = SpreadsheetApp.getActiveSheet();
  var range = ss.getDataRange().getValues();
  var today = new Date();
  
  //第一区間アラート
  for(var i = 1;i < range.length; i++){ 
//Rangeの縦列は2列目から始まるのでi+1、第一区間開始日を取りたいので8列目(H列) 
    var firstStart = ss.getRange(i + 1, 8).getValue();
    var firstStartDate = new Date(firstStart);
//第一区間開始日から今日の日を引いて残り日数を出す
    var remaining = firstStartDate.getTime() - today.getTime();
    var day = Math.ceil(remaining / 1000 / 60 / 60 / 24);
// 締め切りの5日前かつバナーチェック(J列)入っていない場合はメールを送る
    if(range[i][9] == true){
    }else if(day <= 5 && range[i][9] != true){
//テンプレートリテラルを使っています。
      var sendTo = "送り先のメールアドレス"
      var title = `メールタイトルを入れる。`
      var body = `メール本文を入れる。`
      GmailApp.sendEmail(sendTo ,title ,body ,{cc:"CCに入れたいアドレス、なければ省略可能。"});
    }
  }
//第二区間(以下第一区間と同じ)
  for(var i = 1;i < range.length; i++){  
    var secondStart = ss.getRange(i + 1, 13).getValue();
    var secondStartDate = new Date(secondStart);
    var secondremaining = secondStartDate.getTime() - today.getTime();
    var day = Math.ceil(secondremaining / 1000 / 60 / 60 / 24);
    if(range[i][14] == true  || range[i][12] == ""){
    }else if(day <= 5 && range[i][14] != true){
      var sendTo = "送り先のメールアドレス"
      var title = `メールタイトルを入れる。`
      var body = `メール本文を入れる。`
//CC無し版
      GmailApp.sendEmail(sendTo ,title ,body);
    }
  }
//第三区間
  for(var i = 1;i < range.length; i++){  
    var thirdStart = ss.getRange(i + 1, 18).getValue();
    var thirdStartDate = new Date(thirdStart);
    var thirdremaining = thirdStartDate.getTime() - today.getTime();
    var day = Math.ceil(thirdremaining / 1000 / 60 / 60 / 24);
    if(range[i][19] == true  || range[i][16] == ""){
    }else if(day <= 5 && range[i][19] != true){
          var sendTo = "送り先のメールアドレス"
      var title = `メールタイトルを入れる。`
      var body = `メール本文を入れる。`
      GmailApp.sendEmail(sendTo ,title ,body);
    }
  }
//第四区間
  for(var i = 1;i < range.length; i++){  
    var fourthStart = ss.getRange(i + 1, 23).getValue();
    var fourthStartDate = new Date(fourthStart);
    var fourthremaining = fourthStartDate.getTime() - today.getTime();
    var day = Math.ceil(fourthremaining / 1000 / 60 / 60 / 24);
    if(range[i][23] == true  || range[i][21] == ""){
    }else if(day <= 5 && range[i][23] != true){
      var sendTo = "送り先のメールアドレス"
      var title = `メールタイトルを入れる。`
      var body = `メール本文を入れる。`
      GmailApp.sendEmail(sendTo ,title ,body);
    }
  }
}

 

今回は締め切り5日前に該当欄のチェックがfalseだとアラートメールが飛ぶように書いています。

本当は3営業日前とかにしたかったのですが、営業日を取る方法をうまく組み込めなかったので大事をとって5日にしています。

 

スプレッドシート

 

2020/10/24時点でH2セルの2020/10/25開始のバナーにチェックが入っていない状態でスクリプトを動作させてみます。

締め切りアラートバナー未チェック

 

受信したGmail

 

Gmail受信画面

本業メールでは中身をきちんとアラートっぽくしていますが、今回はこんな感じです。
無事に作動してくれました。

メール本文だと分かりにくいですが、テンプレートリテラルでメール本文(ソースコード20行目)は以下のように書いています。

Gmailテンプレートリテラル

テンプレートリテラルとても便利です。
(使いこなせてないけど)

 

まとめ

 

余談ですが案件の1つの開始期間を見逃して大事故になったのが、今回スクリプトを組む直接的要因です。

スケジュール管理はコンピュータに任せましょう、いや本当。

 

参考リンク一覧

 

【業務自動化をゼロからマスター】Google Apps Scriptの仕事効率化・自動化をプログラミングで実現証明書を取得する

Google Apps Scriptを使って締め切りを通知する方法