🦆

【GAS】Spreadsheetの「編集」「変更」トリガーを整理しておく

に公開

なぜ作成したのか

  • AppsheetでSpreadsheet更新してGASで自動処理、なんて実装しているとonEdit(e)起動されないから結局時間トリガーで非同期実行なんていう蛮行を繰り返しているのでぼちぼちお行儀良い実装にしたい今日この頃

質問(to ChatGPT)

GAS、AppsheetでSpreadSheetを操作した際、Spreadsheetの「編集」「変更」に対するイベント操作を実装しても意図通りに稼働しないことがあります。それぞれのイベント特性、操作元の違いによる挙動の違いや注意点について解説してください。

概要

  • GAS(Google Apps Script)や AppSheet を使用して Google スプレッドシートを操作する場合、「編集」や「変更」に対するイベントトリガー(onEdit、onChangeなど)が 意図通りに動作しないことがある というのはよくある現象です。
  • その原因は、イベントの種類と発生条件操作元(人が直接編集するのか、AppSheetなどのアプリ経由なのか、GASなどのスクリプト経由なのか) によって挙動が異なるためです。

イベントトリガーの種類と特性

トリガー名 発火条件 注意点・制限
onEdit(e) ユーザーがシート上で手動でセルを編集した時 単純なセル編集のみ(関数更新や行挿入は対象外)
onChange(e) シート構造の変化や関数更新、行挿入など AppSheetからの変更には反応しないことがある
onFormSubmit(e) Googleフォーム経由の送信 AppSheetや直接入力では発火しない

操作元による違いと挙動

操作元 onEdit 発火 onChange 発火 備考
ユーザーが直接シートを編集 基本的にすべてのイベントが有効
GASスクリプト (setValue等) 自動トリガーでは動作しない(編集とみなされない)
AppSheetからの編集 ❌ or ✅ ❌ or ✅ 編集方法により挙動が異なる(詳細後述)
Googleフォーム送信 onFormSubmitがメインイベント

AppSheet による編集の特殊性

  • AppSheet は バックエンドでAPI的にスプレッドシートを書き換えている (と思われる)ため、GASのトリガーが反応しないことがあります。特に以下のような点に注意が必要です:

1. onEditが反応しないケースがある

  • AppSheet の編集は、Apps Script から見て「人による手動編集」ではなく、プログラム的な変更として扱われることがあります。
  • このため、onEditが発火しない場合があります。

2. onChangeも反応しないケース

  • AppSheetはシート構造(行挿入、削除など)を変更するわけではなく、セルの値を更新するだけなので、onChangeも反応しない場合があります。

3. ワークアラウンド

  • AppSheet 側で「Webhook」や「App Script連携」を使い、変更後に明示的にGAS関数を呼び出すことで対応可能。
  • AppSheetで編集されたことを検知したいなら、監視用の列やログシートを設けて、GASで定期チェック(Time-driven trigger) を使う方法が現実的。

実装・運用上の注意点

GASのトリガー制限

  • インストール型トリガーでないと、スプレッドシートAPIでの変更を検知できない。
  • onEditonChangeは「インストール型トリガー(ユーザーが明示的に設定)」にすることで、GAS以外の一部操作にも反応するようになる。

セキュリティと実行権限

  • AppSheet経由でスクリプトを実行する場合、OAuthやApp Script連携の認可が必要。
  • インストール型トリガーは、そのトリガーを設定したユーザーの権限で動作する。

対応方針まとめ

要件 推奨対応方法
AppSheetによる編集後に処理を実行したい AppSheet → Webhook → GAS関数呼び出し
編集内容のログを取りたい GASで定期実行(時間トリガー)して差分比較
通常の手動編集だけ処理したい onEdit(e)で十分
フォーム送信時処理したい onFormSubmit(e)を使う

補足:GASのトリガー

https://blog.g-gen.co.jp/entry/google-apps-script-edit-vs-change-trigger

シンプルなトリガー インストール可能なトリガー
使い方 用途に応じた関数名のいずれかを使用して関数を作成する(onOpen、onEdit など) ユーザーが明示的に設定画面から設定する
特徴 スプレッドシート等を操作しているユーザーのアカウントで実行される 常にトリガー設定時に認証したユーザーのアカウントで実行される
  • 「シンプルなトリガー」と「インストール可能なトリガー」では、検知できるイベントが異なります。

https://developers.google.com/apps-script/guides/triggers?hl=ja#available_types_of_triggers

イベント シンプルなトリガー インストール可能なトリガー
開く function onOpen(e)
Google FormGoogle SpreadsheetGoogle Slide
Google FormGoogle Spreadsheet
編集 function onEdit(e)
Google Spreadsheet
Google Spreadsheet
選択内容の変更 function onSelectionChange(e)
Google Spreadsheet
インストール function onInstall(e)
Google FormGoogle SpreadsheetGoogle Slide
変更 Google Spreadsheet
フォームの送信 Google SpreadsheetGoogle Form
時間主導型(時計) Google FormGoogle SpreadsheetGoogle SlideGoogle App Script
Get function doGet(e)
Google App Script
投稿 function doPost(e)
Google App Script

所感

  • まとめてみたけど結果、変更イベントよくわからん、となった。
  • 特にGoogleのイベント表にfunction onChange(e)がないのは何故なの。。。?
  • 今しばらく非同期実行と仲良くしておかねばなるまい
GitHubで編集を提案

Discussion