#27 トリガーをプログラム内で設定する
Google が提供している、GAS のサンプルプログラム(以下 URL)で、プログラムの中でトリガーを設定している例がありました。
具体的には、以下のように追加されているカスタムメニューの項目を選択すると、トリガーを設定しています。
この記事では、このサンプルプログラムのように、プログラムでトリガーを設定する方法について取り上げます。
どうやって登録する?
上記 URL のサンプルプログラムで、実際にトリガーを設定している部分は以下の通りです。
ScriptApp.newTrigger('onFormSubmit')
.forSpreadsheet(SpreadsheetApp.getActive())
.onFormSubmit()
.create();
これは、スプレッドシートに紐づけられたフォームに回答があったときに実行されるトリガーを設定しています。このような「フォーム送信時」のトリガーのように、変更する可能性がない設定であれば、プログラムで追加できるようにしておけば、使い勝手が向上するかもしれません。
プログラム中の 'onFormSubmit' は、設定するトリガー関数になります。上の図のようなスプレッドシートのトリガーを設定するのであれば、この設定する関数の部分だけを変更すれば OK です。
二重登録を防ぐには?
しかしながら、このサンプルプログラムでは、メニュー項目を選択する度に同じ内容のトリガーが複数設定されてしまい、同じ処理を二重に行ってしまいます。
そんな二重登録を防ぐ方法を考えて、サンプルプログラムを修正したのが以下のプログラムです。
変更点は、
/*
ScriptApp.newTrigger('onFormSubmit')
.forSpreadsheet(SpreadsheetApp.getActive())
.onFormSubmit()
.create();
*/
triggerInstall( 'ON_FORM_SUBMIT', 'onFormSubmit' );
もともとのトリガーを設定している部分をコメントにして実行されないようにして、21行目で追加した関数 triggerInstall() を呼び出しています。
21行目で呼び出している関数 triggerInstall() は、105 ~ 142行目の部分です。二つの引数
type : 登録しようとするトリガーのタイプ(種類)
functionName : 登録しようとするトリガー関数
を受け取り、既に登録されているトリガーに一致するものがないかをチェックし、登録されていなければ登録しています。
具体的には… 112行目の ScriptApp.getProjectTriggers(); で、現在設定されているトリガーを取得して、登録しようとしているトリガーと一致するものかをチェックしています。
116行目の if では、既に登録されているトリガーが、登録しようとしているトリガーと同じタイプのものかをチェックし、118行目の if で同一のトリガー関数が指定されているかをチェックしています。
同一のトリガー関数が既に登録されていれば、二重登録せずに処理を終了します。同じタイプのトリガーが設定されているものの、違う関数が登録されている場合には、登録されていた違う関数が指定されたトリガーを削除し、引数に指定された関数をトリガーとして追加しています。
このプログラムでは、既に同じタイプのトリガーが複数設定されていた場合などには対応しきれていませんが、少なくともこのプログラムで登録する分には、同じトリガー関数を複数設定することはありません。
まとめ
上述したように、作成した GAS のプログラムを利用するために、トリガーを設定しなければならない場合に、そのプログラム内でトリガーを設定できるようにしておけば、設定作業に不慣れな人でも GAS のプログラムを利用しやすくなると思います。
その GAS のプログラムを利用する人のスキルレベルによっては、このようなプログラムによるトリガーの設定を考えてもいいのではないか、と思います。
最後に… この記事を書いていて、134行目からのトリガー関数を設定している部分で、'ON_FORM_SUBMIT' にしか対応していないのであれば、引数に指定する意味がないようにも感じましたが、今後の拡張性のためにも残したままにしておきます。
#「修正するのが面倒なだけでは?」と言わないでください。(^-^;
この記事が気に入ったらサポートをしてみませんか?