GASを使っていて課題になる悩みのひとつが「毎日10:30に○○を実行する」とさせたい時に、時間がアバウトにしか設定できないようになっていることです。
こちらを正確な時間にセットできるようにスクリプトを作成してみます。
ScriptApp.newTrigger
ScriptApp.newTriggerを使うことで、指定した時間にトリガーをセットできます。
//スクリプトをセットする
ScriptApp.newTrigger('関数名').timeBased().atHour(X).everyDays(X).create();
これで、○時○分に関数名のトリガーをセットできます。
例えば、10:30に指定したい場合は、下記のようにセットします。
const time = new Date();
time.setHours(10);
time.setMinutes(30);
ScriptApp.newTrigger('triggerTest').timeBased().at(time).create();
これで、10:30にトリガーがセットされます。
下記のようにすれば、7日後の10:30にトリガーをセットすることができます。
const date = new Date();
// 7日後
date.setDate(date.getDate() + 7);
// 10:30に時刻を設定
date.setHours(10);
date.setMinutes(30);
date.setSeconds(0);
ScriptApp.newTrigger('関数名').timeBased().at(date).create();
これで、正確な日時にトリガーをセットできます。
トリガーが増えてしまう
トリガーを追加するたびに次々と増えていってしまうので、削除をいれる仕掛けを追加しておきます。
すべてのトリガーを削除する
.getProjectTriggers()でトリガーが取得できるので、ループで全部削除していきます。
//トリガーを全部削除する
const allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
ScriptApp.deleteTrigger(allTriggers[i]);
}
こちらを先に実行しておくことで、トリガーを追加した場合に発生する、トリガーがいくつも増える問題をクリアできるかと思います。
まとめ
この方法を使うと、トリガーの実行時間を指定した時間に正確に実行させることができます。
ご参考ください。