ADVERTISEMENT

【Googleスプレッドシート】onEdit トリガーの基本!編集時に自動実行する関数

【Googleスプレッドシート】onEdit トリガーの基本!編集時に自動実行する関数
🛡️ 超解決

スプレッドシートでセルを編集した瞬間に、自動で計算やデータ転送を行いたいと思ったことはありませんか。onEditトリガーを使えば、編集をトリガーに任意の処理を実行できます。この記事では、onEditトリガーの基本的な仕組みと、実際に使える関数の書き方を解説します。初めての方でも理解できるよう、具体例を交えながら進めます。

【要点】onEditトリガーで編集を自動検知する

  • onEdit(e)関数の基本形: eオブジェクトから編集情報を取得し、条件分岐と処理を記述します。
  • シート名やセル範囲の判定: e.rangeやe.sourceを使って特定のシート・セルだけ反応させます。
  • 元の値と新しい値の取得: e.oldValueとe.valueで編集前後の値を取得できます。

ADVERTISEMENT

onEditトリガーの仕組みと特徴

onEditトリガーは、Google Apps Scriptのシンプルトリガーの一つです。特別な設定なしで、スプレッドシートに紐づいたスクリプト内にonEdit(e)という名前の関数を定義するだけで、編集時に自動実行されます。引数eには編集に関する詳細な情報が含まれており、それを利用して柔軟な処理が可能です。例えば、編集されたセルの範囲やシート情報、変更前後の値を取得できます。

onEditトリガーは、セルの値が手動で変更された場合にのみ発動します。コピー&ペーストや入力規則による変更、関数の再計算ではトリガーされません。また、変更が確定した後に呼び出されるため、処理中に編集をキャンセルすることはできません。実行時間は30秒以内に収める必要があり、1時間あたりの総実行時間にも制限があります。これらの制約を理解した上で活用しましょう。

eオブジェクトが持つ主なプロパティは以下の通りです。
・e.range: 編集されたセル範囲(Rangeオブジェクト)
・e.source: アクティブなスプレッドシート(Spreadsheetオブジェクト)
・e.value: 編集後の新しい値(文字列編集のみ)
・e.oldValue: 編集前の古い値(文字列編集のみ)
・e.user: 編集者のメールアドレス(権限が必要)

onEditトリガーを使った関数の書き方

ここでは、実際にonEdit関数を記述する手順を説明します。サンプルコードを参考に、ご自身の用途に合わせてカスタマイズしてください。

  1. スクリプトエディタを開く
    スプレッドシートのメニューから「拡張機能」→「Apps Script」をクリックします。新しいタブでスクリプトエディタが開きます。
  2. onEdit関数を定義する
    エディタに関数名「onEdit(e)」を記述します。関数名は必ずこの形式でなければなりません。引数eには編集情報が自動で渡されます。以下のコードをそのまま入力してください。
function onEdit(e) {
  // ここに処理を記述
  var range = e.range;
  var sheet = range.getSheet();
  var value = e.value;
}
  1. シート名とセル範囲を判定する
    特定のシートやセル範囲だけに反応させるには、条件文を追加します。例えば、シート名が「データ」で、A列(1列目)が編集された場合のみ処理を実行するには、次のように記述します。
function onEdit(e) {
  var range = e.range;
  var sheet = range.getSheet();
  if (sheet.getName() !== 'データ') return;
  if (range.getColumn() !== 1) return;
  // ここに処理を記述
}
  1. 編集内容に応じた処理を実装する
    例として、A列に値が入力されたらB列に現在の日時をタイムスタンプとして書き込むコードを紹介します。以下のコードを入力し、保存してスプレッドシートに戻り、A列のセルを編集してみてください。
function onEdit(e) {
  var range = e.range;
  var sheet = range.getSheet();
  if (sheet.getName() !== 'シート1') return;
  if (range.getColumn() !== 1) return;
  var row = range.getRow();
  var targetCell = sheet.getRange(row, 2);
  targetCell.setValue(new Date());
}

この例では、シート名「シート1」のA列のみを対象としています。編集されたセルの行と同じ行のB列に現在時刻を設定します。targetCell.setValue(new Date())の部分を変えれば、別のデータを書き込むことも可能です。

複数のセルを編集した場合、e.rangeは編集範囲全体を表します。範囲内の全セルに対して処理を行うには、e.range.getValues()で値を取得し、ループで処理します。ただし、大量のセルを一度に編集すると実行時間制限に引っかかる可能性があるため注意しましょう。

よくあるエラーと注意点

無限ループが発生する

onEdit関数内でスプレッドシートの値を変更すると、その変更が再度onEditを呼び出し、無限ループを引き起こすことがあります。回避するには、編集を行った後にトリガーを一時的に無効化するか、上書きするセルが条件に合わないようにします。例えば、特定の列だけ編集を許可する、変更したセルが対象外の場合は処理をスキップするなどの工夫が必要です。

実行に時間がかかりすぎる

onEdit関数の実行時間は30秒以内に制限されています。複雑なループや外部API呼び出しを行うと、タイムアウトエラーが発生します。短時間で完了する処理に留め、大量データの処理はバッチ処理や別のトリガーに任せることを検討しましょう。

変更が反映されない

コードが正しくても、保存忘れや権限不足で動作しない場合があります。スクリプトエディタで保存ボタンをクリックしたことを確認し、実行ログ(表示→ログ)でエラーの有無を確認します。また、編集権限がないシートではトリガーが発動しません。

ADVERTISEMENT

onEditと他のトリガーの比較

トリガー トリガー条件 特徴 利用シーン
onEdit 手動のセル編集 設定不要、即時実行、制限あり 入力チェック、自動計算、ログ記録
onChange シート構造の変更(行追加など) 編集だけでなく挿入・削除にも反応 フォーム送信後の処理、データ整形
onOpen スプレッドシートを開く 表示専用、メニュー作成に活用 カスタムメニューの追加、初期化処理
時間主導トリガー 指定時刻・間隔 定期的な実行、バッチ処理向き データ集計、メール自動送信

onEditは最も手軽に使えるトリガーですが、編集以外のイベントには対応しません。onChangeや時間主導トリガーと組み合わせることで、より複雑な自動化が実現できます。

まとめ

この記事では、onEditトリガーの基本的な仕組みと実際のコード例を解説しました。特別な設定なしに、セルの編集をトリガーにスクリプトを自動実行できることがお分かりいただけたと思います。まずは簡単なタイムスタンプ挿入から試し、徐々に条件分岐や複数シート対応へと発展させてみてください。次のステップとしては、インストーラブルトリガーを設定して、onEditでは扱えないイベント(時間指定や編集以外の変更)に対応する方法を学ぶことをおすすめします。

ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。