Oteto Blogのロゴ

【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に実行したいのでhoursminutesはそれぞれ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が実行される。