どうも。つじけ(tsujikenzo)です。このシリーズでは、2021年5月から始まりました「ノンプロ研GAS中級講座5期」について、全8回でお届けします。今日は5回目のDay4です。
前回のおさらい
前回は、「組み込みオブジェクト」 をお届けしました。JavaScriptの組み込みオブジェクトの中でも、GASで使えるものがたくさんありました。
講座では組み込みオブジェクト以外にも、「スプレッド構文」や「分割代入」もご紹介しました。いかにも中級っぽい実務で、バリバリ使う記法ばかりです。
今回は、 「Script Services1」 をお届けします。
今日のアジェンダ
- トリガーとイベントオブジェクト
- UIの操作
- Propertiesサービス
業務効率化とは、毎月、毎日のルーティンワークをプログラミングすることで、労働時間を短縮することですが、「プログラミングを実行すること」も楽にしたいものです。
GASには、むずかしいプログラミングをしなくても、スクリプトを実行するさまざまな機能があります。ぜひ使いこなしていきましょう。
トリガーとイベントオブジェクト
「クリックされた」や「ページが読み込まれる」といった、ブラウザ上で発生する動きを「イベント」と呼びます。
イベントが発生したときに、呼び出される処理を「イベントハンドラー」と呼びます。
GASでは、イベントハンドラーのことを「トリガー」と呼んでいます。 過去にGoogleフォームの連載でトリガーについて解説しましたので、詳しくはこちらもご参照ください。
とくに深掘りしなくても、なんとなく動いてしまうのがトリガーの便利な点です。しかしながら、トリガーをちゃんと理解しないまま重要度の高いスクリプトを実行し続けることは、思わぬ事故につながりますし、いつも不安だと生産性が落ちます。コツを掴めば難しくありませんので、頑張りましょう。
トリガーは「シンプルトリガー」と「インストーラブルトリガー」の2種類があります。結構違います。(ただしマニアック過ぎて、2つの違いを深掘りしている記事は少ないと思います。ほどほどに御処方ください)
2つの違いを見ていきましょう。
シンプルトリガーの概要
最大の特徴は 「シンプルトリガーは関数名が決まっている」 です(公式では「予約済み関数」と呼んでいます)。
種類は、6種類しかありません 。全部覚えてしまいましょう。
スタンドアロンスクリプトで使うことはありません。必ず 「コンテナバインドスクリプト内で使う」 がルールです。
シンプルトリガーの使い方は、スクリプトエディタに関数を書くだけ です。みなさんがよくやる「トリガー設置」は不要です。
以上、 太字 で書いた4つが、最も重要なポイントです。
シンプルトリガーの深掘り:認証不要
シンプルトリガーから発火したスクリプトは、認証不要です。
コンテナバインドスクリプトを作成し、下記、onOpen()を手動で実行します。
初回実行時は認証を求められます。これは、Browserクラスのトップレベルオブジェクトを呼び出す(APIを叩く)から です。※GASは、GWSのAPIを叩くときに本人確認を求められます。
今回は認証せずに、読み進めてください。そして、講師メモで申し訳ないですが、一度与えた認証を削除するのはこちらから。
認証はしていません。しかし、バインドされているスプレッドシートをリロードすると、onOpen()が発火します。
認証がないのに、SpreadsheetApp(.getName()メソッド)さえも動きます。
これは、シンプルトリガーは認証不要である という仕様からくるものです。
※ただし、opneById()メソッドなど、バインドされているファイル以外を呼び出すことはできません。ログを確認するとちゃんとエラーが出ています。
function onOpen() {
Browser.msgBox('スプレッドシートが開きました');
Browser.msgBox(SpreadsheetApp.getActiveSpreadsheet().getName());
//外部ファイルにはアクセスできない
Browser.msgBox(SpreadsheetApp.openById('スプレッドシートID').getName());
}
インストーラブルトリガーの概要
最大の特徴は 「時間主導型で発火できる」 です。ある時刻になったら関数を実行する機能ですが、GASが他のプログラミング言語より優れている点のひとつです。
時間主導型の他にも、シンプルトリガーのような 「イベント発生時」 も選択できます。
シンプルトリガーとは違い、スタンドアロンスクリプトに書いた関数を実行できますので、フォームやスプレッドシートとの連携が可能です。
関数名も自由に設定できます。
インストーラブルトリガーの深掘り:設置アカウントと発火
トリガーを設置したユーザーのことを「オーナー」と呼びます。通常は、自分でトリガーを設置することが多いと思います。オーナー=自分です。
しかし、このように、編集権限をもつ他のユーザーが設置したトリガーは、トリガーを設置したアカウントで実行されます。
Gmailなどを送信するスクリプトを書いている場合は、トリガーを設置したアカウントからGmail送信する ことになりますので、運用には注意が必要です。
一方で、下記のように、トリガーを複数人で運用する場合もあると思います。
スプレッドシートの編集時にすべてのトリガーが発火しますが、トリガーの設置アカウントで条件分岐が可能 です。
スプレッドシートの場合
const activeUser = Session.getActiveUser().getEmail();
if(activeUser === '') return;
フォームの場合
const activeUser = Session.getActiveUser().getEmail();
//1問目の回答でメールアドレスを収集しておく
const itemResponses = e['response'].getItemResponses();
if (activeUser !== itemResponses[0].getResponse()) return;
なお、トリガーは 編集権限を失うと削除されてしまう ので、お気を付けください。
イベントオブジェクト
イベントオブジェクトを極めるためには、公式リファレンスを読めるようになることが必須です。
というのも、公式リファレンスが充実していて素晴らしいからです。
GWSごとの、シンプルトリガーとインストーラブルトリガーについて、発火するとどんなイベントオブジェクトを返すのかが一目瞭然です。
UIの操作
スプレッドシートのカスタムメニューを作成する方法は2種類ありますが、講座では、各GWSでUiオブジェクトを操作する、トップレベルオブジェクト.getUi()メソッドをご紹介しました。
//Uiオブジェクトを操作したカスタムメニューの作成例
const ui = トップレベルオブジェクト.getUi();
ui.createMenu('独自メニュー')
.addItem('Slackに投稿', 'postSlack')
.addToUi();
ネット上ではSpreadsheet.addMenu()を使う記事も出てきますが、サブメニューが追加できませんし、スプレッドシート限定になってしまうので、あえて使う必要はないと思います。
function onOpen(){
//addMenu()メソッドを使った古い?書き方
var myMenu=[
{name: "納品書作成", functionName: "nohinsho"},
{name: "請求書作成", functionName: "seikyusho"}
];
SpreadsheetApp.getActiveSpreadsheet().addMenu("帳票作成",myMenu);
}
Propertiesサービス
プロパティストアは 文字列型としてデータを格納する領域 です。
プロパティストアの容量を計算したノンプロ研メンバーがいらっしゃいますので、ブログをご紹介させてください。
マニアックで好きです。
ユーザープロパティ
あまり使う場面に出くわさなかったユーザープロパティですが、トリガーが発火して関数が走ったさいに、自分自身のメールアドレスを確認するのに有効です。
まず、ユーザープロパティに自分のメールアドレスを格納する関数を作成して、実行します。
function setMyUserProperties(){
//自分のメールアドレスを登録してください
const email = 'tsujike3@gmail.com';
const userProperties = PropertiesService.getUserProperties();
userProperties.setProperty('USER', email);
}
スプレッドシートの編集権限をもつ、別のアカウントでもスクリプトエディタを開きます。
関数は同じですが、メールアドレスを変更して、実行します。
function setMyUserProperties(){
//自分のメールアドレスを登録してください
const email = 'tachibanana5963@gmail.com'; //ここを書き換える
const userProperties = PropertiesService.getUserProperties();
userProperties.setProperty('USER', email);
}
発火用の関数を用意します。
function getYourUserProperties() {
const userProperties = PropertiesService.getUserProperties();
const user = userProperties.getProperty('USER');
console.log(user);
}
それぞれのアカウントでトリガーを設置します。
どちらか一方のアカウントでスプレッドシートをリロードします。
2つのトリガーが発火していますが、ユーザープロパティの中身は違っています。
トリガーの設置アカウントと、実行アカウントを制御する際に役立ちますので、「こんな使い方があるんだー」ぐらいで知っていただければ幸いです。
まとめ
以上で、「Script Services1」をお届けしました。「トリガーを制するものは、時間を制す」と言えるほど、トリガー操作は業務効率化向上をはかるGASの醍醐味です。
また、トリガー制御にまつわる、ユーザーインターフェース(カスタムメニュー)や、トリガーを制御するためのユーザープロパティの仕組みを学びました。
次回は、 「Script Services2」 をお届けします。
このシリーズの目次
- [ノンプロ研]GAS中級講座5期 事前課題
- [ノンプロ研]GAS中級講座5期Day1 スコープと関数
- [ノンプロ研]GAS中級講座5期Day2 クラス・ライブラリ
- [ノンプロ研]GAS中級講座5期Day3 組み込みオブジェクト
- [ノンプロ研]GAS中級講座5期Day4 ScriptServices1
- [ノンプロ研]GAS中級講座5期Day5 ScriptServices2
- [ノンプロ研]GAS中級講座5期Day6 HTTP通信・API
- [ノンプロ研]GAS中級講座5期卒業LT ノンプログラマーによるGAS開発モデルとは
- [ノンプロ研]GAS中級講座5期卒業LT プロの開発を知ろう
- [ノンプロ研]GAS中級講座5期卒業LT ノンプログラマーによる開発