ADVERTISEMENT

【Googleスプレッドシート】Apps ScriptのonChangeトリガーで構造変更を検知!行追加への対応

【Googleスプレッドシート】Apps ScriptのonChangeトリガーで構造変更を検知!行追加への対応
🛡️ 超解決

スプレッドシートで行や列を追加・削除したときに、自動で特定の処理を実行したいと思ったことはありませんか。例えば、新しい行が追加されたら自動的にデータを別のシートに転記したい、または列が削除されたら警告を出したいといったケースです。通常のonEditトリガーではセル値の変更しか検知できませんが、構造変更(行や列の挿入・削除)を検知するにはonChangeトリガーを使います。この記事では、Apps ScriptのonChangeトリガーを用いて構造変更を検知し、行追加に応答する具体的なコードと設定手順を解説します。

【要点】onChangeトリガーで行追加を自動検知する方法

  • onChangeトリガーの設定: スクリプトエディタからインストーラブルトリガーとして追加します。変更タイプ「変更時」を選択し、関数名を指定するだけで完了します。
  • changeTypeプロパティで構造変更を識別: イベントオブジェクトのchangeTypeが「INSERT_ROW」「INSERT_COLUMN」などの文字列で、変更内容を正確に判別できます。
  • 行追加時に別シートへデータ転記: テンプレート行の内容を新しい行へ自動コピーすることで、データ入力の手間を省くことができます。

ADVERTISEMENT

onChangeトリガーで構造変更を検知する仕組み

スプレッドシートのApps Scriptには、ユーザーの操作に応じて自動実行されるトリガーが複数あります。最もよく使われるonEditトリガーは、セルの値が編集されたときに発火しますが、行や列の挿入・削除といった「構造変更」には反応しません。一方、onChangeトリガーは、値の変更に加えて、行の挿入・削除、列の挿入・削除、シートの追加・削除、並べ替えなど、より広範な変更を検知できます。トリガーが発火したときに渡されるイベントオブジェクト(e)の中には、changeTypeプロパティが含まれており、その値を見ることでどのような変更が発生したかを特定できます。

主なchangeTypeの値は次のとおりです。

  • INSERT_ROW: 行が挿入されたとき
  • REMOVE_ROW: 行が削除されたとき
  • INSERT_COLUMN: 列が挿入されたとき
  • REMOVE_COLUMN: 列が削除されたとき
  • INSERT_GRID: 新しいシートが追加されたとき
  • REMOVE_GRID: シートが削除されたとき
  • OTHER: 上記以外の変更(値の編集も含まれます)

これらの値を使って、特定の構造変更が発生したときだけ処理を実行するように条件分岐を記述します。なお、onChangeトリガーはインストーラブルトリガーとして設定する必要があり、単純な関数名のトリガーでは自動認識されません。設定手順は後述します。

onChangeトリガーを設定して行追加を検知する手順

手順1: スクリプトエディタを開く

  1. 拡張機能メニューからApps Scriptを起動します
    スプレッドシートのメニュー「拡張機能」→「Apps Script」をクリックしてください。新しいタブでスクリプトエディタが開きます。

手順2: onChange関数を作成する

  1. コード.gsに以下のサンプルコードを記述します
    次のコードは、行が挿入されたときに特定の処理(ここではログ出力とメッセージ表示)を実行する例です。必要に応じて処理内容を変更してください。
function myOnChange(e) {
  var sheet = e.source.getActiveSheet();
  var range = e.range;
  var changeType = e.changeType;
  
  if (changeType === 'INSERT_ROW') {
    Logger.log('行が追加されました。追加範囲: ' + range.getA1Notation());
    
    // 例: 追加された行のA列に日付を自動入力
    var row = range.getRow();
    var numRows = range.getNumRows();
    sheet.getRange(row, 1, numRows, 1).setValue(new Date());
    
    // ユーザーへの通知(オプション)
    SpreadsheetApp.getUi().alert('行が追加されました。自動的に日付を入力しました。');
  }
}

手順3: インストーラブルトリガーを設定する

  1. トリガー管理画面を開きます
    スクリプトエディタの左側メニューにある「トリガー」アイコン(時計のようなアイコン)をクリックしてください。
  2. 「トリガーを追加」ボタンをクリックします
    画面右下の「トリガーを追加」をクリックすると、トリガー設定ダイアログが表示されます。
  3. 以下のように設定します
    • 実行する関数: 「myOnChange」(上記で作成した関数名)
    • 実行するデプロイ: 「Head」(デフォルトのまま)
    • イベントのソース: 「スプレッドシートから」
    • イベントの種類: 「変更時」
    • エラー通知の設定: お好みで(推奨: 「毎日」または「毎週」)
  4. 「保存」をクリックします
    初回保存時に承認を求められますので、必要な権限を許可してください。

手順4: 動作を確認する

  1. スプレッドシートに戻り、行を追加してみます
    行を右クリックして「行を1行追加」を選択するか、メニューの「挿入」→「行を上に追加」などを実行してください。
  2. スクリプトエディタの実行ログを確認します
    スクリプトエディタの「実行」→「ログを表示」で、ログに行追加が記録されていることを確認できます。また、自動入力やアラートが正常に動作しているかも確認してください。

onChangeトリガー使用時の注意点とよくあるトラブル

changeTypeが「OTHER」しか返ってこない

この問題は、トリガーの設定が正しく行われていない場合に発生します。特に、単純な「onChange」という関数名だけでは、スプレッドシートが自動的にトリガーを認識しないため、必ずインストーラブルトリガーとして手動で設定してください。また、関数名を間違えていないか、トリガー一覧に正しく登録されているかを確認します。

行追加の検知が遅れる・動作が不安定

onChangeトリガーは即時実行されるわけではなく、Googleのサーバー側でキューイングされるため、タイムラグが生じることがあります。特に大量の行を一括操作した場合、すべての変更に対して個別にトリガーが発火するのではなく、まとめて処理されることもあります。このような場合、e.rangeオブジェクトを使用して、変更が行われた範囲を正確に把握することが重要です。

行追加以外の構造変更も検知してしまう

例えば、列の挿入やシート追加などもonChangeトリガーで検知されます。不要な変更を無視するには、条件文でchangeTypeを明示的にチェックします。上のサンプルコードのように、if (changeType === ‘INSERT_ROW’) とすることで、行追加のみに処理を限定できます。

トリガーの実行制限に注意

Apps Scriptには1日あたりのトリガー実行時間に制限があります(コンシューマーアカウントで90分/日)。onChangeトリガーが頻繁に発火するシートでは、この制限を超える可能性があります。重い処理を毎回実行するのではなく、必要なときだけ最小限の処理を行うように設計してください。

ADVERTISEMENT

挿入行への自動データ入力の応用例

行追加時にテンプレート行の内容を自動的にコピーしたい場合があります。例えば、見出し行の下に行を追加するたびに、書式や数式、デフォルト値を引き継ぎたいケースです。以下のコードは、追加された行の上にあるテンプレート行(例えば2行目)の内容を新しい行にコピーします。

function myOnChange(e) {
  if (e.changeType !== 'INSERT_ROW') return;
  var sheet = e.source.getActiveSheet();
  var range = e.range;
  var row = range.getRow();
  var numRows = range.getNumRows();
  var templateRow = 2; // テンプレート行(例:2行目)
  var lastColumn = sheet.getLastColumn();
  
  // テンプレート行のデータを取得
  var templateValues = sheet.getRange(templateRow, 1, 1, lastColumn).getValues()[0];
  // 新しい行に貼り付け
  sheet.getRange(row, 1, numRows, lastColumn).setValues(
    Array(numRows).fill(templateValues)
  );
}

このコードでは、追加された行の範囲(複数行の場合もある)に、テンプレート行の値をコピーしています。ただし、数式や書式はコピーされないため、必要に応じてcopyToメソッドを使用してください。

onChangeトリガーとonEditトリガーの比較

項目 onChangeトリガー onEditトリガー
検知できる変更 セル編集、行/列挿入・削除、シート追加・削除、並べ替えなど セル値の編集のみ
トリガーの種類 インストーラブルトリガーのみ 単純トリガー(onEdit関数名)またはインストーラブル
イベントオブジェクトの構造 changeType、range、source、user、authModeなど range、value、oldValue、source、user、authModeなど
使用例 行追加時に自動入力、列削除時に警告など セル編集時の自動計算、データ検証など

この表からわかるように、構造変更を検知したい場合はonChangeトリガーが唯一の選択肢です。ただし、単純なセル編集のみで十分な場合は、負荷の少ないonEditトリガーを使用することをおすすめします。

まとめ

この記事では、Apps ScriptのonChangeトリガーを使ってスプレッドシートの行追加を検知する方法を解説しました。トリガーの設定手順、イベントオブジェクトのchangeTypeによる識別方法、さらに応用として行追加時の自動データ入力を紹介しました。これらのテクニックを活用すれば、手動操作の手間を削減し、シートの管理を効率化できます。次に、列削除の検知や複数シートへの展開など、さらに高度な自動化にも挑戦してみてください。具体的には、changeTypeを「REMOVE_COLUMN」に変更した関数を追加することで、列削除時の警告表示も実現可能です。ぜひ実際のワークフローに合わせてカスタマイズしてみてください。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

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