【GAS】時間指定で毎日定期実行されるトリガーを設定する
やりたいこと
GASにおいて、指定した時間(hh:mm)に毎日実行されるようトリガーを設定したい。
しかしGUI上のトリガー設定では日付ベースのタイマーを使うことで「hh〜(hh+1)時」に実行するよう指定できるだけで、これだとその1時間の中でいつ実行するかは指定できない。
解決法
スクリプトを実行するたびにトリガーを削除・設定することで解決できる。
function myFunction() { Logger.log("日付が変わりました。");}
例として今回はこの関数を00:00に毎日実行させてみることにする。
1. トリガーの生成
function createTrigger() { const nowDate = new Date(); const runDate = new Date( nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() + 1, 0, 0 );
ScriptApp.newTrigger("myFunction").timeBased().at(runDate).create();}
トリガー生成用の関数を実装する。
runDate
に定期実行したい時間を指定- 毎日実行させたいので
day
には翌日を指定 - 00:00に実行したいので
hours
とminutes
はそれぞれ0
を指定
- 毎日実行させたいので
ScriptApp.newTrigger
の引数には実行したい関数名を指定
2. 旧トリガーの削除
このままだと毎日生成したトリガーが残り続けてしまうので、実行済みのものは削除する必要がある。
function deleteTrigger() { const registeredTriggers = ScriptApp.getScriptTriggers(); registeredTriggers.forEach((registeredTrigger) => { if (registeredTrigger.getHandlerFunction() === "myFunction") { ScriptApp.deleteTrigger(registeredTrigger); } });}
旧トリガー削除用の関数を実装する。
ScriptApp.getScriptTriggers()
で既存のトリガーを取得し、その中から対象のものを削除している。
3. トリガー関数を呼び出す
function myFunction() { Logger.log("日付が変わりました。");
deleteTrigger(); createTrigger();}
あとはメインとなる関数を実行する度にトリガー関数を実行すればOK。
もし平日のみに実行したい、という場合は下記の方法で実現できる。
【GAS】日本の休日・祝日をカレンダーから判定する
4. 初回実行のトリガー追加
今回実装したスクリプトを実行しなければトリガーは生成されないので、初回実行日の分は手動で設定する必要がある。
上記設定のトリガーを追加すれば完了。これで毎日00:00にmyFunction
が実行される。