ヤクルト1000を飲み忘れることが多いので、毎晩23:00にメールを飛ばすようにした。
目次
1. 構成
・次回メール送信時刻
・更新頻度
・メール宛先、タイトル、メール本文
を定義する列をそれぞれ作成
2. スクリプト
時刻の扱いは一度UNIXTIMEに変換すると計算が容易になります。
すぐ変換できるように共通関数として用意。
メール送信のところの動きとしては、
・次回実行時刻が過去時刻であれば実行対象
・次回実行時刻の再計算結果とメールの内容を変数に定義
・メール送信
・次回実行時刻更新
といった具合。
メール送信だけではなく、LINE通知とかにも転用可能。
taskscheduler.js
//━━━━━━━━━━━━━━━
// シート定義
//━━━━━━━━━━━━━━━
var appSs = SpreadsheetApp.openById('スプレッドシートID');
//━━━━━━━━━━━━━━━
// 共通関数
//━━━━━━━━━━━━━━━
function getLastrow(sh, col) {
return sh.getRange(sh.getMaxRows(), col).
getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
}
function convUnixtime(jsttime) {
var unixtime = Date.parse(jsttime)/1000;
var unixtime_str = unixtime.toFixed();
var unixtime_int = parseInt(unixtime_str);
var year = jsttime.getFullYear();
if (year === 1899) {
return unixtime_int + 2209194000;
} else {
return unixtime_int;
}
}
function convJsttime(unixtime) {
return Utilities.formatDate(new Date( unixtime * 1000 ), "JST", "yyyy/MM/dd HH:mm:ss");
}
//━━━━━━━━━━━━━━━
// メール送信
//━━━━━━━━━━━━━━━
function sendMailByCron() {
var sh = appSs.getSheetByName('sendMail');
var lastrow = getLastrow(sh, 1);
var now = new Date();
for (var i = 2; i <= lastrow; i++) {
var exeTime = sh.getRange(i, 1).getValue();
if (exeTime <= now) {
var freqCount = sh.getRange(i, 2).getValue();
var freqCount = Math.trunc(freqCount)
var freqDuration = sh.getRange(i, 3).getValue();
var nextExeTime = getNextExeTime(exeTime, freqCount, freqDuration);
var to = sh.getRange(i, 4).getValue();
var title = sh.getRange(i, 5).getValue();
var description = sh.getRange(i, 6).getValue();
MailApp.sendEmail(to, title, description);
sh.getRange(i, 1).setValue(nextExeTime);
}
}
}
//━━━━━━━━━━━━━━━
// 次回実行時刻算出
//━━━━━━━━━━━━━━━
function getNextExeTime(exeTime, freqCount, freqDuration) {
var before = new Date(exeTime);
switch(freqDuration) {
case 'year':
var after = before.setFullYear(before.getFullYear() + freqCount);
break
case 'month':
var after = before.setMonth(before.getMonth() + freqCount);
break
case 'week':
var after = before.setDate(before.getDate() + freqCount * 7)
break
case 'day':
var after = before.setDate(before.getDate() + freqCount);
break
case 'hour':
var after = convUnixtime(before) + freqCount * 3600;
var after = convJsttime(after)
break
case 'minute':
var after = convUnixtime(before) + freqCount * 60;
var after = convJsttime(after)
break
}
var after = new Date(after);
var after = Utilities.formatDate(after, 'JST', 'yyyy-MM-dd HH:mm');
return after
}