前に似たような記事を書きましたが、別バージョンです。
前は何日前にアラートを出す、という列がありましたが今回はそれがなく、決まった日数前になったらアラートメールを出します。
スプレッドシートに期限日だけしか書いていないパターンです。
const TO = "dummy@taibonn.com";
const DEADLINEINDEX = 10;//期限日が記載されている列を配列で取得した時の要素番号(10=K列)
const NAMEINDEX = 1;
const ALERTDAYS = [6,30];//1週間前、1か月前にアラート
//1か月前と1週間前で通知を出す
//通知対象行を抽出してメールを送る関数に渡す
function alertMail() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("シート1");//実際のシート名に変更する
const today = new Date();
const data = sheet.getDataRange().getValues();
//期限日1か月前と1週間前の行を抜き出す
let targetRows = [];
for(let i = 0; i < data.length; i++){
let row = data[i];
let targetDay = new Date(row[DEADLINEINDEX]);
let diffDays = Math.floor((targetDay.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));
if (ALERTDAYS.includes(diffDays)) {
targetRows.push(row);
}
}
const result = sendMail(targetRows);
}
//メールを送る関数
function sendMail(rows){
if(rows.length == 0){return};
rows.sort(function(a, b) {return a[dateIndex] - b[dateIndex];});//期限日を昇順にソート
for(let i = 0; i < rows.length; i++){
let row = rows[i];
let name = row[NAMEINDEX];
let date = Utilities.formatDate(row[dateIndex], "JST", "yyyy/MM/dd");
message.push("・" + name + ": " + date);
}
message = message.join("\n");
const subtitle = "期限日通知メール"
const body =subtitle + "\n\nシステムからの通知メールになります。\n下記期限日が近づいております。ご確認ください。\nhttps://docs.google.com/spreadsheets/d/************************/edit#gid=0\n\n" + message + "\n\n" + "よろしくお願いいたします。\n";
Logger.log(TO + "\n" + subtitle + "\n" + body);
GmailApp.sendEmail(TO, subtitle, body);
}
/* 期限〇日前にだけアラートを出すのではなく期限切れて更新されるまで継続して通知出したい場合は条件を下記に変更
// 今日の日付を取得
const today = new Date();
// 1週間後の日付を計算
const oneWeekLater = new Date();
oneWeekLater.setDate(today.getDate() + 7);
// もし期限日が本日から1週間後までの間にあれば、アラートを出す
if (targetDay >= today && targetDay <= oneWeekLater) {
// アラートを出す処理
}
*/
もし監視しなきゃいけない期限日の列が2つ以上あれば、メールを送る関数に渡す引数を増やすと対応できる。
もうちょっと汎用化したら色んな場合でも使いやすいかもですが、そうすると細かくなりすぎてかえって面倒。
何でもかんでも盛り込んじゃってアラート出さなきゃいけない期限日列が増えるまではこのくらいでいいんではないでしょうか。
そこは依頼者の要望次第です・・・
const TO = "dummy@taibonn.com";
const DEADLINE_A_INDEX = 10;//K列の要素番号
const DEADLINE_B_INDEX = 11;//L列の要素番号
const NAMEINDEX = 1;
const ALERTDAYS = [6,30];//1週間前、1か月前にアラート
function alertMail() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("シート1");
const today = new Date();
const data = sheet.getDataRange().getValues();
//1種類目の期限日
let targetARows = [];
for(let i = 0; i < data.length; i++){
let row = data[i];
let targetADay = new Date(row[DEADLINE_A_INDEX]);
let diffDays = Math.floor((targetADay.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));
if (ALERTDAYS.includes(diffDays)) {
targetARows.push(row);
}
}
const resultA = sendMail(targetARows,"A");
//2種類目の期限日
let targetBRows = [];
for(let i = 0; i < data.length; i++){
let row = data[i];
let targetBDay = new Date(row[DEADLINE_B_INDEX]);
let diffDays = Math.floor((targetBDay.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));
if (ALERTDAYS.includes(diffDays)) {
targetBRows.push(row);
}
}
const resultB = sendMail(targetBRows,"B");
}
function sendMail(rows,type){
if(rows.length == 0){return};
let message = ["対象者: 期限日"];
let dateIndex, subtitle;
if(type == "A"){
dateIndex = DEADLINE_A_INDEX;
subtitle = "【要確認】A期限日通知";
}else if(type == "B"){
dateIndex = DEADLINE_B_INDEX;
subtitle = "【要確認】B期限日通知";
}
rows.sort(function(a, b) {return a[dateIndex] - b[dateIndex];});
for(let i = 0; i < rows.length; i++){
let row = rows[i];
let name = row[NAMEINDEX];
let date = Utilities.formatDate(row[dateIndex], "JST", "yyyy/MM/dd");
message.push("・" + name + ": " + date);
}
message = message.join("\n");
const body =subtitle + "\n\nシステムからの通知メールになります。\n下記期限日が近づいております。ご確認ください。\nhttps://docs.google.com/spreadsheets/d/**********/edit#gid=0\n\n" + message + "\n\n" + "よろしくお願いいたします。\n";
Logger.log(TO + "\n" + subtitle + "\n" + body);
GmailApp.sendEmail(TO, subtitle, body);
}
コメント