見出し画像

【GAS】を自動で実行するタイミングと設定の方法が知りたい!

GoogleAppsScirpt のスクリプト(プログラム)を自動で指定したタイミングで実行させられる、トリガー(Trigger)という仕組みがあります。
トリガーがどの様なものかを説明している記事がありますので、そちらも確認してください。

そのトリガーを設定する際に、実行させたい状況とタイミングの指定できる種類や方法をここでは説明していこうと思います。

トリガーを設定するための構文

設定するには、4つのステップを記載することによりトリガーを設定できるのです。
なお、これらのステップを記載するにあたり、複数のクラスのオブジェクトが関わって来るのですが、そちらにはあまり触れずに説明させてもらいます。

① まず初めに「ScriptApp.newTrigger(実行させたい関数名(文字列))」にて、実行させたい関数名を指定して、トリガー作成の初期化の様なことをします。
② 「実行のタイプ」とは、先ほどの「どのようなトリガーが設定できるのか」にあるように、どのアプリ(スプレッドシート、ドキュメントなど)の挙動に応じて発動するのか、または時間主導での発動にするのかを設定します。
設定できるタイプを挙げます。
・スプレッドシート(.forSpreadsheet(スプレッドシートのオブジェクトか ID)
・ドキュメント(.forDocument(ドキュメントのオブジェクトか ID)
・フォーム(.forForm(フォームのオブジェクトか ID)
・カレンダー(.forUserCalendar(カレンダーの ID)
・時間主導(.timeBased()

③ ② で指定した「実行のタイプ」の中で詳しいタイミング(編集された時、指定した時間間隔など)を設定していきます。
以下の章にて紹介しております。
④ トリガーの設定が完了したら、締めとして必ず「.create()」を付け加えます。
なお、この「.create()」によって、作成されたトリガーのオブジェクト(Trigger クラスのオブジェクト)が戻り値として生成されます。

ここで紹介するのは主に、② と ③ の項目にあたる、アプリでの挙動におけるタイミングか時間的でのタイミングの指定の方法になります。

以下では、② にあたる「実行のタイプ」ごとに、③ の「実行するタイミング」の詳細を説明します。

時間主導:.timeBased()

指定した関数を、設定した日時または周期によって自動的に発動させます。

時間主導型として設定するには、一回限りの発動と周期的に複数回、発動させる方法に大きく分けられます。

※注意点として、時間を指定しますが、指定した時間にピッタシ発動することは稀であり、15分から1時間のタイムラグがある様です。
時間通りの発動は保証されていない様ですので、お気を付けください。
なお、下で説明します「一回限りの指定(.at(日時)、after(ミリ秒)」などは比較的、指定した時間通りに発動される様です。

時間主導でのトリガーを設定するには、

ScriptApp.newTrigger(発動させたい関数の名前)
.timeBased()
// ...から設定していきます

一回限りの日時指定によるトリガー

◾️ 指定した日時に発動するトリガー

.at(指定日時)
引数:発動させたい日時(Date クラスのオブジェクト)

ScriptApp.newTrigger('myFunction')
  .timeBased()
  .at(new Date(2024, 5, 1, 8, 0, 0)) // 2024/05/01 8:00:00に発動
  .create()

◾ 指定した日にちの0時あたりで発動するトリガー

.atDate(年, 月, 日)
 引数:年(数値)、月(1〜12の数値)、日(1〜31の数値)

ScriptApp.newTrigger('myFunction')
 .timeBased()
 .atDate(2024, 5, 1) // 2024/05/01 の0時ごろに発動
 .create()

◾ トリガー設定から指定時間後に発動するトリガー

.after(ミリ秒)
 引数:トリガー設定から発動するまでの時間(1/1000秒単位の数値:1000=1秒)

ScriptApp.newTrigger('myFunction')
 .timeBased()
 .after(1000*60*5) // 5分後に発動((1000(1秒)x 60)(1分) x 5)
 .create()

周期の指定によるトリガー

◾ 指定した分数ごとに発動するトリガー

.everyMinutes(周期の分数)
引数:発動させたい周期の分数(数値)

ScriptApp.newTrigger('myFunction')
 .timeBased()
 .everyMinutes(30) // 30分ごとに発動
 .create()

◾ 指定した時間数ごとに発動するトリガー

.everyHours(周期の時間数)
 引数:発動させたい周期の時間数(数値)

ScriptApp.newTrigger('myFunction')
 .timeBased()
 .everyHour(3) // 3時間ごとに発動
 .create()

◾ 指定した日数ごとに発動するトリガー

.everyDays(周期の日数)
引数:発動させたい周期の日数(数値)

ScriptApp.newTrigger('myFunction')
 .timeBased()
 .everyDays(2) // 2日ごとに発動
 .create()

◾ 指定した週間数ごとに発動するトリガー

.everyWeeks(周期の週間数)
引数:発動させたい周期の週間数(数値)

ScriptApp.newTrigger('myFunction')
 .timeBased()
 .everyWeeks(3) // 3週間ごとに発動
 .create()

◾ 指定した曜日ごとに発動するトリガー

.onWeekDay(曜日)
引数:発動させたい曜日(ScriptApp.WeekDay のプロパティ

ScriptApp.newTrigger('myFunction')
 .timeBased()
 .onWeekDay(ScriptApp.WeekDay.FRIDAY) // 毎週金曜日に発動
 .create()

◾ 指定した日付ごとに発動するトリガー

.onMonthDay(月の日付)
引数:発動させたい月の日付(1〜31の数値)

ScriptApp.newTrigger('myFunction')
 .timeBased()
 .onMonthDay(5) // 毎月5日に発動
 .create()

周期内の時間を指定

上記の「周期の指定によるトリガー」を設定する上で、指定した周期の中で発動させたい時間や分数を設定します。
ここで紹介する関数は、上にある周期を設定する関数とともに設定することができ、単体での指定はできません。

例)
・毎週水曜日の8時台に発動する設定
・3日ごとの12時20分ごろに発動する設定

※ 注意点:ここでも指定した時間にちょうど発動するわけではなく、時間を指定した場合はその時間台(8時指定なら 8:00〜8:59 の間)の中で発動し、分数を指定した場合はその分数ごろ(プラスマイナス15分の間)に発動することに留意してください。

◾  指定した周期での具体的な時間の指定

.atHour(指定時間)
引数:発動させたい周期の内の具体的な時間(0〜23の数値:指定した時間の時間台に発動)

・指定した時間の時間台に発動(8時指定なら 8:00〜8:59 内のいづれかの時間に発動)
・「.everyMinutes()」、「.everyHours()」以外の周期を指定できる関数に対して、時間を指定

ScriptApp.newTrigger('myFunction')
 .timeBased()
 .onWeekDay(ScriptApp.WeekDay.WEDNESDAY) // 毎週水曜日の
 .atHour(8)                              // 8時台に発動
 .create()

◾  指定した周期での具体的な時間における分を指定

.nearMinutes(指定分数)
引数:発動させたい周期の内の時間における分数(0〜59の数値)

・上記の通り、指定時間のプラスマイナス15分の誤差あり
・「.everyMinutes()」、「.everyHours()」以外の周期を指定できる関数に対して、時間を指定(.atHour())した上で、その時間の分数を指定
・「.everyHours()」の時間ごとにおける分数を指定

例1)

ScriptApp.newTrigger('myFunction')
 .timeBased()
 .everyHours(6)   // 6時間ごとの
 .nearMinute(15)  // 15分ごろに発動
 .create()

例2)

ScriptApp.newTrigger('myFunction')
 .timeBased()
 .everyDays(4)   // 4日ごとに
 .atHour(10)     // 10時の
 .nearMinute(15)  // 15分ごろに発動
 .create()

その他の設定

◾  指定した時間が対応させたいタイムゾーンの設定

発動させたい地域の時間帯に合わせるための設定

.inTimezone(タイムゾーン)
引数:タイムゾーン(文字列:このサイトからタイムゾーンの文字列を選択)

ScriptApp.newTrigger('myFunction')
  .timeBased()
  .inTimezone('America/Jamaica')     // タイムゾーンをジャマイカ時間に
  .at(new Date(2024, 5, 1, 8, 0, 0)) // ジャマイカ時間の2024/05/01 8:00:00に発動
  .create()

スプレッドシート:.forSpreadsheet()

スプレッドシートの挙動に対応したトリガーを設定するには、

ScriptApp.newTrigger(発動させたい関数の名前)
.forSpreadsheet(対応させたいスプレッドシートのオブジェクトまたは ID)
// ...から設定していきます

️◾  スプレッドシートを開いた時に発動

.onOpen()

ScriptApp.newTrigger('myFunction')
  .forSpreadsheet(/*spreadsheet-ID*/)
  .onOpen() // IDに対応するスプレッドシートが開かれた時に発動
  .create()

️◾  セルの値を入力や変更の編集が行われたときに発動

.onEdit()

ScriptApp.newTrigger('myFunction')
  .forSpreadsheet(/*spreadsheet-ID*/)
  .onEdit() // IDに対応するスプレッドシート内でセルの編集が行われたら発動
  .create()

️◾  セルの編集に加えて、レイアウトの変更(行の追加や削除など)が行われたときに発動(onChange)

.onChange()

ScriptApp.newTrigger('myFunction')
  .forSpreadsheet(/*spreadsheet-ID*/)
  .onChange() // IDに対応するスプレッドシート内でセルやレイアウトの編集が行われたら発動
  .create()

️◾  スプレッドシートに紐づけられているフォームがユーザーによって送信された時に発動(onFormSubmit)

.onFormSubmit()

ScriptApp.newTrigger('myFunction')
  .forSpreadsheet(/*spreadsheet-ID*/)
  .onFormSubmit() // IDに対応するスプレッドシートに連動したフォームがユーザーによって送信されたら発動
  .create()

ドキュメント:.forDocument()

ドキュメントの挙動に対応したトリガーを設定するには、

ScriptApp.newTrigger(発動させたい関数の名前)
.forDocument(対応させたいドキュメントのオブジェクトまたは ID)
// ...から設定していきます

◾️ ドキュメントを開いた時に発動

.onOpen()

ScriptApp.newTrigger('myFunction')
 .forDocument(/*document-ID*/)
 .onOpen() // IDに対応するドキュメントが開かれた時に発動
 .create()

フォーム:.forForm()

フォームの挙動に対応したトリガーを設定するには、

ScriptApp.newTrigger(発動させたい関数の名前)
.forForm(対応させたいフォームのオブジェクトまたは ID)
// ...から設定していきます

◾️ フォームの編集ページを開いた時に発動

.onOpen()

ScriptApp.newTrigger('myFunction')
 .forForm(/*Form-ID*/)
 .onOpen() // IDに対応するフォームの編集ページが開かれた時に発動
 .create()

◾️ フォームの回答が送信された時に発動

.onFormSubmit()

ScriptApp.newTrigger('myFunction')
 .forForm(/*Form-ID*/)
 .onFormSubmit() // IDに対応するフォームの回答が送信された時に発動
 .create()

カレンダー:.forUserCalendar()

カレンダーの挙動に対応したトリガーを設定するには、

ScriptApp.newTrigger(発動させたい関数の名前)
.forUserCalendar(対応させたいカレンダーの ID)
// ...から設定していきます

◾️ カレンダーに予定の作成時、更新時、削除時に発動

.onEventUpdated()

ScriptApp.newTrigger('myFunction')
 .forUserCalendar('/*Calendar-ID*/')
 .onEventUpdate() // IDに対応するカレンダーが新規追加、または編集された時に発動
 .create()

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