GAS(Google Apps Script)で秒まで指定して実行する

GAS(Google Apps Script)のトリガータイプに特定の時刻を指定しても分までしか指定できません。 また仮に12:00に指定しても12:00から12:01の間のどこかで処理が実行されるので、ちょうどこの秒に処理を実行したいというのが通常はできません。

しかしUtilities.sleepという関数を使うと指定した秒に処理を実行させることができます。

例えば、12:00:00に処理を実行したい場合、流れとしては、

  1. トリガーの"日付ベースのタイマー"を使って10時〜11時の間に 関数A を実行させるように設定
  2. 関数Aは11:59にメインの関数Bを実行するようにトリガーを設定
  3. 関数Bは12:00:00から現在の日時を引いて、12:00:00になるまでUtilities.sleepを使って処理を止める
  4. そしてメインの処理を実行させる

となります。 コードは以下のような感じです。

function main() {
  deleteTrigger();

  waitUntilTime();

  // メインの処理を実行

}

function waitUntilTime() {
  var notificationTime = new Date();
  notificationTime.setHours(12);
  notificationTime.setMinutes(0);
  notificationTime.setSeconds(0);
  Utilities.sleep((notificationTime - new Date()));
}

// "日付ベースのタイマー"を使って10時から11時の間にこのトリガーを実行するように設定する
function setTrigger() {
  var triggerDay = new Date();
  triggerDay.setHours(11);
  triggerDay.setMinutes(59);
  ScriptApp.newTrigger("main").timeBased().at(triggerDay).create();
}

function deleteTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "main") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}