スキップしてメイン コンテンツに移動

GAS配列操作で高速化術

GAS配列操作で高速化術

GAS基礎と配列ラッパー

Google Apps Script(GAS)は、Google Workspace のサービスを自動化するための JavaScript ベースのプラットフォームです。GAS で配列を扱う際に便利なのが「配列ラッパー」クラスです。配列ラッパーは、標準の配列に対してメソッドチェーンを可能にし、コードをより宣言的に書けるようにします。

以下は、配列ラッパーを使った簡単な例です。

class ArrayWrapper {
  constructor(arr) { this.arr = arr; }
  forEach(fn) { this.arr.forEach(fn); return this; }
  map(fn) { this.arr = this.arr.map(fn); return this; }
  filter(fn) { this.arr = this.arr.filter(fn); return this; }
  reduce(fn, init) { return this.arr.reduce(fn, init); }
}
const numbers = new ArrayWrapper([1,2,3,4,5]);
numbers
  .map(n => n * 2)
  .filter(n => n > 5)
  .forEach(n => console.log(n)); // 6, 8, 10

配列ラッパーを使うことで、forEach、map、filter、reduce といった高階関数を連続して呼び出せるため、可読性が向上します。

高階関数とコールバック関数

JavaScript では、関数を引数に取る「高階関数」が頻繁に使われます。GAS でも同様に、forEach、map、filter、reduce はすべてコールバック関数を受け取ります。コールバック関数は、配列の各要素に対して実行される小さな処理を定義します。

アロー関数を使うと、コールバック関数を短く書けます。例えば、次のように書けます。

const evens = numbers.filter(n => n % 2 === 0);
const sum = numbers.reduce((acc, n) => acc + n, 0);

ここで、filterreduce は高階関数であり、n => n % 2 === 0(acc, n) => acc + n がコールバック関数です。アロー関数を使うことで、関数宣言の冗長さを減らし、コードをコンパクトに保てます。

効率化の実践

配列操作を行う際に注意したいのは、不要な中間配列を作らないことです。例えば、次のように書くと、map と filter の結果が別々の配列として生成されます。

const result = numbers.map(n => n * 2).filter(n => n > 5);

この場合、map の結果が一時的にメモリに保持され、filter がそれを再度走査します。配列ラッパーを使うと、内部で一度だけ走査して複数の操作を実行できるように設計できます。

さらに、GAS では SpreadsheetApp の getValues() で取得した 2 次元配列を一括で処理する際に、forEach ではなく reduce を使って集計すると、スクリプトの実行時間を短縮できます。

const data = sheet.getDataRange().getValues();
const totals = data.reduce((acc, row) => {
  acc.sum += row[0];
  return acc;
}, { sum: 0 });

このように、配列ラッパーと高階関数、アロー関数を組み合わせることで、GAS のスクリプトを効率化し、保守性を高めることができます。

この記事はAIによって作成されました。

コメント