【GAS】決まった時間ぴったりに動くトリガーを作成する

に公開

はじめに:GASのトリガー設定では時間指定ができない

GASの時間主導型>日付ベースのタイマー設定では、午前9時~午前10時といった、幅のあるトリガーセットしかできません

しかし、正確な時間にGASを実行したい場合もあります。

  • 9:00に本日の連絡をしたい
  • 12:45にハミガキ運動の連絡をしたい
  • 17:55に終業5分前を連絡したい

GASのトリガーセットを少し工夫すると、指定した時間にGASを実行することができるので紹介します。

この記事の対象者

  • GAS初心者
  • トリガー設定に不満のある方
  • 決まった時間に動くGASを作りたい方

コードを使うための準備

特にありません。
※あなたが時間通りに動かしたいコードは必要。

コードの紹介

概要としては「トリガーをセットするコードを、日付ベースのタイマーでセットする」という流れです。

例として「17:50にendOfWorkという終業を通知するようなGASを動かす」という想定でコードを紹介します。

//トリガーをセットするGAS
function setTrigger() {
  const today = new Date();
  today.setHours(17)//実行したい時間
  today.setMinutes(50);//実行したい分

  //特定の日付のトリガーを作成
 //実行したいfunction名を入れる
  ScriptApp.newTrigger('endOfWork').timeBased().at(today).create();
}

function endOfWork() {
  /*
    終業を通知するコードを書く
  */

  //トリガーをすべて取得
  const triggers = ScriptApp.getProjectTriggers();

  //endOfWorkという名前のトリガーを削除
  for (const trigger of triggers) {
    if (trigger.getHandlerFunction() === 'endOfWork') {
      ScriptApp.deleteTrigger(trigger);
    }
  }
}

上のコードに対してsetTriggerを日付ベースのタイマーで午後3時から午後4時にセットしておきます。

そうすると、15時~16時の間にsetTriggerが動いて、17:50にendOfWorkが動くトリガーをセットしてくれます。

17:50にendOfWorkが終了したら、setTriggerによってセットしたendOfWorkを削除して終了となります。


このトリガーの削除はなぜ必要かというと…

setTriggerによってセットされるトリガーは、日付ベースのタイマーのうち、特定の日時のトリガーとしてセットされます。

特定の日時のトリガーは、実行後も期限切れのトリガーとして残り続けてしまうのです。

そのため、実行後にendOfWorkのトリガーをすべて削除するコードが必要となります。

(期限切れのトリガーが蓄積されてしまうので…)

おわりに

決まった時間にGASを動かしたいと思う場面は、意外に多いように思います。

「トリガーをセットするコードを、日付ベースのタイマーでセットする」という考え方は少しややこしいですが、1度理解してしまえば簡単です。

ぜひ、思った時間に動くコードを作成してみてくださいね。

Discussion