GAS時限式タイマーで毎日決まった時刻にスクリプト実行

GAS業務効率

せっかく書いたスクリプトを1時間ごと、毎日、週1回、月1回など決まった時間自動で実行しておいてほしい場合には、トリガーを設定する必要があります。今回、「日タイマー」で毎日決まった時刻にスクリプトを実行させてみましょう。

トリガーを作ろう

Google Apps Scriptには、トリガーという機能があります。トリガーとは、「引き金」の意味で、何かきっかけになる出来事が起こったら自動的に特定の処理を起動する仕組みのことを意味します。

左側のメニューから「目覚まし時計」のマークにマウスを合わせるとトリガーが出現するので、選択してください。

トリガーを追加

画面下部の「トリガーを追加」を押します。

トリガーの内容を設定する

トリガーを追加を押すと、次のモーダルが表示されます。

  1. 実行する関数:自身で作成した関数名が表示されます(事前に作成しておく必要あり)
  2. 実行するデプロイを選択:HEADのままでOKです。HEADとは、今現在のスクリプトコードを実行する選択支です。
  3. イベントのソースを選択:「時間手動型」を選択します。
  4. 時間ベースのトリガータイプ:今回は毎日なので「日付ベースのタイマー」を選択します。
  5. 時間:実行したい任意の時間を設定し、保存してください。

トリガー設定完了

トリガーが追加されると、次のように一覧に表示されます。これで、ファイルを閉じて待つだけです。

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

スクリプトコードでトリガーまで設定する方法もあります。例えば、下記のsetTriggerスクリプトは毎日23:59になると「AFCReport」という名前の関数を実行するスクリプトです。

function setTrigger(){
  // 今日の日付を取得
  const next = new Date();

  // 翌日に変換
  next.setDate(next.getDate() + 1);

  // 23時59分00秒に時刻を設定
  next.setHours(23);
  next.setMinutes(59);
  next.setSeconds(0);
    
  // AFCReportという関数を9時に実行するトリガーを作成
  ScriptApp.newTrigger('AFCReport').timeBased().at(next).create();
}

このsetTriggerスクリプトを実行すると、下記のようと同様のトリガーが設定されるわけですが、

「毎日」ではなく「特定の日時」になってしまっているのがお判りでしょうか?これを毎日実行させるには、実行処理の最後に「自分自身を呼び出す時間指定トリガーをセット」のがポイントです。

function AFCReport(){
 省略
 setTrigger();
}

1度でもsetTrigger()を実行すれば、setTrigger実行 → 翌日にAFCReportが実行 → setTrigger実行→ 翌々日にAFCReportが実行と1日おきに無限プールを繰り返していきます。

実行するスクリプトの指定

実行するスクリプトを指定する為には、ScriptAppクラスのnewTriggerメソッドを使用します。

ScriptApp.newTrigger('実行する関数名')

メニューから設定する場合は下記の部分になります。

なお、newTriggerメソッドの戻り値はTriggerBuilderオブジェクトとなります。

トリガーのイベントを指定

トリガーのイベントを指定するには、TriggerBuilderクラのメソッドを使用します。

TriggerBuilderオブジェクト.timeBased()

今回は「時間主導型」のイベントを設定するのでtimeBasedメソッドを使用します。メニューから設定する場合は下記の部分になります。

TriggerBuilderクラスにはこの他に、forSpreadsheetメソッドやforDocumentメソッドがあり、GoogleスプレッドシートやGoogleドキュメントを起点にすることもできます。なお、timeBasedメソッドの戻り値はClockTriggerBuilderクラスとなります。

イベントの時間を設定

イベントの時間を設定するにはClockTriggerBuilderクラスのメソッドを使用します。

ClockTriggerBuilderオブジェクト.at(指定日時)

今回は「特定の日時」を設定するので、atメソッドを使用します。メニューから設定する場合は下記の部分になります。

ClockTriggerBuilderクラスにも様々なメソッドがあり、色々な条件で時間を設定できます。一定時間後の時刻を設定する場合はafterメソッドを使用します。単位はミリ秒となっているので、10分後を指定する場合はafter(10×60×1000)となります。

トリガーの生成

最後にトリガーの生成にはcreateメソッドを使用します。

ClockTriggerBuilderオブジェクト.create()

使い終わったトリガーは削除する

トリガーは無限にセットすることができます。プログラムで作成するとどんどん増えてしまいます。

追加と同様に、トリガーの削除もプログラムから可能です。

ScriptApp.deleteTrigger(”削除したいトリガー名");

削除したいトリガーの名前を引数として渡すことで、削除してくれます。全部、まとめて削除したいときは次のようになります。

var triggers = ScriptApp.getProjectTriggers();
for(var i=0; i < triggers.length; i++) {
 ScriptApp.deleteTrigger(triggers[i]);
}

ScriptApp.getProjectTriggers() で全てのトリガーを変数に代入して、for文で1つずつ削除するという流れです。
なお、for文の基本は下記の通りです。

for (  初期値;  条件式;  増減値  ) {
 
  // 繰り返す処理を書く
 
}

GASの制限に注意

Google Apps Scriptには制限は、「実行時間制限」「実行回数制限」「トリガー数の制限」の制限があります。

実行時間の制限

1回の実行で6分までとなっています。スクリプトが途中で止まってしまう場合は、まずこの制限を疑いましょう。

無料アカウントG SuiteEarly Access
スクリプト実行時間6分/実行6分/実行30分/実行
カスタム関数実行処理30秒/実行30秒/実行30秒/実行
参考:Googleサービスの割り当て|Google Developers

実行回数の制限

機能ごとに、1日および同時実行数に制限が設けられています。

無料アカウントG SuiteEarly Access
カレンダーイベント作成数5,000/日10,000/日Flexible
コンタクト作成数1,000/日2,000/日Flexible
ドキュメント作成数250/日1,500/日Flexible
メール受信者数100/日1,500/日1,500/日
メールの読み書き(送信除く)20,000/日50,000/日Flexible
グループの取得2,000/日10,000/日Flexible
JDBC 接続10,000/日50,000/日Flexible
JDBC 接続の失敗100/日500/日500/日
プレゼンテーションの作成数250/日1,500/日Flexible
プロパティの読み書き50,000/日500,000/日Flexible
スプレッドシートの作成数250/日3,200/日Flexible
トリガーによる総実行数90分/日6時間/日6時間/日
URL Fetch コール数20,000/日100,000/日Flexible
同時実行数303060
参考:Googleサービスの割り当て|Google Developers

トリガー数の制限

1スクリプトにつき1ユーザーが20トリガーまでという制限が設けられています。

無料アカウントG SuiteEarly Access
トリガー20/ユーザー/スクリプト20/ユーザー/スクリプト20/ユーザー/スクリプト
参考:Googleサービスの割り当て|Google Developers
タイトルとURLをコピーしました