LoginSignup
1
1

More than 3 years have passed since last update.

GASで1時間に一度、指定時刻にmyFunctionを実行する

Last updated at Posted at 2021-03-29

はじめに

「GASで1時間に一度、指定時刻にmyFunctionを実行する」なんて
めっちゃ簡単そうと思ったら、
下記のような事情で、工夫が必要だったので記事にしました。

  • 時間主導型のトリガーは、時刻を指定すると繰り返し実行できない
  • ユーザー/スクリプトにつき設定できるトリガーは20個まで

目次

  • 手順まとめ
  • 解説

手順まとめ

タイムゾーンの変更

プロジェクトの設定から
「appsscript.json」マニフェスト ファイルをエディタで表示する」
にチェックを入れる

application.jsonを編集する

appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}

詳しくはこちら

GASコード

// run in 23-24
function setTriggersAM() {
  removeTriggers();
  var time = new Date();
  time.setDate(time.getDate() + 1);
  for (var i = 0; i < 12; i++) {
    time.setHours(i);
    time.setMinutes(0);
    ScriptApp.newTrigger('myFunction').timeBased().at(time).create();
  }
}

// run in 11-12
function setTriggersPM() {
  removeTriggers();
  var time = new Date()
  for (var i = 12; i < 24; i++) {
    time.setHours(i);
    time.setMinutes(0);
    ScriptApp.newTrigger('myFunction').timeBased().at(time).create();
  }
}

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

function myFunction() {

}

時間主導型トリガーの設定

  • 1日に一度、23時から24時の間にsetTriggersAM()を実行
  • 1日に一度、11時から12時の間にsetTriggersPM()を実行

解説

設計

GASコード
function removeTriggers() {
  // myFunction() を実行するトリガーを全て削除
}


function setTriggersAM() {
  removeTriggers()  // 実行済みのトリガーを削除するため
  // myFunction()を実行するトリガーを、翌日の0時0分から11時00分まで1時間ごとに計12個設定
}

function setTriggersPM() {
  removeTriggers()  //実行済みのトリガーを削除するため
  // myFunction()を実行するトリガーを、その日の12時0分から23時00分まで1時間ごとに計12個設定
}

function myFunction() {
  // あなたが実行したい内容
}
時間主導型トリガー
1日に一度23時から24時の間に setTriggersAM() を実行する
1日に一度11時から12時の間に setTriggersPM() を実行する

注意点

GASの仕様

「時間主導型のトリガーは毎日特定の日時に設定できない」
(https://tonari-it.com/gas-trigger-set/ より引用。)

つまり、時間主導型のトリガーは、時刻を指定すると繰り返し実行できないということ。
それに加えて、

Apps script has a limited of 20 triggers per user/script.
(https://stackoverflow.com/questions/31713735/dynamically-set-google-script-time-driven-timers-and-too-many-timers-error-in-gm より引用)

つまり、ユーザー/スクリプトにつき設定できるトリガーは20個まで
という事情があるので、上記のような少し複雑な実装になっている。

setTriggersAM()とsetTriggersPM()の違い

setTriggersAM() は23-24時に実行されるので、
翌日の0時0分から11時00分まで1時間ごとに計12個設定しているのに対して、
setTriggersPM() は23-24時に実行されるので、
その日の12時00分から23時00分まで1時間ごとに計12個設定していることに注意。

タイムゾーンを変更する理由

タイムゾーンを変更しないと、setTriggersAM(), setTriggersPM()

time.setHours(i);

でニューヨークのタイムゾーンの時刻がセットされてしまう。

参考URL

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1