GASのトリガーによるプログラムの自動実行 #2

GAS のトリガー

株式会社リュディアです。Google Apps Script ( 以下 GAS ) には、特定の日時を指定して GASの function を自動実行するトリガー ( Trigger ) があります。今回も GASのトリガーによるプログラムの自動実行#1 に引き続き GAS のトリガーについてまとめたいと思います。GAS のトリガーは大きく 1) GUI で設定する方法、2) スクリプトで設定する方法、の2つに分類できます。今回は 2) スクリプトで設定する方法、についてまとめてみます。

スクリプトを使ったトリガー の設定

今回の題材の説明から始めます。3つの GAS function をトリガーで自動実行してみます。
[A] : 毎日 12:01 に function triggerTest1 を自動実行
[B] : 毎日 12:25 に function triggerTest2 を自動実行
[C] : 毎日 12:55 に function triggerTest3 を自動実行

まず A, B, C をそれぞれ所定の時間に実行するためのスクリプト setTrigger() を以下に示します。実行させたい時分を設定した Date オブジェクトを生成し、ScriptApp.newTrigger( '関数名' ).timeBased( ).at( Dateオブジェクト ).create ( ) でトリガーを生成します。

function setTrigger() {
 const targetDate = new Date() ;

 // triggerTest1 を 12:01に実行するトリガーを設定
 targetDate.setHours( 12 ) ;
 targetDate.setMinutes( 1 ) ;
 ScriptApp.newTrigger( 'triggerTest1' ).timeBased().at( targetDate ).create() ;

 // triggerTest2 を 12:25に実行するトリガーを設定
 targetDate.setHours( 12 ) ;
 targetDate.setMinutes( 25 ) ;
 ScriptApp.newTrigger( 'triggerTest2' ).timeBased().at( targetDate ).create() ;

 // triggerTest1 を 12:55に実行するトリガーを設定
 targetDate.setHours( 12 ) ;
 targetDate.setMinutes( 55 ) ;
 ScriptApp.newTrigger( 'triggerTest3' ).timeBased().at( targetDate ).create() ;
}

この setTrigger( ) を呼べば 3つのトリガーが設定できることはわかりましたが、この setTrigger( ) をどのように動かすのでしょうか?これは #1 でまとめた GUI でのトリガー設定により、setTrigger( ) を1日に1度、ここでは午前7時にトリガーを設定します。全体の動作は以下の図のように2段階のトリガー設定になります。

2段階トリガー

ここで毎日1度、setTrigger( ) を呼び出す度に3つのトリガーが新規で追加されていくことに気づきましたか?このままだと延々とトリガー設定が増えていきますね。そこで setTrigger( ) を呼んだときに昨日の実行に使った古いトリガーを消去する手続きを追加してみます。関数 deleteTrigger( ) を追加し、setTrigger( ) の冒頭で呼び出しています。これにより昨日までの古いトリガは消去されるようになりました。

// 古いトリガーを消去するための関数

function deleteTrigger(targetHandlerFunction) {
 const triggers = ScriptApp.getProjectTriggers() ; // 現在のプロジェクトで設定済みのすべてのトリガーを取得
 for ( const trigger of triggers ) {               // 各トリガーについてループ

   // トリガーに設定されている関数と targetHandlerFunction が一致する場合にトリガーを削除
   if ( trigger.getHandlerFunction() === targetHandlerFunction ) {
     ScriptApp.deleteTrigger( trigger ) ;
   }
 }
}

// 毎日トリガーを設定するための関数
// この関数と GUI ベースのトリガー設定で1日に一回設定する

function setTrigger() {
 const targetDate = new Date() ;

 // 毎日トリガーが追加されないよう、古いトリガーを削除
 deleteTrigger( 'triggerTest1' ) ;
 deleteTrigger( 'triggerTest2' ) ;
 deleteTrigger( 'triggerTest3' ) ;

 // triggerTest1 を 12:01に実行するトリガーを設定
 targetDate.setHours( 12 ) ;
 targetDate.setMinutes( 1 ) ;
 ScriptApp.newTrigger( 'triggerTest1' ).timeBased().at( targetDate ).create() ;

 // triggerTest2 を 12:25に実行するトリガーを設定
 targetDate.setHours( 12 ) ;
 targetDate.setMinutes( 25 ) ;
 ScriptApp.newTrigger( 'triggerTest2' ).timeBased().at( targetDate ).create() ;

 // triggerTest1 を 12:55に実行するトリガーを設定
 targetDate.setHours( 12 ) ;
 targetDate.setMinutes( 55 ) ;
 ScriptApp.newTrigger( 'triggerTest3' ).timeBased().at( targetDate ).create() ;
}

deleteTrigger( ) では、消去対象となるトリガーを確認するためトリガー対象となる関数名での比較も行っています。

いかがでしたか?スクリプトで設定する方法の方がより細やかな設定が可能になります。しかし分単位で指定しているとはいえ、GASの仕様としては ±15分の誤差を含むとあります。これはシステムの仕様になるので仕方ないです。システム全体でトリガーが1つの場合は GUI による設定でも問題ないと思いますが、複数個のトリガーが必要な場合はスクリプトタイプの方が明確でよいと思います。皆さんもいろいろと試してみてください。

では、ごきげんよう。

この記事が気に入ったらサポートをしてみませんか?