🦆
【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での変更を検知できない。
-
onEdit
やonChange
は「インストール型トリガー(ユーザーが明示的に設定)」にすることで、GAS以外の一部操作にも反応するようになる。
セキュリティと実行権限
- AppSheet経由でスクリプトを実行する場合、OAuthやApp Script連携の認可が必要。
- インストール型トリガーは、そのトリガーを設定したユーザーの権限で動作する。
対応方針まとめ
要件 | 推奨対応方法 |
---|---|
AppSheetによる編集後に処理を実行したい | AppSheet → Webhook → GAS関数呼び出し |
編集内容のログを取りたい | GASで定期実行(時間トリガー)して差分比較 |
通常の手動編集だけ処理したい |
onEdit(e) で十分 |
フォーム送信時処理したい |
onFormSubmit(e) を使う |
補足:GASのトリガー
- トリガーとは、GAS のスクリプトが実行される契機となる設定。
- GAS のトリガーには大きく分けて以下の2種類。
シンプルなトリガー | インストール可能なトリガー | |
---|---|---|
使い方 | 用途に応じた関数名のいずれかを使用して関数を作成する(onOpen、onEdit など) | ユーザーが明示的に設定画面から設定する |
特徴 | スプレッドシート等を操作しているユーザーのアカウントで実行される | 常にトリガー設定時に認証したユーザーのアカウントで実行される |
- 「シンプルなトリガー」と「インストール可能なトリガー」では、検知できるイベントが異なります。
イベント | シンプルなトリガー | インストール可能なトリガー |
---|---|---|
開く | function onOpen(e)![]() ![]() ![]() ![]() |
![]() ![]() ![]() |
編集 | function onEdit(e)![]() |
![]() |
選択内容の変更 | function onSelectionChange(e)![]() |
|
インストール | function onInstall(e)![]() ![]() ![]() ![]() |
|
変更 | ![]() |
|
フォームの送信 |
![]() ![]() |
|
時間主導型(時計) |
![]() ![]() ![]() ![]() ![]() |
|
Get | function doGet(e)![]() |
|
投稿 | function doPost(e)![]() |
所感
- まとめてみたけど結果、変更イベントよくわからん、となった。
- 特にGoogleのイベント表にfunction onChange(e)がないのは何故なの。。。?
- 今しばらく非同期実行と仲良くしておかねばなるまい
Discussion