Google Spreadsheetのトリガーの「編集時」と「値の変更」の違いを検証してみた
Google Spreadsheetのトリガーの種類の検証
調査対象のトリガー
トリガーの種類は次のとおりです。
スプレッドシートから
起動時
編集時
値の変更
フォーム送信時
時間主導型
特定の日時
分タイマー
時タイマー
日タイマー
週タイマー
月タイマー
「編集時」と「値の変更」の違いがわからないので調査してみました。
英語の仕様書を参考にする
日本語だと「編集時」「値の変更」の違いがイマイチわかりませんでした。
英語のドキュメントだと
編集時
Specifies a trigger that will fire when the spreadsheet is edited.
→[訳] スプレッドシートが編集されたときに発動
値の変更
Specifies a trigger that will fire when the spreadsheet's content or structure is changed.
→[訳]スプレッドシートのコンテンツもしくは構成が変更されたら発動
トリガーの検証
次のようなシートを用意します。
B列には、onEdit()とonChange()が発動したときの時刻を記録するようにします。
スクリプトエディタは下記のようにします。 (※スプレッドシートのシート名は「回答」としています。)
function onEdit(event) { var spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); var answerSheet = spreadSheet.getSheetByName('回答'); answerSheet.getRange('B1').setValue('Last modified: ' + new Date()); } function onChange(event) { var spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); var answerSheet = spreadSheet.getSheetByName('回答'); answerSheet.getRange('B2').setValue('Last modified: ' + new Date()); }
シートのどこかに値を入れてみます。
するとB列の時刻が更新されました。 つまり、onEdit()が発動されました。
今値を入れたセルをdelキーで削除しても、onEdit()が発動しました。
一方、行削除・行追加・列削除・列追加などしてみましたが無反応。
イベントオブジェクトを参考にする
onEdit()とonChange()は引数にEventオブジェクトをとります。 このオブジェクトの構造を見てみます。
ドキュメントによると次のようなオブジェクトのようです。
onChange(event)
event.changeType
- The type of change (EDIT, INSERT_ROW, INSERT_COLUMN, REMOVE_ROW, REMOVE_COLUMN, INSERT_GRID, REMOVE_GRID, or OTHER)
onEdit(event)
event.range
e.value
onChange()のchangeTypeは日本語にすると
編集
行追加
列追加
行削除
列追加
グリッド挿入
グリッド削除
その他
となります。
一方onEdit()は、どのセルがどんな値になったかが取得できるようです。 これを見る限り、onChange()のchangeTypeがEDITの時にonEdit()も発動するという、部分集合の関係のように見えます。 ではなぜonChange()は発動しないのでしょうか。
それっぽい情報を見つけた。
トリガーを追加しろとのこと。 やってみました。
これで無事onChange()が発動するようになりました。
行や列の追加削除でonChange()が発動し、セルに値を入れたり削除した場合は、onEdit()とonChange()が両方発動します。
じゃあなぜonEdit()はトリガー設定していないのに動いるのでしょうか。。
結論
onChange()がうまく発動しないのがおかしいのか、トリガーの設定をしなくてもonEdit()だけは発動しているのがおかしいのかはわかりませんが、 onChange()はトリガー設定することで次の条件下で発動する。
セルの値の変更
行追加
列追加
行削除
列追加
グリッド挿入
グリッド削除
その他
onEdit()は同名の関数を定義しておくだけで、特にプロジェクトトリガーを設定しなくても、
- セルの値の変更
の際に発動する。
以上