スケジュール管理システムで避けては通れない「締め切り」のリマインドアラートです。
今回はスプレッドシートに該当日付までにチェックが入っていなかったら指定したメールにメールが届く仕様にスクリプトを組みました。
今回スクリプトを書く上でハマった沼は少ないものの、スプレッドシートにテスト用で複数日付を埋め込んで、インストーラブルトリガーを設定した翌朝に笑えない数(実際大爆笑)のアラートメールが入っていました。
実働させるギリギリまでトリガーを設定しないようにしましょう。(真顔)
全体のスクリプト文
ソースコード
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

本業メールでは中身をきちんとアラートっぽくしていますが、今回はこんな感じです。
無事に作動してくれました。
メール本文だと分かりにくいですが、テンプレートリテラルでメール本文(ソースコード20行目)は以下のように書いています。

テンプレートリテラルとても便利です。
(使いこなせてないけど)
まとめ
余談ですが案件の1つの開始期間を見逃して大事故になったのが、今回スクリプトを組む直接的要因です。
スケジュール管理はコンピュータに任せましょう、いや本当。
参考リンク一覧
【業務自動化をゼロからマスター】Google Apps Scriptの仕事効率化・自動化をプログラミングで実現証明書を取得する
Google Apps Scriptを使って締め切りを通知する方法