techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

GAS事始め(その3):GASのイベントを理解する(基礎編)

GASではスプレッドシート上*1で発生したイベントを検知して、イベント発生時に任意の処理を実行することができます。

今回はGASで定義されている各イベント種別とイベント発生時に実行されるコールバックメソッドを確認してみましょう。

2つのイベントタイプ

GASのイベントには様々な種類がありますが、イベントのタイプによって利用できる条件が異なります。

現在規定されているイベントのタイプは以下の2つです。

  1. Simple Triggers
  2. Installable Triggers

Simple Triggersではファイル操作に伴う基本的なイベントをハンドリングできます。Installable Triggersでは、Simple Triggersの一般的なイベントに加えて、ユーザ認証が必要な処理や定期的な実行などより高度な処理を実行できます。

今回はSimple Triggersに絞って確認してみます。

Simple Triggers

Simple Triggersは、スプレッドシートやドキュメントなどを操作した時の基本的なイベントをハンドリングする、文字通りシンプルなイベントです。Simple Triggersで利用できるイベントは以下のとおりです。

メソッド名 実行タイミング
onOpen(e) 閲覧権限のあるユーザが、このスクリプトが紐付けられたファイルを開いた時
onEdit(e) スプレッドシートで任意のセルの値を変更した時
onInstall(e) ユーザがアドオンをインストールした時
doGet(e) APIとして公開されているGASに対してhttp/GETリクエストを行った時
doPost(e) APIとして公開されているGASに対してhttp/POSTリクエストを行った時

各メソッドの引数にeという値がありますが、これはイベントが発生したオブジェクトを表します。各コールバックメソッドが実行される際、このパラメータeから様々なデータを取得して利用します。

各メソッド実行時に渡される引数はリファレンスを参照してください。

Event Objects  |  Apps Script  |  Google Developers

サンプルコード

onInstallはアドオンのインストール時、doGet/doPostはスタンドアロン型のGASで利用するものなので、Simple Triggersのイベントをハンドリングする場合は、基本的にonOpenとonEditを使うことになると思います。

以下はonOpenとonEditのサンプルコードです。

GAS事始め(その3):Simple Triggersサンプル

onOpenではスプレッドシートにカスタムメニューを追加しています。ポイントは4、5行目のaddItemで、1つ目の引数にメニュー名、2つ目の引数にメニュー選択時に実行されるメソッド名を指定することができます。

onOpenでメニューを追加することにより、スプレッドシートを開いた時にカスタムメニューを追加することができます。実際に追加されたメニューは以下のようになります。 f:id:snishimura0926:20160326232339p:plain

このメニューからRedbullを選択すると、4行目のaddItem("Redbull", "redbullSelected")で追加したredbullSelectedが実行されます。 f:id:snishimura0926:20160326232621p:plain

onEditでは、ユーザによって変更されたセルの内容をA2セルに表示します。適当なセルに値を入力すると以下のようになります。 f:id:snishimura0926:20160326232801p:plain

なおonEditはユーザによる編集が行われた時にしか実行されないようで、カスタムメニューからredbullSelectedmonsterSelectedを選択した時には実行されませんでした。

以上、Simple Triggersのイベントを簡単に見てきましたが、スプレッドシートのオープン時にメニューを追加することで誰でもスクリプトが実行できるようになるので、色々な使いみちがありそうですね。

参考

Simple Triggers  |  Apps Script  |  Google Developers

*1:スプレッドシートに限らず、ドキュメントやフォームなども同様