まだ中学生のブログ

スマホ関連、Google関連のことを書いてます。IT系勤務、既婚、精神年齢:中学生。

Google Spreadsheetのトリガーの「編集時」と「値の変更」の違いを検証してみた

Google Spreadsheetのトリガーの種類の検証

f:id:madachugakusei:20151018130935p:plain

調査対象のトリガー

トリガーの種類は次のとおりです。

  • スプレッドシートから

    • 起動時

    • 編集時

    • 値の変更

    • フォーム送信時

  • 時間主導型

    • 特定の日時

    • 分タイマー

    • 時タイマー

    • 日タイマー

    • 週タイマー

    • 月タイマー

「編集時」と「値の変更」の違いがわからないので調査してみました。

英語の仕様書を参考にする

日本語だと「編集時」「値の変更」の違いがイマイチわかりませんでした。

英語のドキュメントだと

  • 編集時

    • 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.

    • →[訳]スプレッドシートのコンテンツもしくは構成が変更されたら発動

トリガーの検証

次のようなシートを用意します。

f:id:madachugakusei:20151018133336p:plain

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());
}

シートのどこかに値を入れてみます。

f:id:madachugakusei:20151018134201p:plain

すると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()が発動しない

トリガーを追加しろとのこと。 やってみました。

f:id:madachugakusei:20151018135528p:plain

これで無事onChange()が発動するようになりました。

行や列の追加削除でonChange()が発動し、セルに値を入れたり削除した場合は、onEdit()とonChange()が両方発動します。

じゃあなぜonEdit()はトリガー設定していないのに動いるのでしょうか。。

結論

onChange()がうまく発動しないのがおかしいのか、トリガーの設定をしなくてもonEdit()だけは発動しているのがおかしいのかはわかりませんが、 onChange()はトリガー設定することで次の条件下で発動する。

  • セルの値の変更

  • 行追加

  • 列追加

  • 行削除

  • 列追加

  • グリッド挿入

  • グリッド削除

  • その他

onEdit()は同名の関数を定義しておくだけで、特にプロジェクトトリガーを設定しなくても、

  • セルの値の変更

の際に発動する。


以上