GASイベントで編集セル高速化
GAS実践でイベントオブジェクトを活用する
Google Apps Script(GAS)では、スプレッドシートの編集やフォーム送信などのトリガーが発火すると、e というイベントオブジェクトが渡されます。e.range、e.value、e.source などのプロパティを使うことで、編集されたセルの位置や値、対象のスプレッドシートを簡単に取得できます。
function onEdit(e) {
var range = e.range; // 編集されたセルの範囲
var value = e.value; // 新しい値
var sheet = e.source.getActiveSheet(); // 対象シート
Logger.log('セル ' + range.getA1Notation() + ' が ' + value + ' に変更されました。');
}
この基本形をベースに、さらに条件付き実行や高速化を図るためのテクニックを紹介します。
編集セルの変更検知と条件付き実行
編集セルが特定の列や行に限定される場合、e.range.getColumn() や e.range.getRow() を使って条件分岐します。以下は、列Aに入力があったときだけ処理を実行する例です。
function onEdit(e) {
if (e.range.getColumn() !== 1) return; // 列A以外は無視
// ここに処理を書く
}
さらに、入力値が空でないことを確認することで、不要な処理を省くことができます。
if (!e.value) return; // 空文字はスキップ
このように条件付き実行を組み込むことで、スクリプトの実行時間を短縮し、トリガーの制限に対処できます。
高速化とコンテキスト管理
GASは実行時間に制限があるため、頻繁に呼び出される onEdit では「バッチ処理」や「キャッシュ」を活用して高速化します。例えば、複数セルの変更をまとめて処理する場合は、e.range.getValues() を使って一括取得し、ループ内で個別に処理するよりも高速です。
function onEdit(e) {
var values = e.range.getValues(); // 変更された範囲全体を取得
values.forEach(function(row, i) {
// 行ごとの処理
});
}
また、PropertiesService を使ってスクリプトのコンテキスト(設定や状態)を保存し、次回の実行時に再利用することで、初期化コストを削減できます。
var scriptProps = PropertiesService.getScriptProperties();
var lastRun = scriptProps.getProperty('lastRun');
if (!lastRun || (new Date() - new Date(lastRun)) > 60000) {
// 1分以上経過したら再実行
scriptProps.setProperty('lastRun', new Date());
}
これらのテクニックを組み合わせることで、GAS実践におけるイベントオブジェクトの活用から高速化、コンテキスト管理まで一貫したパフォーマンスを実現できます。
コメント
コメントを投稿