GASスクリプトでトリガー登録する方法!newTriggerによる時間主導やスプレッドシートトリガー

2022年9月14日

Google Apps Script(GAS)のトリガー登録は通常スクリプトエディタのGUIから設定しますが、スクリプトからトリガーを作成することもできます。

そこで、GASのScriptApp.newTriggerメソッドを使った、スクリプトから様々なトリガーを作成する方法を解説します。

GASのトリガー登録はスクリプトで実行可能

Google Apps Script(GAS)はトリガー登録機能が用意されています。

この機能を使うことで、用意したGASスクリプトを、スプレッドシートを編集したタイミングや、1時間に1回など繰り返し定期実行することができます。

トリガー登録は通常、GASのスクリプトエディタのトリガーページから追加します。

実はスクリプトエディタでのGUI設定以外に、GASに用意されたメソッドを利用して、スクリプトからトリガー作成が可能です。

GASトリガー作成するnewTriggerメソッド

Google Apps Script(GAS)のスクリプトからトリガーを作成するには、newTriggerメソッドを使用します。

ScriptApp.newTrigger('トリガー実行したい関数名’)

newTriggerメソッドはScriptAppオブジェクトで実行でき、トリガービルダーが生成されます。

ただ、トリガービルダーを作成しただけでは、トリガーのイベントソースなどの設定がないため、各種トリガー条件のトリガービルダーに変換します。

トリガービルダーに変換後、トリガー条件を設定し、createメソッドを実行することで、GASコードからトリガー作成が可能になります。

GASのトリガービルダーは全5種類

newTriggerメソッドで生成したトリガービルダーで設定できるのは5種類あります。

  1. ClockTriggerBuilder(時間主導のトリガービルダー)
  2. SpreadsheetTriggerBuilder(スプレッドシートのトリガービルダー)
  3. DocumentTriggerBuilder(Googleドキュメントのトリガービルダー)
  4. FormTriggerBuilder(Googleフォームのトリガービルダー)
  5. CalendarTriggerBuilder(カレンダーのトリガービルダー)

この5つのトリガービルダーの中で、最も利用頻度が多いのが、時間主導とスプレッドシートのトリガービルダーです。

そのため、今回、時間主導のトリガービルダーとスプレッドシートのトリガービルダーを中心に、トリガー作成手順を解説します。

時間主導トリガーをコードで作成

今回、triggerTestという関数の時間主導トリガーをScriptApp.newTriggerメソッドを使って作成していきます。

Google Apps Script(GAS)のコードで作成できるトリガーは通常のトリガー7種類いずれも作成できるので、それぞれのトリガー設定するスクリプトを紹介します。

①○分後に実行する1回限りのトリガー

afterメソッドを使うと、実行したタイミングから引数に指定したミリ秒後に実行する時間主導トリガーを作成します。

function setTrigger(){
  //新しいトリガーを設定する(2分後に実行)
  //ScriptApp.newTrigger('test').timeBased().after(2 * 60 * 1000).create();
}

引数は分や時間、秒ではなく、ミリ秒である点が注意点です。

サンプルコードのように2分後に実行したい場合は、2 * 60(秒) * 1000(ミリ秒)とミリ秒に変換する必要があります。

afterメソッドで作成したトリガーは繰り返し実行ではないため、一度実行されると、ステータスが無効になります。

②特定日時に実行する1回限りのトリガー

続いて特定日時に実行するトリガーはatメソッドを使い、引数にDateオブジェクトを設定してトリガー作成します。

function setTrigger(){
  //Dateオブジェクトで実行時点の日時を取得
  let time = new Date();
  //setHours,setMinutesでトリガー実行時刻を設定(今回は18:30)
  time.setHours(18);
  time.setMinutes(30);
  //newTriggerメソッドでtriggerTestを特定日時でトリガー作成
  ScriptApp.newTrigger('triggerTest').timeBased().at(time).create();
}

実行したいタイミングをsetHoursやsetMinutesで指定して、好きな時刻にtriggerTest関数を実行できます。

なお、特定の日時で実行するトリガーは①のトリガーと同様に、繰り返し実行ではなく一度限りの実行です。

もし、特定時刻でGAS関数を繰り返し実行する方法は以下の記事で解説しています。

③1,5,10,15,30分ごとの定期実行トリガー

分単位で定期実行するトリガーはeveryMinutesメソッドで設定します。

function setTrigger(){
  //10分ごとに繰り返し定期実行するトリガーを作成
  ScriptApp.newTrigger('triggerTest').timeBased().everyMinutes(10).create();
}

引数に設定できるのは、スクリプトエディタで設定可能な分ベースのタイマーと同じ、1分、5分、10分、15分、30分の5パターンです。

上記の数字以外を引数に指定すると、GASスクリプト実行時にエラーします。

④1,2,4,6,8,12時間ごとの定期実行トリガー

時間単位で定期実行するトリガーはeveryHoursメソッドで設定します。

function setTrigger(){
  //4時間ごとに繰り返し定期実行するトリガー作成
  ScriptApp.newTrigger('triggerTest').timeBased().everyHours(4).create();
}

分ベース同様に引数に設定できる数値が決まっており、スクリプトエディタの時間ベースのタイマー設定値である、1時間、2時間、4時間、6時間、8時間、12時間の6パターンです。

⑤日次の定期実行トリガー

毎日決まった時間帯に実行する定期実行トリガーはGASのeveryDaysメソッドとatHourメソッドを実行します。

function setTrigger(){
  //毎日20~21時に繰り返し定期実行するトリガーを作成
  ScriptApp.newTrigger('triggerTest').timeBased().everyDays(1).atHour(20).create();
}

everyDaysメソッドの引数は本来「n日ごと」の数字をセットしますが、何を入れても毎日の設定になります。

ただ、引数を省略するとエラーしてしまうので、分かりやすいように毎日=1日ごとの1を入れるのがオススメです。

atHourメソッドでどの時間帯に実行するか設定しますが、省略した場合、実行時間帯は午前0時~1時になります。

⑥週次の定期実行トリガー

毎週○曜など週次の定期実行トリガーはGASのonWeekDayメソッドです。

function setTrigger(){
  //毎週日曜の午前4~5時に繰り返し定期実行するトリガーを作成
  ScriptApp.newTrigger('triggerTest').timeBased().onWeekDay(ScriptApp.WeekDay.SUNDAY).atHour(4).create();
}

引数に指定するのはScriptApp.WeekDayのプロパティで用意されている曜日の定数です。

単なる文字列として「MONDAY」や「FRIDAY」など設定しても実行エラーになります。

日次の場合と同様に実行したい時間帯をatHourメソッドでセットします。

⑦月次の定期実行トリガー

時間主導トリガーの最後はonMonthDayメソッドによる月次の定期実行です。

function setTrigger(){
  //毎月5日の12-13時に繰り返し定期実行するトリガーを作成
  ScriptApp.newTrigger('triggerTest').timeBased().onMonthDay(5).atHour(12).create();
}

毎月何日に実行するかを引数に設定し、日次・週次と同じようにatHourメソッドで実行時間帯を設定します。

スプレッドシートトリガーをコードで作成

時間主導のトリガービルダー以外に利用頻度が高いのが、スプレッドシートトリガーです。

スプレッドシートトリガーでは、ScriptApp.newTriggerメソッドに対し、forSpreadsheetメソッドを実行することで生成できます。

スプレッドシートトリガーで設定できるのは、主にスプレッドシートを編集時(onEdit)・変更時(onChange)・起動時(onOpen)の3パターンです。

function setTrigger(){
  //トリガー設定したいスプレッドシートを読み込む
  const ss = SpreadsheetApp.openById('トリガー設定したいスプレッドシートID');
  //スプレッドシートを編集した時のトリガー設定
  ScriptApp.newTrigger('triggerTest').forSpreadsheet(ss).onEdit().create();
  //スプレッドシートを変更した時のトリガー設定
  ScriptApp.newTrigger('triggerTest').forSpreadsheet(ss).onChange().create();
  //スプレッドシートを起動した時のトリガー設定
  ScriptApp.newTrigger('triggerTest').forSpreadsheet(ss).onOpen().create();
}

※他にフォームデータ送信時の「onFormSubmit」があります。

スプレッドシート編集時にトリガー実行したい場合は、newTrigger→forSpreadsheet→onEdit→createの順番で記述します。

順番を変更するとトリガー作成の処理が実行エラーしてしまいます。

コンテナバインド型でなくてもスプレッドシートトリガー設定可能

なお、前述のスプレッドシートトリガーのサンプルコードでは、newTriggerの引数にSpreadsheetApp.openByIdで読み込んだスプレッドシートを設定しています。

通常のGoogle Apps Script(GAS)のスクリプトエディタでスプレッドシートトリガーを設定する場合、スプレッドシートに紐づくコンテナバインドスクリプトである必要があります。

しかし、 ScriptApp.newTriggerメソッドの場合、コンテナバインドではないスタンドアロンなGASでスプレッドシートを読み込んでトリガー設定できます。

トリガー実行する関数の引数にトリガーイベントを格納する変数eを設定しておけば、編集されたセルがどこかなども取得できます。

createメソッドを末尾に忘れずに

Google Apps Script(GAS)のScriptApp.newTriggerメソッドによるトリガー登録を紹介してきましたが、必ずcreateメソッドをつけています。

このcreateメソッドを実行することで、それまで条件設定したトリガーを有効化して、トリガー一覧に追加できます。

createメソッドをつけ忘れると、トリガー作成が完了せずに、トリガー画面に表示されません。

そのため、GASのスクリプトからトリガー作成する場合は、必ずScriptApp.newTriggerの最後にcreateメソッドを付与しましょう。

なお、createメソッドはトリガー条件のメソッド(timeBasedやeveryday)の後ろにつけないといけません。

ScriptApp.newTrigger('トリガー登録したい関数名’)の直後にcreateメソッドを実行してもエラーになります。

エディタでのトリガー登録が難しい場合に

ScriptApp.newTriggerメソッドを使ったトリガー作成は、通常利用する機会はありません。

Google Apps Script(GAS)のスクリプトエディタに用意されたトリガー設定画面から登録できるからです。

しかし、スクリプトエディタを使ったトリガー設定では実現が難しいケースもあります。

  1. 日次・週次といった頻度で特定時刻に繰り返して定期実行したい場合
  2. 深夜などの特定の時間帯に、データ取得など不定な回数を繰り返し実行したい場合

こうしたケースにおいては、newTriggerメソッドを使ったスクリプトによるトリガー作成が有効です。

そのため、まず通常のGUIによるトリガー登録で実現可能か検討し、難しければスクリプトによるトリガー作成を行うようにしましょう。

まとめ・終わりに

今回、Google Apps Script(GAS)で通常スクリプトエディタから設定するトリガー設定をコードから実行する方法を紹介しました。

ScriptApp.newTriggerメソッドを使い、設定したいトリガービルダーを生成することで時間主導のスケジュール実行やスプレッドシートの操作時のトリガー実行が可能です。

GASスクリプトエディタからGUI設定してトリガー登録するのが基本ですが、複雑な実行制御をしたい場合にはコードからトリガー作成したいケースがあります。

そうした場合には、今回紹介した形で、各種時間主導のトリガーやスプレッドシートトリガーを設定しましょう。

なお、実行時にはcreateメソッドを忘れるとトリガー作成が完了しないので、忘れないようにしてください。