見出し画像

【GAS】を自動で実行したい!トリガーについて

GoogleAppsScript のスクリプト(プログラム)を特定の条件の際に実行したいと思いませんか?
例えば、毎朝、あるスクリプトを実行したりとか、スプレッドシートが編集されたら実行するスクリプトを設定したりなどできたら、更に GoogleAppsScirpt が便利になることでしょう。

ここでは、そんな GoogleAppsScript を自動で実行してくれる仕組みである「トリガー」についてご紹介していきます。

なお、こちらで説明するトリガーの設定方法は、ブラウザなどから設定する方法ではなく、GoogleAppsScript を使ったスクリプトを書いて設定する方法の説明のみとなりますのでご了承ください。


GoogleAppsScript を自動で実行するためのトリガーとは

トリガーとは?

GoogleAppsScript でのトリガー(Trigger)とは、

・実行させたい関数(Function)を指定
・実行させたいタイミングの条件を設定

することによって、自動的に指定した関数のスクリプトを設定した条件下で実行させることができるのです。
また、この記事では、自動的に設定した条件下で実行されることを「発動」と言わさせて頂きます。

どのようなものか簡単な例を挙げてみます。 ・毎日8時にメールを送信
・カレンダーにある条件に該当する予定が追加されたら、スプレッドシートに記録
・スプレッドシートに変更が加えらたら、集計などの処理を発動

イメージがつきましたでしょうか?

トリガーを使うためのクラス

上記にある通り、この記事では GoogleAppsScript のスクリプトを書いてトリガーの設定や管理の仕方の説明をしていきます。
ブラウザ上の GoogleAppsScript のエディタから視覚的にトリガーを設定することもできるのですが、こちらではその使い方などの説明はございません。

そんなスクリプト上からトリガーを扱うためのクラス(class)の紹介をしていきます。

◾️ Trigger クラス

トリガー自体のクラスであり、実行する関数の名前や、どのような条件下での発動するのかの情報を持っています。
特に、不要になったトリガーを削除する際に必要になるものでしょう。

◾️ TriggerBuilder クラス

トリガーを作成する際に使用するクラスです。
ですが、主にこのクラスで出来ることは、トリガーがどのような条件下で発動させるかを選択する機能しかありません。
どの様な条件下でというのは、発動するのがスプレッドシートを作業中でなのか、指定した時間のルールの中なのか選択

紹介しておいてなんですが、このクラス他、トリガーを作成するにあたるクラスもろもろ(ClockTriggerBuilder クラス、SpreadsheetTriggerBuilder クラス)はまとめて、トリガーを作成するクラスがあんだなぁと思っておいていいと個人的には考えてます。

また、そのような条件下でというのは、何があるのかは、次の「どのようなトリガーが設定できるの?」で紹介しています。

◾️ ScriptApp クラス

トリガーを作成するためのクラス(TriggerBuilder)のオブジェクトを取得したり、既存のトリガーの(Trigger クラス)オブジェクトやトリガーの削除が行えるクラスです。

どのようなトリガーが設定できるのか?

関数のスクリプトを自動的に発動させる状況を選択する必要があります。
発動させたいのが、時間的な指定によるものなのか、スプレッドシートなどのアプリの作業における特定の挙動時なのかを選択していきます。

ここでは、発動させられる状況についての説明になります。

また、このことに関する詳しい説明はこちらの記事になります。

アプリの挙動に沿って発動

状況下として指定できるアプリとは、「スプレッドシート、ドキュメント、フォーム、カレンダー」を指します。

もう少し具体的にどの様な時に発動させられるかアプリごとにみてみましょう。

◾️ スプレッドシート(Spreadsheets)

スプレッドシートで作業中に発動する条件は
・スプレッドシートを開いた時(onOpen)
・セルの値を入力や変更の編集が行われたとき(onEdit)
・セルの編集に加えて、レイアウトの変更(行の追加や削除など)が行われたとき(onChange)
・スプレッドシートに紐づけられているフォームがユーザーによって送信された時(onFormSubmit)

◾️ ドキュメント(Document)

ドキュメントで作業中に発動する条件は
・ドキュメントを開いた時(onOpen)
のみ・・・

◾️ フォーム(Form)

フォームで作業中に発動する条件は
・フォームを開いた時(onOpen)
・フォームが送信された時(onFormSubmit)

◾️ カレンダー(Calendar)

カレンダーで作業中に発動する条件は
・予定を作成時、更新時、削除時に発動(onEventUpdated)

これらのタイミングで発動させることができます。

時間主導型による発動

時間主導とは、特定の日時やある周期にごとに繰り返し発動させることを指定できます。
どの様な指定の仕方があるか項目ごとにみてみましょう。

◾️ 一度限りの発動指定

・トリガーを作成してから指定した時間後に発動(after)→ 例)作成済みのメールを2時間後に送信
・指定した日時に発動(at)→ 例)10/31 の23時にパーテーに参加する人の集計をとる。。。
・指定した日にち(0時付近)に発動  → 例)7/21に誕生日メールを送る(自動的に・・・)

◾️ 周期ごとに繰り返しの指定

・分数ごとに発動(everyMinutes)→ 例)30分ごとにスプレッドシートの集計をする。
・時間数ごとに発動(everyHours)→ 例)2時間ごとに催促メールを送信(あくまで例です)
・日数ごとに発動(everyDays)→ 例)上二つに似た様なこと。。。
・週間数ごとに発動(everyWeeks)→ 省略・・・
・毎週何曜日に発動(onWeekDay)→ 省略・・・
・毎月何日に発動(onMonthDay)→ ・・・

周期で発動を指定してる時のみ設定できる項目

・何時に発動させるか(atHour) ・何分に発動させるか(nearMinute)

これらのように指定できます。

※ 大変重要な注意点として時間指定した際、日時を指定(at)や指定時間後を指定(after)以外では、基本的に指定した日時より10分から一時間ほどのタイムラグが発生する様です。
確固たる時間に発動させたい場合はご注意くださいませ。

トリガーの設定の仕方

GoogleAppsScirpt でトリガーを実際に設定する方法を紹介していきます。

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

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

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

トリガー自体の管理(取得や削除)

作成した既存のトリガーを取得したり、削除する方法を紹介します。
なお、既存のトリガーは、基本的に同一のプロジェクト内にあるトリガーしか取り扱えないのでご注意ください。

既存のトリガーの取得

プロジェクト内で設定したすべてのトリガーを取得
ScriptApp.getProjectTriggers()

・引数:無し
・戻り値:プロジェクト内のすべてのトリガー(Trigger クラスのオブジェクトのリスト)

let allTrigger = ScriptApp.getProjectTriggers();

トリガーの削除

削除したいトリガー(Trigger クラスのオブジェクト)を指定して、削除
ScriptApp.deleteTrigger(トリガーのオブジェクト)

・引数:削除したいトリガー(Trigger クラスのオブジェクト)
・戻り値:無し

ScriptApp.deleteTrigger(triggerObject);

トリガーのより詳しい設定の仕方やコードの紹介は以下のリンクにて記事があります!

いいなと思ったら応援しよう!