[GAS] ボタンクリックでトリガーを設定する方法
トリガー設定しているスクリプト付のスプレッドシートをコピペして使いたいときに、トリガー設定画面を使わなくても、トリガーの設定ができるよう、シート上に「トリガー設定」ボタンを作る。
経緯
- セルを編集して、値が条件に当てはまったらメールを送信するというスクリプト付のスプレッドシートをコピペして使いたい。
- でもトリガーはコピペされない。
- でも実際にスプレッドシートを使う人には、「スクリプトエディタからトリガー設定画面を開いて、トリガーを追加して~…」という作業が難しい。
- メール送信が必要なため、 installable triggers ( トリガー設定画面から追加するやつ ) しか使えない。
※ スクリプト中でonEdit(e)
って名前で関数を作ってトリガーさせる simple trigger という方法もあるが、これだとメール送信できない。 simple trigger だと authorization が必要な機能は使えないとのこと。
They cannot access services that require authorization. For example, a simple trigger cannot send an email because the Gmail service requires authorization
https://developers.google.com/apps-script/guides/triggers/
対応
ユーザーがボタンクリックするだけで、トリガーがセットされるようにした。
トリガービルダーというものを使うと、スクリプトからトリガーを作成することができる。
Class SpreadsheetTriggerBuilder
スプレッドシート上にボタンを作成し、「スクリプトを割り当て」をすると、ボタンクリックでスクリプトを実行することができる
作り方
スクリプト
const FUNC_NAME = "hoge";
function init()
{
try{
// 現在登録されているトリガー一覧を取得
let triggers = ScriptApp.getProjectTriggers();
// "hoge" という関数がトリガーに登録されているかチェック
let target = triggers.findIndex(trigger => trigger.getHandlerFunction() === FUNC_NAME);
if(target !== -1) {
Browser.msgBox('It has already initialized.');
return 0;
}
let spreadsheet = SpreadsheetApp.getActive();
// トリガーを設定
ScriptApp.newTrigger(FUNC_NAME)
.forSpreadsheet(spreadsheet)
.onEdit()
.create();
}catch(e){
// エラー
Logger.log(e);
Browser.msgBox('Initialization failed: ' + e);
}
9 行目で、 findIndex()
を使って、対象の function がトリガーに登録されているか確認している。 findIndex()
は、配列に検索対象の要素があればインデックス番号を返し、見つからないときは -1
を返す。
これは下記と同様。
for (var i = 0; i < triggers.length; i++) {
if (triggers[i].getHandlerFunction() === FUNC_NAME) {
Browser.msgBox('It has already initialized.');
return 0;
}
}
18 行目でトリガーをセットしている。今回は「編集時」のトリガーなので、 onEdit()
を使用
ボタン作成
- スプレッドシートのメニューバーから、「挿入 -> 図形描画」をクリック。
- 好きな図形を作成。
- 図形を右クリックしたときに表示される三点をクリックし、「スクリプトの割り当て」を選択。
- 作成したスクリプトも関数名を入力し、「OK」をクリック。
使い方
ボタンクリック 1 回目に、「承認が必要」というポップアップが表示される。
「続行」->「詳細」->「スクリプト名(安全ではないページ)に移動」->「許可」をクリックし、承認作業を行う。
ボタンクリック 2 回目でトリガーがセットされる。
マニフェスト設定について
今回作ったスクリプトの初回起動時に、スクリプト実行に必要な権限が自動で抽出され、承認ポップアップが出る。だが、個人的にはマニフェストファイルで必要な権限をスコープに追加しておく。
理由は、ずっと使えていたのに、突然権限の問題でスクリプトが動かなくなって、承認ポップアップも出ないということが、たまに起きるから。マニフェストファイルへの記述の有無が関係しているかは不明なのだが、一応。