【GAS GoogleAppsScript | トリガー】自動的にプログラムを実行するトリガー(その2)

スポンサーリンク

自動的にプログラムを実行するトリガー

トリガー

トリガーとは、GASで作ったプログラムを、何らかのきっかけ(スプレッドシートを開いた時ちとか、編集した時とか)で自動的に実行させる機能のことです。

前回、その1ではスクリプトエディターからトリガーを設定する(インストーラブルトリガー)方法について紹介しました。

今回、その2として、GASのスクリプトでトリガーを設定する方法(シンプルトリガー)を紹介したいと思います。

GASのスクリプトでトリガーを設定することによって、入力された値や条件によってトリガーを変更するなど、プログラムの動きによって柔軟なトリガー設定をすることが出来るようになります!

GASのスクリプトでトリガーを設定する方法

GASのスクリプトでトリガーを設定するには、ScriptサービスのScriptAppクラスのnewTriggerメソッドを使います。

構文

ScriptApp.newTrigger(実行したい関数名)

返り値は、TriggerBuilderオブジェクトになります。

スプレッドシートに紐づく動作をきっかけにするトリガーの設定

スプレッドシートの動作に紐づくトリガーを設定するには、TriggerBuilderクラスforSpreadsheetメソッドを使います。(DocumentsやFormには同じように別のメソッドがあります。)

構文

forSpreadsheet(sheetオブジェクト or スプレッドシートID)

引数には、SpreadsheetオブジェクトかSpreadsheetIDを指定します。

返り値は、SpreadsheetTriggerBuilderオブジェクトとなります。このクラスに様々なきっかけを検知するメソッドがあります。

SpreadsheetTriggerBuilderクラスのメソッド一覧
関数名 説明
create() Triggerを作成する
onChange() 構造変更や内容変更が発生したときに発動するトリガー
onEdit() 編集時に毎回発動するトリガー
onFormSubmit() スプレッドシート側から作成したフォーム上でデータが送信されたときに発動するトリガー
onOpen() スプレッドシートが起動したときに発動するトリガー

onChangeメソッド

function createTrigger() {

  // spreadsheetId = "***SpreadsheetID***";

  // トリガーを作る
 ScriptApp.newTrigger("TriggerFunction")
      .forSpreadsheet(spreadsheetId )
      .onChange()  //変更時
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

onEditメソッド

function createTrigger() {

  // spreadsheetId = "***SpreadsheetID***";

  // トリガーを作る
 ScriptApp.newTrigger("TriggerFunction")
      .forSpreadsheet(spreadsheetId )
      .onEdit()  //編集時
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

onFormSubmitメソッド

function createTrigger() {

  // spreadsheetId = "***SpreadsheetID***";

  // トリガーを作る
 ScriptApp.newTrigger("TriggerFunction")
      .forSpreadsheet(spreadsheetId )
      .onFormSubmit()  //フォーム送信時
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

onOpenメソッド

function createTrigger() {

  // spreadsheetId = "***SpreadsheetID***";

  // トリガーを作る
 ScriptApp.newTrigger("TriggerFunction")
      .forSpreadsheet(spreadsheetId )
      .onOpen()  //スプレッドシートを開いた時
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

時限作動式のトリガーを設定する

スプレッドシートやドキュメントなどに関わらず、時間になったらや、一定間隔ごとにスクリプトを起動させたい場合は、TriggerBuilderクラスtimeBasedメソッドを使います。

構文

TriggerBuilderオブジェクト.timeBased()

返り値は、ClockTriggerBuilderオブジェクトになります。このオブジェクトに時限作動させるためのトリガー設定のメソッドがあります。

ClockTriggerBuilderクラスのメソッド
関数名 説明
create() トリガーを作成する。
after(durationMilliseconds) トリガー設定後、durationMilliseconds(ミリ秒)経つと発動するトリガー
at(date) dateで設定した日付に発動するトリガー
atDate(year, month, day) トリガーが指定された日付に起動することを指定します。デフォルトでは深夜(+/- 15分)近くです。
atHour(hour) トリガーが実行されるトリガーの時間を指定します。
everyDays(n) トリガーを毎日実行するように指定しますn。
everyHours(n) n時間ごとにトリガーを実行するように指定します。
everyMinutes(n) トリガーを毎n分実行するように指定します。
everyWeeks(n) 毎週トリガーを実行するように指定しますn。
inTimezone(timezone) トリガーが実行される指定された日付/時刻のタイムゾーンを指定します。
nearMinute(minute) トリガーが実行される分を指定します(プラスマイナス15分)。
onMonthDay(day) トリガーが実行される月の日付を指定します。
onWeekDay(day) トリガーが実行される曜日を指定します。

afterメソッド

ClockTriggerBuilderオブジェクト.after(durationMilliseconds)

引数:durationMillisecondsは、ミリ秒で設定します。

function createTrigger() {

  // トリガーを作る(10分後に発動する)
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .after(10 * 60 * 1000) //10分後(ミリ秒で設定)
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

atメソッド

ClockTriggerBuilderオブジェクト.at(date)

引数:dateはdateオブジェクトで指定

function createTrigger() {

  // トリガーを作る(2020年10月11日に設定)
 var date = new Date(2020, 10, 11); //dateオブジェクト生成
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .at(date) //2020年10月11日に設定
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

atDateメソッド

ClockTriggerBuilderオブジェクト.atDate(year, month, day)

引数:year,month,dayは、数字で設定します。

function createTrigger() {

  // トリガーを作る(2020年10月11日に設定)
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .atDate(2020, 10, 11) //2020年10月11日に設定
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

atHourメソッド

ClockTriggerBuilderオブジェクト.atHour(hour)

引数:引数には0~23の数字で時間を設定します。

※everyDaysメソッドなど他のメソッドと組み合わせて使います。スクリプトエディターで設定する時の項目と同じ組み合わせが必要です。

function createTrigger() {

  // トリガーを作る(3日置きの23時~24時に発動)
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .atHour(23) //23時に設定
      .everyDays(3) //3日置きに発動
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

everyDaysメソッド

ClockTriggerBuilderオブジェクト.everyDays(n)

引数:nは数字を設定、n日置きに発動します。

function createTrigger() {

  // トリガーを作る(3日置きに発動)
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .everyDays(3) //3日置きに設定
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

everyHoursメソッド

ClockTriggerBuilderオブジェクト.everyHours(n)

引数:nは数字を設定、n時間置きに発動します。

function createTrigger() {

  // トリガーを作る(2時間置きに発動)
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .everyHours(2) //2時間置きに設定
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

everyMinutesメソッド

ClockTriggerBuilderオブジェクト.everyMinutes(n)

引数:nは数字を設定、n分置きに発動します。

function createTrigger() {

  // トリガーを作る(25分置きに発動)
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .everyMinutes(25) //25分置きに設定
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

everyWeeksメソッド

ClockTriggerBuilderオブジェクト.everyWeeks(n)

引数:nは数字を設定、n週置きに発動します。

onWeekDayメソッドの指定も必要です。

function createTrigger() {

  // トリガーを作る(3週置きに発動)
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .everyWeeks(3) //3週置きに設定
      .onWeekDay(ScriptApp.WeekDay.FRIDAY) //金曜日に設定
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

inTimezoneメソッド

ClockTriggerBuilderオブジェクト.inTimezone(timezone)

引数:timezoneは文字列で指定

function createTrigger() {

  // トリガーを作る(タイムゾーンも指定する)
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .atDate(2020, 10, 11) //2020年10月11日に設定
   .inTimezone("America/Los_Angeles") //タイムゾーン設定
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

nearMinuteメソッド

ClockTriggerBuilderオブジェクト.nearMinute(minute)

引数:minuteは0~59までの数字で設定

function createTrigger() {

  // トリガーを作る(5日置きの5時30分くらいに発動)
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .atHour(3)
      .nearMinute(30)
      .everyDays(5)
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

onMonthDayメソッド

ClockTriggerBuilderオブジェクト.onMonthDay(day)

引数:毎月dayの日に発動する

function createTrigger() {

  // トリガーを作る(毎月5日に発動)
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .onMonthDay(5) //毎月5日に設定
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

onWeekDayメソッド

ClockTriggerBuilderオブジェクト.onWeekDay(day)

引数:dayは次のように曜日を設定

  • 月・・・ScriptApp.WeekDay.MONDAY
  • 火・・・ScriptApp.WeekDay.TUESDAY
  • 水・・・ScriptApp.WeekDay.WEDNESDAY
  • 木・・・ScriptApp.WeekDay.THURSDAY
  • 金・・・ScriptApp.WeekDay.FRIDAY
  • 土・・・ScriptApp.WeekDay.SATURDAY
  • 日・・・ScriptApp.WeekDay.SUNDAY
function createTrigger() {

  // トリガーを作る(毎週金曜日に発動)
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .onWeekDay(ScriptApp.WeekDay.FRIDAY) //毎週金曜日に設定
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}

トリガーを削除する方法

スクリプトでトリガーを設定すると、どんどんどんどん溜まっていってしまう可能もあります。

必要無くなったトリガーはきちんと後始末出来るように、トリガーを削除する方法もきちんと確認しておきましょう!

GASのスクリプトでトリガーを設定するには、ScriptサービスのScriptAppクラスのgetProjectTriggersメソッドで削除したいトリガーを取得して、同じくScriptAppクラスのdeleteTriggerメソッドで削除します!

まずは、トリガーを取得する方法からです。

次のコードで予めトリガーが設定されているとします。

function createTrigger() {

  // トリガーを作る(毎週金曜日に発動)
 ScriptApp.newTrigger("TriggerFunction")
      .timeBased()
      .onWeekDay(ScriptApp.WeekDay.FRIDAY) //毎週金曜日に設定
      .create();
}

function TriggerFunction(){
  Logger.log("トリガー起動したよ")
}
  1. プロジェクトの全てのトリガーを取得する
  2. 消したいトリガーを取り出す
  3. トリガーを消す

の流れです。

1.プロジェクトの全てのトリガーを取得する

構文

ScriptApp.getProjectTriggers()

これで、プロジェクトに設定されている全てのトリガーが取得出来ます。

変数にぶち込んどきましょう。

function getTrigger() {
  // 全てのトリガーを取得する
  var triggers = ScriptApp.getProjectTriggers();
  
}

2.消したいトリガーを取り出す→3.トリガーを消す

見つけて消すところまで一気に行きます。

function getTrigger() {
  // 全てのトリガーを取得する
  var triggers = ScriptApp.getProjectTriggers();

  // forでトリガーの起動スクリプトの名前を探す
  for(var trigger of triggers){
    if(trigger.getHandlerFunction() == "getTrigger"){
   // 見つかったら消す
      ScriptApp.deleteTrigger(trigger);
    }
  } 
}

for文で、取得したトリガーを一つずつ確認します。TriggerクラスのgetHandlerFunctionメソッドを使うことで、そのTriggerに設定されている実行関数の名前を取得出来ますので、それを元に消したいトリガーを特定します。

特定出来たら、ScriptAppクラスのdeleteTriggerメソッドで削除します。

構文

ScriptApp.deleteTrigger(trigger)

引数に、消したいトリガーオブジェクトを指定します。

まとめ

GASのコードでトリガーを設定する方法を紹介しました!