スクリプトは、「利用する側が使いたい時に呼び出して実行する」というものばかりではありません。必要に応じて自動的に処理を実行する、というようなものもあるのです。そのために用意されているのが「
イベントハンドラ」と呼ばれるものでます。
イベントハンドラは、
イベントに応じて何らかの処理を実行するためのものです。スプレッドシートには、操作や状況に応じて発生する
イベントが用意されています。この
イベントが発生すると、あらかじめ用意しておいた処理を実行するのが
イベントハンドラの役割です。
イベントハンドラは、基本的に「あらかじめ予約された名前の関数」として定義したもの、と考えていいでしょう。スプレッドシートには、以下のような
イベントハンドラが用意されています。
onOpen(event)スプレッドシートを開いたときに実行されます。開いたWebページをリロードした場合なども実行されます。
onEdit(event)スプレッドシートを編集したときに実行されます。編集中、あちこちのセルを書き換えるたびにイベントが発生し、このイベントハンドラが呼び出されることになります。
onInstall(event)これは、ちょっと特殊な働きをするものです。これは、このスクリプトが「
スクリプト・ギャラリー」に公開されたときに利用します。そのスクリプトがインストールされるときに、このイベントハンドラが呼び出されるのです。
onFormSubmit(event)これも、ちょっと特殊な働きをするものです。これは、フォームから送信された際に呼び出されるものです。スプレッドシートでは、「
フォーム」と呼ばれる入力フォームを作成し公開することができます。このフォームから送信がされたときにこのイベントハンドラが実行されます。
とりあえず、私たちがすぐに利用できるのは、「
onOpen」と「
onEdit」でしょう。これで、スクリプトを開いたときに予め用意しておいた処理を自動実行させたり、編集中に常に何らかのチェックを行わせたりすることもできるようになります。(その他のものは、別の機会に改めて説明したいと思います)
下に簡単な利用例をあげておきました。ここではスプレッドシートを開くと利用者名をA1セルのコメントに設定されます。また編集すると、その日時がB1セルのコメントに設定されます。――ここでは、引数に渡されたeventから、開かれているシートを取得し、必要な情報をコメント設定しています。まずonOpenを見てみましょう。
var sheet = event.source.getActiveSheet();
sheet.getRange("A1").setComment("OPEN:" + event.user);
eventの「
source」というプロパティに、イベント発生源に関する情報を管理するオブジェクトが保管されています。この中の「
getActiveSheet」を呼び出すことで、イベント発生時にアクティブだったシートの
Sheetオブジェクトが得られます。
セルのコメントは、
Rangeの「
setComment」というメソッドで設定することができます。
onOpenでは、ここに「
event.user」の値を保管しています。これは、ドキュメントを開いた利用者のGoogleアカウント名を返すものです。なかなか重宝しますね。
onEditでも、同様に
getActiveSheetで
Sheetを取得し、
setCommentでコメントを設定しています。こうした自動化が行えると、ちょっとした処理を常に自動的に行えるようになります。