libro
www.tuyano.com
初心者のためのGoogle Apps Scriptプログラミング入門

スクリプトの実行とイベントハンドラ (3/5)

作成:2011-06-22 07:57
更新:2011-11-04 15:50

■インストーラブル・イベントハンドラとトリガー

このonOpenonEditといったイベントハンドラは、指定した名前で関数を用意するだけで自動的に呼び出されるようになりました。これらは「シンプル・イベントハンドラ(Simple Event Handlers)」と呼ばれるものです。余計な設定などもせず簡単にイベントを利用できます。

が、実はGoogle Apps Scriptに用意されているイベントは、これだけではありません。この他に、ユーザーが作った関数をイベントに追加して利用できるようにする機能も備わっています。これは「インストーラブル・イベントハンドラ(Installable Event Handlers)」と呼ばれるものです。

このタイプのイベントハンドラは、関数名などは自由に設定できます。その代りに、「この関数を、このイベントが発生したときに実行する」ということをあらかじめ指定して置かなければいけません。この「イベントが発生したら指定の関数を実行するための仕組み」のことを「トリガー」と呼びます。

このトリガーは、スクリプトエディタで設定することができます。<トリガー>メニューには以下の2つのメニュー項目が用意されています。

現在のスクリプトのトリガー――このスクリプトに用意されているトリガー設定の一覧を表示するものです。ここで、「この関数は、このイベントで実行する」というトリガーを設定します。

すべてのトリガー――全トリガーを一覧表示します。通常、上のメニューと表示される内容は同じです。

このトリガーのメニューでは、スクリプトに用意されている関数と、それを割りつけるイベントの関連付けを行うことができます。現れるダイアログで「トリガーが設定されていません。今すぐ追加するにはここをクリックしてください」あるいは「新しいトリガーを作成」というリンクをクリックすると、新しいトリガー設定の項目が現れます。ここで、利用するイベントトリガーと割りつける関数を選択します。

では、実際にやってみましょう。まず、割りつける関数を用意しておきましょう。下のリスト欄に簡単なサンプルを挙げておきました。このonMyEditという関数は、onEdit用のサンプル関数です。編集すると、最後に編集した範囲を示す値がA1セルに書き出されます。実際に<トリガー>メニューを使い、この関数をonEditに割りつけてみてください。

ここでは、引数に渡されたオブジェクトから必要な情報を取得しています。が、スクリプトをよく見ると、どうも見覚えのないプロパティが使われていることがわかるでしょう。これは、非常に重要です。

実をいえば、シンプル・イベントハンドラと、インストーラブル・イベントハンドラでは、引数に渡されるオブジェクトの内容が異なるのです。シンプル・イベントハンドラにはない機能が、インストーラブル・イベントハンドラの引数にはあります。例えば、「イベントが発生した範囲」の情報です。
var sr = e.range.rowStart;
var sc = e.range.columnStart;
var er = e.range.rowEnd;
var ec = e.range.columnEnd;
このように、オブジェクトのrangeという属性に、イベント発生時の範囲に関する情報を保管するプロパティが用意されています。これらを参照することで、どこからどこまでのセルが編集されたかがわかるのです。

逆に、シンプル・イベントハンドラにあったものがない、ということもあります。その下の方で、開いているシートを取得するのにSpreadsheetApp.getActiveSheetを呼び出していますね。シンプル・イベントハンドラなら、
var sheet = event.source.getActiveSheet();
このようにしてイベントが発生したシートを得ることができました。が、インストーラブル・イベントハンドラの引数には、sourceプロパティはありません。このやり方は使えないのです。

このように、シンプル・イベントハンドラとインストーラブル・イベントハンドラは、細かな点で微妙に違いがあります。この違いをよく頭にいれておきましょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

function onMyEdit(e){
	var sr = e.range.rowStart;
	var sc = e.range.columnStart;
	var er = e.range.rowEnd;
	var ec = e.range.columnEnd;
	var msg = "EDIT:" + sr + "," + sc + ":" + er + "," + ec;
	//var sheet = event.source.getActiveSheet(); // ←ダメ!
	var sheet = SpreadsheetApp.getActiveSheet();
	sheet.getRange("A1").setValue(msg);
}

※関連コンテンツ

「初心者のためのGoogle Apps Scriptプログラミング入門」に戻る