🕰️
GASで指定した時間にバッチ処理したい場合の備忘録
想定読者
自分、Google Apps Scriptで時間指定して日々のバッチ処理を実行したい人
参考
ソース
修正しました
trigger.gs
/**
* 定時実行したい関数
*/
function batch() {
// タイムアウト等でバッチ設定が出来なくならないようにするため、先に次回バッチの設定をする
clearTrigger(batch); // 古いバッチを削除する
createNextTrigger(batch, 1, 9, 10); // 翌日9時10分に実行されるトリガーを設定する
batchImpl();
}
/**
* 実際にバッチ処理で行いたい関数
*/
function batchImpl() {
// なんかの処理
// do something
}
/**
* n日後の指定時間に実行されるトリガーを作成する
* @param {Function} func 削除する関数
* @param {number} n 実行開始日
* @param {number} hour 実行開始時間
* @param {number} minitue 実行開始分
*/
function createNextTrigger(func, n=1, hour=0, minitue=0) {
if (!func) throw new Error(`funcを指定してください`);
const functionName = func.name;
if (n < 1) throw new Error(`nは1以上の整数を指定してください`);
if (hour < 0 || hour > 23) throw new Error(`hourは0~23の整数を指定してください ${hour}`);
if (minitue < 0 || minitue > 59) throw new Error(`minitueは0~59の整数を指定してください ${minitue}`);
const time = new Date();
time.setDate(time.getDate() + n);
time.setHours(hour, minitue);
ScriptApp.newTrigger(functionName)
.timeBased()
.at(time)
.create();
}
/**
* 時間起動トリガーを削除する
* @param {Function} func 削除する関数名
*/
function clearTrigger(func) {
if (!func) throw new Error(`funcを指定してください`);
const functionName = func.name;
const triggers = ScriptApp.getProjectTriggers();
for (const trigger of triggers) {
// 時間起動のトリガーじゃない場合は消さない
if (ScriptApp.TriggerSource.CLOCK !== trigger.getTriggerSource()) continue;
// 関数名が違う場合は消さない
if (functionName !== trigger.getHandlerFunction()) continue;
ScriptApp.deleteTrigger(trigger);
}
}
解説
batch 関数
トリガーとして登録される関数
createNextTrigger(batch, 1, 9, 10);
の行を変更して実行間隔・実行時間を変更する
※第2引数以降は全て整数を渡す
batchImpl 関数
実行したい処理
この関数に処理したい内容を書く
createNextTrigger 関数
基本的にこのままでいい
clearTrigger 関数
基本的にこのままでいい
Discussion