Google Apps Script で毎日決まった時刻にスクリプトを実行するトリガー設定


時計

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

以前の記事にGoogleカレンダーから当日の予定を取得してチャットワークに送る方法があります。

毎朝、当日の予定をGoogleカレンダーから取得してチャットワークに送る
Google Apps Scriptを使ってチャットワークに色々と送ることができます。Googleカレンダーから当日の予定を取得してチャットワークに送る方法についてお伝えしたいと思います。

その日の予定が確認できて便利ですが、より正確な時刻に動作させたい場面が出てきます。

というわけで、今回はGoogle Apps Scriptで毎日決まった時刻にスクリプトを実行するトリガー設定についてお伝えします。

では、行ってみましょう!

スポンサーリンク

時間主導型のトリガーは毎日特定の日時に設定できない

Google Apps Scriptには、トリガーという機能があります。

メニューの「編集」→「現在のプロジェクトのトリガー」で設定できます。

現在のプロジェクトのトリガーメニュー

また、ツールバーの「時計マークのアイコン」からでもOKです。

現在のプロジェクトのトリガーアイコン

ただ、ここから設定する時間主導型のトリガーには時間の幅があります。

例えば、「日タイマー」では1時間の幅があります。

時間を細かく設定するには「特定の日時」を使用する必要がありますが、これは毎日実行するように設定できません。

Scriptサービスで毎日決まった時刻にトリガーを設定する方法

ですが、この問題はGASのScriptサービスを使って、スクリプトを作成することで解決できます。

Scriptサービスの機能を使って、決まった時刻に目的の関数を実行するトリガーを設定する関数setTriggerを用意します。

「現在のプロジェクトのトリガー」で関数setTriggerを「日タイマー」で毎日指定の時間帯に実行するようにします。

すると、関数setTriggerにより設定されたトリガーにより、決まった時刻に目的の関数を実行することができるわけです。

トリガーの実行順序

毎日、トリガーが作成されるので、トリガーを削除する必要がありますが、この解説は次回にしていきますね。

決まった時刻にトリガーを設定するスクリプト

下記のスクリプトは実行した日の23:59に「myFunction」を実行するものです。

実行時間より前の時間を設定するとうまくいかないので、ご注意下さい。

function setTrigger(){

  const time = new Date();
  time.setHours(23);
  time.setMinutes(59);
  ScriptApp.newTrigger('myFunction').timeBased().at(time).create();

}

このスクリプトの実行後に、「現在のプロジェクトのトリガー」を確認すると、下記のようにトリガーが作成されています。

「トリガーの編集」アイコンをクリックして詳細を見てみましょう。

Scriptサービスにより設置されたトリガー

すると、以下のように今日の指定した時刻にトリガーが設定されていることを確認できますね。

トリガーの編集で時刻を確認する

トリガーを設置するスクリプト

実際にトリガーを作成している部分は6行目になります。

ScriptApp.newTrigger('myFunction').timeBased().at(time).create();

Google Apps Scriptでトリガーに関する処理をする場合は、Scriptサービスを使用します。

以降で、それぞれのメソッドについて解説します。

新しいトリガーを作成する

新しいトリガーを作成するには、ScriptAppクラスのnewTriggerメソッドを使用します。

ScriptAppはScriptサービスのトップレベルのオブジェクトですね。

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

これで、新しいトリガーの作成と実行する関数の設定ができます。

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

実際には、newTriggerメソッドだけではトリガーは設置されませんで、TriggerBuilderオブジェクトに対してあれこれ設定を重ねた上で、createメソッドを使うことで、ようやくトリガーが設定されるのです。

トリガーに時間主導型のイベントを設定する

トリガーに時間主導型のイベントを設定するには、TriggerBuilderオブジェクトのtimeBasedメソッドを使用します。

TriggerBuilderオブジェクト.timeBased()

timeBasedメソッドの戻り値はClockTriggerBuilderクラスとなります。

なお、TriggerBuilderオブジェクトのメソッドとしては、この他にforSpreadsheetメソッドやforDocumentメソッドがあり、GoogleスプレッドシートやGoogleドキュメントをトリガーの起点にすることもできます。

時間主導型トリガーの時間を設定

時間主導型トリガーの時間を設定するには、ClockTriggerBuilderオブジェクトのatメソッドを使用します。

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

指定の日時にはDateオブジェクトを指定します。

ClockTriggerBuilderクラスにも様々なメソッドがあり、色々な条件で時間を設定できます。

一定時間後の時刻を設定する場合はafterメソッドを使用します。

作成したトリガーの設置

最終的にトリガーを設置するにはcreateメソッドを使用します。

ClockTriggerBuilderオブジェクト.create()

毎日指定の時刻のDateオブジェクトを作成する

atメソッドにわたすDateオブジェクトを作成するのが、スクリプトの3~5行目です。

まず、new Date()で実行時の日時を取得し、定数timeに代入します。

const time = new Date();

続いて、setHoursメソッドとsetMinutesメソッドで、時と分を設定します。

time.setHours(23);
time.setMinutes(59);

作成したスクリプトsetTriggerを毎日呼び出す

関数setTriggerは実行すると、その実行した日の23:59に「myFunction」を実行するトリガーを作成します。

今回の目的は、毎日決まった時間にトリガーを実行することなので、作成したsetTriggerを毎日実行するためのトリガーを別に設定します。

「このプロジェクトのトリガー」から以下のように設定して保存しましょう。

  • 実行する関数: setTrigger
  • イベントのソース: 時間主導型
  • 時間ベーストリガーのタイプ: 日付ベースのタイマー
  • 時刻を選択: setTriggerの時刻よりも前の時間帯

関数setTriggerのトリガーを設定する

まとめ

Google Apps Script で毎日決まった時間にスクリプトを実行するトリガー設定についてお伝えしました。

  1. 指定の時間に実行するトリガーを設置する関数setTriggerを作成
  2. 関数setTriggerを毎日呼び出すトリガーを設置

というように、2段階のトリガー設定が必要なので少しややこしいかも知れません。

ただ、一度作成すれば、次回からは毎日決まった時間に処理が実行されますので便利ですね!

しかし、毎日作成したトリガーは実行されてもそのまま残りますので、このままでは処理が終わったトリガーが日々増えていくことになります。

そこで、次回は処理の終わったトリガーを削除する方法についてお伝えしていきます。

どうぞお楽しみに!

連載目次:GASのスクリプトからトリガーを操作する方法

GASのトリガーはメニューから設定する以外に、スクリプトからも設置や削除が行えます。本シリーズでは、ScriptAppsサービスを使ったトリガーの操作方法についてお伝えしていきます。
  1. Google Apps Scriptで毎日決まった時刻にスクリプトを実行するトリガー設定
  2. Google Apps Scriptで使用済みのトリガーを削除する方法
  3. Google Apps Scriptで営業日を判定してトリガーを作成する方法

タイトルとURLをコピーしました