MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Google Apps Script で 平日の 特定時間帯のみ 1時間おきに関数を実行する

f:id:mofumofu_dance:20210527223339p:plain

はじめに

Google Apps Script で定期実行する場合にはトリガーとして「時間主導型」を利用します。例えば1時間おきに実行したい場合には、1時間ごとに実行されるトリガーを設定すればよいのですが、この場合 実行される時間は 分単位では指定できません

f:id:mofumofu_dance:20210527221636p:plain
スケジュール実行には時間主導型トリガー

これについて、タカハシさんのブログで「毎日決まった時間に実行する方法」が説明されています。

tonari-it.com

これだと、毎日1回毎日決まった時間に実行されますね。

少し仕事で使いやすいように、「月~金曜の10時~18時の1時間おきに実行される」トリガーを考えてみました。

スクリプト

考え方としてはタカハシさんのブログと同じで、定期実行されるトリガー の中で、メイン処理を行うためのトリガーを時間指定で作成します。

ただし1時間おき、決まった時間、決まった区間 でのみメイン処理を行うトリガーを生成するようにします。イメージは下図のような感じ。

f:id:mofumofu_dance:20210527221107p:plain
トリガーと実行する関数本体の時系列

そこで setTrigger() 関数内を少しいじって、特定の条件に合致した場合のみ、トリガー生成を行うようにしました。

function myFunction() {
  //何かしらのメイン処理
  delTrigger();
}

function setTrigger() {
  const time = new Date();
  const regWeekDay = /[1-5]/; //月曜~金曜を判定するための正規表現 
  const regWorkHours =  /^(1[0-7]|9)$/; //9~17の数字範囲を判定する正規表現

//実行した時間が9~17時 かつ 実行した日が月曜~金曜 ならば
  if (regWorkHours.test(time.getHours()) && regWeekDay.test(time.getDay())) {
  //次の時間 (hour) の 00分で myFunction を実行する時間指定タイマーをセット
    time.setHours(time.getHours() + 1); 
    time.setMinutes(0);
    ScriptApp.newTrigger('myFunction').timeBased().at(time).create();
  }
}

function delTrigger() {

  const triggers = ScriptApp.getProjectTriggers();
  for (const trigger of triggers) {
    if (trigger.getHandlerFunction() == "myFunction") {
      ScriptApp.deleteTrigger(trigger);
    }
  }

}

また、「次の時間の00分に実行」されるようにトリガーを設定したいので、[現在の時間 (hour)] +1 をトリガーの時間に設定しています。

実際に実行してみると、9時~17時に実行されている setTrigger() によって、次の時間 10時~18時 に myFunction() 用のトリガーが生成されています。

f:id:mofumofu_dance:20210527215522p:plain
実行結果 : 10時から18時で1時間おきに実行されている

※時間の正規表現については以下のサイトがとても実践的で参考になりました。

www.oreilly.com

まとめ

定期実行はメインの処理とトリガーをするためだけの関数に分けるといろいろ応用ができそうですね。

祝日を省いたりする場合にはGoogle カレンダーから祝日を取得すればいいかなと思います。

はまったのは、「どれを定期実行すればいいのか」でした。(最初 myFunction を定期実行しちゃってた)

今回ご紹介のような方法でツイッターとかに宣伝流すのも面白そうです。

Acknowledge

In brushing up this script, my friend Neil gave me a great tip about using regular expressions. I deeply appreciated his support.