セルを編集したときに処理したい(onEdit)

1function onEdit(e) {
2    // 編集されたセルに、編集時刻をメモとして残す
3    e.range.setNote(`最終更新: ${new Date()}`);
4}

onEdit関数は、スプレッドシートのセルを手動で編集したときに自動で呼ばれる関数です。

onEditはシンプルトリガーなので、トリガーの登録は不要です。 その代わり、次の制約があります。

  • 手動の編集でのみ実行される(setValueなどスクリプトからの変更では実行されない)

  • メールの送信など、認可が必要な操作はできない

  • 実行時間は30秒まで

引数したい(e)

onEdit(e)の引数eには、編集の情報が入っています。

プロパティ

内容

e.range

編集されたセル(Range)

e.value

編集後の値。単一セルのときだけ入る

e.oldValue

編集前の値。単一セルのときだけ入る

e.source

スプレッドシート(Spreadsheet)

e.user

編集したユーザー(User)

e.authMode

認可モード(ScriptApp.AuthMode)

複数セルをまとめて編集したときはe.valueとe.oldValueがundefinedになります。 その場合はe.range.getValues()で範囲の値を取得します。

ステータスの変更で処理したい

 1function onEdit(e) {
 2    const sheet = e.range.getSheet();
 3
 4    // 「申請」シートのC列(ステータス列)だけを対象にする
 5    if (sheet.getName() !== "申請") return;
 6    if (e.range.getColumn() !== 3) return;
 7
 8    // 「未処理」→「承認」に変わったときだけ発動する
 9    if (e.oldValue === "未処理" && e.value === "承認") {
10        // 承認した日時を隣のD列に書き込む
11        e.range.offset(0, 1).setValue(new Date());
12    }
13}

e.rangeからgetSheet・getColumnで編集位置を絞り、 e.oldValueとe.valueで「どの値からどの値に変わったか」を判定します。 e.oldValueとe.valueは単一セルの編集でしか入らないので、 このパターンはセルを1つずつ編集する運用に向いています。

リファレンス