GASで特定時刻を時間指定して繰り返し定期実行するトリガー登録方法!

2022年9月13日

Google Apps Script(GAS)トリガー登録による繰り返し実行は1時間単位の指定のため、「何時何分に実行」といった設定はできません。

ただ、毎日○時■分といった指定日時にGASを繰り返し実行したいケースがあります。

そこで、GASスクリプトによる特定時刻を時間指定して、繰り返しトリガー実行する方法を解説します。

GASはトリガー登録で繰り返し実行可能

Google Apps Script(GAS)はトリガー登録機能があり、スクリプトを繰り返しスケジュール実行することができます。

GASスクリプトで記述した処理は、スクリプトエディタのトリガー設定画面から、実行したいタイミングで登録できます。

用意したスクリプトをサーバレス環境で繰り返し自動実行できるのがGASの便利なところです。

日次・週次・月次は1時間単位の指定

Google Apps Script(GAS)のトリガー実行では、10分に1回や1時間に1回といった頻度に加え、日次・週次・月次といった指定が可能です。

  1. 日次:毎日7~8時
  2. 週次:毎週■曜7~8時
  3. 月次:毎月◇日7~8時

日次、週次、月次の設定を行う際には、どの時間帯に実行するかも設定しますが、1時間単位での指定になります。

設定した時間帯が6~7時なら、6:00~6:59のどこかでGASスクリプトがトリガー実行されます。

そのため、日次~月次といったトリガー設定では、6:30ピッタリに実行する設定ができません。

特定日時指定のトリガーは繰り返し実行不可

なお、Google Apps Script(GAS)には、時間ベースのトリガーに特定日時を指定できるトリガー設定も用意されています。

トリガー追加画面でイベントソースを「時間手動型」に設定したあと、「時間ベースのトリガーのタイプを選択」の中から「特定の日時」を選択します。

すると、YYYY-MM-DD HH:MM形式で時間を入力して保存ボタンすると特定の日時を指定したトリガー登録ができます。

この特定の日時のトリガー設定を行うと、秒単位では指定できないものの、何時何分といった分単位まで指定可能です。

ただし、GASの特定日時を指定するトリガー登録は繰り返し実行には対応していません。

1回実行されると、下記のスクリーンショットのように無効と表示されます。

そのため、日次・週次・月次で実行する場合は再度特定日時をセットしたトリガーを設定する必要があります。

「何時何分」と特定時刻で繰り返し実行したい

時間指定が1時間単位であれば、通常のトリガー設定で日次や週次を設定して繰り返し実行は問題ありません。

しかし、他の処理との都合だったり、「毎日何時何分に実行したい」というニーズがあるケースもあります。

このような特定日時を指定して繰り返しGoogle Apps Script(GAS)のスクリプトを実行したい場合に、対処方法があります。

それは、GASのスクリプトによってトリガー実行を制御することです。

例えば、毎日午後23時59分ピッタリにGASスクリプトを繰り返し実行したい場合は、以下の3Stepで実現できます。

  1. 23:59に実行するトリガー登録をするスクリプトを毎日午前0~1時に実行
  2. 23:59になったら処理したいスクリプトが実行
  3. 処理スクリプトが終了後、設定したトリガーを削除

3番目の処理はなくても大丈夫ですが、無効のトリガーがどんどんGASのトリガー画面に残ってしまうので、実行済みのトリガーは削除するのがオススメです。

※実行数のメニューから過去に実行したGASスクリプトの実行結果は確認可能

上記を応用することで、毎日以外にも毎週・毎月の好きなタイミングで繰り返し実行できます。

指定時刻で繰り返し実行するGASサンプルコード

実際に何時何分と指定した特定時刻で繰り返しトリガー登録して実行するGoogle Apps Script(GAS)のサンプルコードを解説します。

function triggerTest() {
  console.log('トリガーのテストです');
  //GASプロジェクトに設定したトリガーをすべて取得
  const triggers = ScriptApp.getProjectTriggers();
  //トリガー登録のforループを実行
  for(let i=0;i<triggers.length;i++){
    //取得したトリガーの関数がtriggerTestの場合、deleteTriggerで削除
    if(triggers[i].getHandlerFunction()==='triggerTest'){
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}
function setTrigger(){
  //Dateオブジェクトで実行した時間を取得
  let time = new Date();
  //setHours,setMinutesでトリガー登録したい時間を設定
  time.setHours(23);
  time.setMinutes(59);
  //newTriggerメソッドでtriggerTestを特定日時でトリガー登録
  ScriptApp.newTrigger('triggerTest').timeBased().at(time).create();
}

トリガー登録で実行される関数が「triggerTest」で、スクリプトからtriggerTestのトリガー登録を行うのが「setTrigger」です。

setTriggerでは、実行タイミングでの時間を取得し、トリガー登録する何時・何分を設定します(今回は23:59)。

最後にScriptApp.newTriggerメソッドでtriggerTestを引数にし、トリガー実行タイミングをat内に引数指定することでトリガーが作成されます。

実際に実行されるtriggerTestでは、実行後にトリガーが削除されるように、deleteTriggerを実行しています。

なお、実行時に他の関数のトリガーは削除されないよう、if文でtriggerTestに合致するか判定しています。

※GASのトリガーをスクリプトから削除する方法の詳細は以下の解説記事を参照ください。

setTrigger関数が実行されると、triggerTestが23:59と指定した日時でトリガー登録されます。

このsetTriggerを実行したい日次・週次・月次のタイミングで、設定しておけば、繰り返し特定の日時でGASが実行可能になります。

まとめ・終わりに

今回、Google Apps Script(GAS)で何時何分といった指定した時刻に繰り返しスクリプトを実行する方法を紹介しました。

GASのスクリプトエディタのトリガー設定では日次・週次・月次といった繰り返し実行が可能ですが、1時間単位での指定しかできません。

特定の日時を指定するトリガー登録もありますが、こちらは繰り返し実行ができない仕様となっています。

そこで、スクリプトでトリガー作成を制御することで、繰り返したいタイミングで特定の日時のトリガーを作成して、特定時刻で繰り返しGASが実行できるようになります。

何時何分といったタイミングを制御して繰り返しトリガー実行したい場合に、解説したサンプルコードのようにトリガー制御を行いましょう。