📘

GASのトリガーはプログラムからセットすると「時刻ぴったり」で実行できる

に公開

GASのトリガーはコードから作ると「時間ピッタリ」で動く

なんでこんなことするの?

Slack見てると、GAS経由で投稿されるWebhookが毎回ちょっとずつ時間ズレて届くんですよね。
GUIでトリガーを設定すると「◯時〜◯時の間」みたいな1時間幅しか選べなくて、秒単位のキッチリ指定ができないのが原因っぽい。

解決方法:トリガーをコードで作っちゃう

実は ScriptApp.newTrigger() を使うと、コードからトリガーを作れて、「毎週日曜12:00ちょうど」 みたいな指定ができちゃいます。
投稿時間を揃えたいときはこっちのほうが便利。

サンプルコード

以下みたいに createWeeklyTrigger() を作っておいて、GUIで「この関数を実行」って選べばOK。
毎週日曜12時に main() が走るように設定されます。

/**
 * 毎週日曜の12時に main() を実行するトリガーを作成
 * これを手動実行するとトリガーが登録される
 */
function createWeeklyTrigger() {
  // 既存トリガーを削除してから新規作成
  deleteAllTriggers();

  ScriptApp.newTrigger('main')
    .timeBased()
    .onWeekDay(ScriptApp.WeekDay.SUNDAY)
    .atHour(12) // JSTの12時
    .create();

  console.log('毎週日曜12時のトリガーを設定しました');
}

/**
 * 既存のトリガーをすべて削除
 */
function deleteAllTriggers() {
  const triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(trigger => {
    if (trigger.getHandlerFunction() === 'main') {
      ScriptApp.deleteTrigger(trigger);
    }
  });
  
  console.log(`${triggers.length}個のトリガーを削除しました`);
}

まとめ

  • GUIで設定すると「1時間幅」でしか定期実行を指定できない
  • プログラムから設定すると「時刻ぴったり」で実行可能
  • 投稿時間を揃えたいSlack連携やレポート配信に便利ですぞ
東急URBAN HACKS

Discussion