adsense自動レスポンシブ

Event

Google Apps Script - onEdit()の基本

更新日:

Google Apps Script(以下GAS)で、セルが編集された場合のイベントを拾って処理を記述することができます。

そのような場合にはfunction onEdit(e){} というような記述をするのですが、このトリガーとイベントまわりにはいくつかハマりポイントもあるので、その辺も含めてまとめてみたいと思います。

 

EventとTrigger

イベント(Event)は、ドキュメントを開いた時(Open)や編集した時(Edit)、フォームを提出した時(Form submit)といったものから、1日おき/1時間おきといった時間指定するものが用意されています。

トリガー(Trigger)はSimple TriggersInstallable Triggersの2種類あり、どちらも前述のイベントが発生した際に自動的に関数を呼び出してくれますが、前者はGASにあらかじめ用意されている関数を呼び出し、後者は自作した関数にイベントにを紐づけて使用するという点で違いがあります。

 

Event Object

※次のセクションの「Simple Triggerの使い方」を先に見た方がイメージ掴みやすいかもしれません※

イベントオブジェクト(Event Object)は、イベント発生時に呼び出された関数に渡される引数で、Googleのマニュアルではと表記されています。(別に"e"でなくてもよいのですがこの説明ではマニュアル通り"e"で記述します)

使用するイベントやトリガーによって使える引数が変わってくるので注意が必要ですが、たまに使用可能な値が増えたりします。

Spreadsheetで使用できる、主なイベントとその値をピックアップしておきます。

イベント e.~~~で指定する変数名 説明
Opne
Change
Edit
user UserのObjectが入っています。ユーザの名前やアドレスを使うには、e.user.getEmail()とします。
Open
Edit
source 今開いているSpreadsheetのObjectが入っています。シートのデータを扱うには、e.source.getSheetByName("シート1")でSheet Objectをまず取得する必要があります。
Change changeType ChangeイベントはInstallableでしか使えません。
Editイベントと似て非なるもので、セルの情報ではなく編集操作の内容がe.changeTypeの中に入ってきます。
EDIT, INSERT_ROW, INSERT_COLUMN, REMOVE_ROW, REMOVE_COLUMN, INSERT_GRID, REMOVE_GRID, FORMAT, OTHER
Edit oldValue セルの変更前の値です。昔は無かったのですが、数年前に増えました。(最初から欲しかった><)
Edit
Form submit
range 編集されたセルのRANGEが入ってきます。複数セルが編集された場合もこのRANGEが重要になってきます。
Form submit namedValues 質問とその回答が連想配列で入ってきます。他にも、values という回答の値だけが配列に入っているものもあります。

 

Simple Triggersの使い方

あらかじめGASで用意されている関数onOpen(e)onEdit(e)を使用します。

onOpen(e)はドキュメントを開いた時に自動的に呼び出される関数で、独自のメニューをこの関数の中で作成したりします。
こちらのMenu Classのマニュアルが非常に分かりやすいです。

onEdit(e)は、Spreadsheetであればユーザーがセルを編集したときに呼び出されるので、例えばセルに色を付けたりバリデーションチェックをしたりするのに使用します。

値の取得方法

イベントオブジェクト"e"に"."ピリオドで変数名を続けて書くことで、そこに値を取得することができます。
e以外の変数名hogeなどを自分で指定したらhogeを利用してください)

特定のシートの特定のセルの編集だけ拾いたい場合

onEdit()は、そのSpreadsheet内のすべての編集を拾ってしまいます。
ですので、実際にはシート名や行番号、列番号などで処理を行いたい範囲を絞る必要があります。

注意点

function onEdit(e) を使用するなら、その関数onEdit(e)に対して、後述するInstallable Triggersのトリガーとイベントを設定する必要はありません。
このonEdit()という名称で、自動的に「編集時」イベントに反応して動いてくれるからです。

逆に、Installable Triggersで設定したイベントと重複してしまうと、onEdit()の方が優先されてしまうので注意してください。

 

Installable Triggersの使い方

自分で定義した関数(function)に対してあらかじめ用意されているイベントの中から目的にあったものを割り当ててトリガを設定します。
スクリプトエディタを開いた状態で、「メニュー>編集>現在のプロジェクトのトリガー」を開くと設定することができます。
Installation Trriger
ここで設定できる主なものをピックアップしておきます。

イベント種類 イベント 説明
Spreadsheetから 起動時、編集時、値の変更、フォーム送信時 それぞれ、Open / Edit / Change / Form submit に相当します。
時間主導型 秒、分、時、日、週、月など (実際にどんな関数を動かすかにもよりますが)あんまり細かく設定すると、APIのコール数制限にヒットするのと、前の処理が終わらないうちに次の処理が走って不整合が起きたりするので注意しましょう。

Changeの使い方

Changeイベントを使用して編集操作の種類を把握するには、任意の名前の関数を定義して、トリガ設定を開いて、その関数にChangeイベントを指定します。


トリガは次のように設定します。

 

Form submitの用途

フォームに紐づいた回答Spreadsheetにて、フォームをSubmitされた時に、フォームの回答に基づいて何か処理したい場合があると思います。

しかし、実は、Editイベントを使ったSimple Triggersの(=あらかじめGASに用意してある)onEdit(e)では、FormからのSpreadsheetへの書き込みは反応してくれないのです。

これは、Editイベントが「ユーザ」が編集した時のイベントであって、システムが自動で書き込んでいる処理は対象外だから、だと自分は理解しています。

そんな時には、Form submit イベントを使用します。
ただし、Simple Triggersには用意されていないので、自分で独自のfunctionを定義して、前述の「メニュー>編集>現在のプロジェクトのトリガー」から「フォーム送信時」というイベントを選択して指定してあげます。
(もちろん、フォームに紐づいた回答Spreadsheetのスクリプトエディタを開いて、ですよ)

 

注意点

  • 「時間主導型」に書いたポイントには注意しましょう。
  • Installable Triggerは、SpreadsheetやScriptのプロジェクト単位に設定するのではなく、ユーザに紐づくので、自分がセットしたものは他の人には見えません。(でももちろん、Spreadsheetに対する処理は走ってその結果Sheetの値が変わるので全員に影響します)
  • ユーザに紐づくということは、例えばここで指定したfunction()の中でメール送信をする場合は、その送信者はあなたのユーザになります。
  • 最後に、自分で設定したトリガを消しわすれないようにしましょう!永遠に動いてくれますw

 

さいごに

いかがでしたか?

この続編として、「onEdit(e)で複数セルを同時に編集された場合の書き方」をまとめてありますのでので、そちらもご参照ください。

レクタングル336

レクタングル336

-Event

Copyright© JJ BLOG , 2018 All Rights Reserved.