GASのonEditが動かないときは、実行方法、編集した操作、権限、処理時間の順に確認します。
公式ドキュメントに書かれた制限と、インストール型トリガーとの違いを整理しました。
- シンプルトリガーは、認可が必要なサービスを使えない。たとえばメール送信はできない
- シンプルトリガーの実行は、30秒まで
- 閲覧・コメント専用で開かれたときは動かない
- スクリプトやAPIによる変更では、起動しない
- 権限が要る処理は、インストール型トリガーにする
公式資料に基づく説明と掲載コードのローカル検証を掲載しています。
上限や仕様は、Googleの都合で変わることがあります。
数値は、公式ページで最新を確かめてください。
実行ボタンとセル編集の違い
エディターの実行ボタンからonEditを呼ぶと、編集イベントの引数eは渡されません。
e.rangeの読み取りでエラーになる場合は、練習用シートのセルに文字を直接入力して確認します。
シンプルトリガーを試す場合は、スプレッドシートの「拡張機能」からApps Scriptを開き、次の関数を保存します。
function onEdit(e) {
if (!e || !e.range) throw new Error('セルを直接編集してください。');
e.range.setNote('編集した範囲: ' + e.range.getA1Notation());
}編集したセルのメモに範囲名が入れば、イベントから関数まで実行されています。
この診断例は編集範囲の既存のメモを置き換えるため、メモのない練習用セルで試してください。
動かない原因
| 原因 | 公式の説明 |
|---|---|
| 認可が必要な処理をしている | シンプルトリガーは、認可が要るサービスにアクセスできない |
| 別のファイルを開こうとしている | 自分がバインドされたファイルだけを扱える |
| 処理が長い | 30秒を超えると止まる |
| 閲覧専用で開いている | 閲覧・コメント専用のモードでは動かない |
| スクリプトから書き換えた | スクリプトやAPI経由の変更では、起動しない |
| 編集が続けて入った | onEditは、最大2件までしかイベントをキューしない |
eオブジェクトの中身
onEdit(e) の e には、編集の情報が入ります。
- range:編集されたセルの範囲
- value:編集後の値。単一セルの編集のときだけ入る
- oldValue:単一セルの編集前の値。元が空の場合や複数セルの編集では利用できない
- source:スプレッドシートのオブジェクト
- user:編集した人。環境によっては取得できない
- authMode:シンプルトリガーでは LIMITED
triggerUid は、インストール型のときだけ入ります。
インストール型に切り替える
認可が必要な処理をしたいときは、シンプルトリガーの onEdit ではなく、インストール型トリガーを作ります。
function handleEdit(e) {
if (!e || !e.range) {
throw new Error('実行ボタンではなく、練習用シートのセルを直接編集してください。');
}
console.log('編集した範囲: ' + e.range.getA1Notation());
}
function createEditTrigger() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
if (!ss) throw new Error('スプレッドシートの「拡張機能」から開いてください。');
const exists = ScriptApp.getProjectTriggers().some(function (trigger) {
return trigger.getHandlerFunction() === 'handleEdit' &&
trigger.getEventType() === ScriptApp.EventType.ON_EDIT &&
trigger.getTriggerSourceId() === ss.getId();
});
if (exists) return;
ScriptApp.newTrigger('handleEdit').forSpreadsheet(ss).onEdit().create();
}関数名は、onEdit と別の名前にしてください。
同じ名前だと、シンプルトリガーとインストール型が、両方動くおそれがあります。
関連記事:GASのトリガーの設定方法
onEditの対象はセルの値の変更で、背景色などの書式だけを変更する操作とは区別します。
複数セルを貼り付けた場合はe.valueに頼らず、e.range.getValues()で範囲の値を読みます。
まとめ
- onEditの制限は、認可・別ファイル・30秒・閲覧専用
- スクリプトからの変更では動かない
- 権限が要るなら、インストール型トリガーにする
参考:Google Apps Script「Simple Triggers」「Event Objects」「Installable Triggers」(2026年9月30日確認)。
インストール型の確認と後片付け
createEditTriggerを実行した後にセルを編集し、「実行数」でhandleEditのログを確認します。
上のシンプルトリガーの診断例は、インストール型へ切り替える前に削除するか、onEdit以外の名前へ変更してください。
createEditTriggerは同じシート・関数・編集イベントの登録を確認しますが、別アカウントが作ったトリガーは確認できません。
試験を終えたら「トリガー」でhandleEditの登録を削除し、練習用セルのメモも消します。
確認した範囲と公式資料
2026年10月2日に公式資料と掲載コードを照合しました。
コードの分岐はGoogleのサービスを代替したローカルテストで確認し、実サービスでの実行とは区別しています。
GAS上の認可・トリガー発火・同時実行は未検証です。
