ADVERTISEMENT

【Googleスプレッドシート】Apps Scriptで配列の合計をreduceで計算!sumを書かずに集計

【Googleスプレッドシート】Apps Scriptで配列の合計をreduceで計算!sumを書かずに集計
🛡️ 超解決

Apps Scriptでスプレッドシートのデータを処理するとき、配列の合計値を求める場面が頻繁にあります。forループでカウントするコードでも動きますが、JavaScriptの reduce メソッドを使うと1行で書けて可読性が大きく向上します。

reduce は配列の各要素を順に処理しながら累積値を1つに集約する関数型プログラミングのメソッドです。合計だけでなく、最大値、結合、グループ化など幅広い集約処理に応用できます。

本記事では、reduce の基本構文、合計計算の書き方、Apps Script特有の注意点、よくある応用パターンまでをまとめて解説します。

【要点】reduceで配列を集計する3つのポイント

  • arr.reduce((acc, cur) => acc + cur, 0) で合計: 1行で配列の合計が求められます。
  • 初期値0は必須: 空配列や型混在に対応するため、第2引数の初期値を必ず指定する習慣を付けます。
  • 2次元配列はflatで1次元化: getValuesは2次元なので arr.flat().reduce(…) のようにflatを挟みます。

ADVERTISEMENT

reduceメソッドの仕組み

reduce は配列の各要素を1つずつ受け取り、コールバック関数で前回の累積値と組み合わせて新しい累積値を返す処理を繰り返します。最終的に1つの値に集約された結果が戻り値になります。

基本構文は arr.reduce((acc, cur) => 計算式, 初期値) です。acc は accumulator(累積値)、cur は current(現在処理中の要素)を意味します。初期値を渡すと最初の累積値がその値になり、渡さないと配列の最初の要素が累積値の初期値として使われます。

空配列に対して初期値なしでreduceを呼ぶとエラーになるため、Apps Scriptで実務利用するときは必ず初期値を指定する習慣を付けるとバグを防げます。

Apps Scriptで合計を計算する基本手順

  1. スプレッドシートから値を取得します
    const range = SpreadsheetApp.getActiveSheet().getRange(“B2:B100”); const values = range.getValues(); で2次元配列が取得できます。
  2. 2次元配列を1次元化します
    const flat = values.flat(); で1次元配列に変換します。これでreduceが各要素を順に処理できる形になります。
  3. reduceで合計を計算します
    const sum = flat.reduce((acc, cur) => acc + cur, 0); で配列内のすべての数値の合計が変数 sum に格納されます。
  4. 結果を別セルに書き込みます
    SpreadsheetApp.getActiveSheet().getRange(“D1”).setValue(sum); で結果を D1 セルに反映します。
  5. ログで動作確認します
    console.log(sum); を入れておくと、Apps Script の実行ログでも結果を確認できます。デバッグ時に便利です。

reduceの応用パターン

  1. 最大値を求める
    const max = arr.reduce((acc, cur) => Math.max(acc, cur), -Infinity); のように書くと、Math.max を逐次適用して最大値が取れます。
  2. 文字列の連結
    const text = arr.reduce((acc, cur) => acc + cur + “, “, “”); で配列要素をカンマ区切りで連結できます。
  3. 条件付き合計
    const total = arr.reduce((acc, cur) => cur > 100 ? acc + cur : acc, 0); で100超の値だけ加算する条件付き集計が書けます。
  4. オブジェクトでグループ集計
    const grouped = arr.reduce((acc, cur) => { acc[cur.category] = (acc[cur.category] || 0) + cur.amount; return acc; }, {}); でカテゴリごとの合計を1回のループで作れます。
  5. filterとmapを組み合わせ
    const result = arr.filter(x => x.active).map(x => x.value).reduce((a, c) => a + c, 0); のようにチェーンして読みやすい集計処理が組めます。

ADVERTISEMENT

reduceでつまずきやすいパターン

初期値を忘れる

arr.reduce((a, c) => a + c) のように初期値なしで書くと、空配列でエラーになり、配列の型によっては想定外の挙動になります。実務利用では必ず第2引数に初期値(数値なら0、文字列なら””、配列なら[]、オブジェクトなら{})を指定してください。

2次元配列のままreduceする

getValuesの戻り値は [[1], [2], [3]] のような2次元配列です。直接reduceすると配列同士を加算しようとしてエラーになります。flat() で1次元化してからreduceするのが正しい手順です。

文字列と数値が混在

数値だけのつもりが文字列の “100” などが混じると、+演算子で文字列連結されてしまいます。Number(cur) や parseFloat(cur) で明示的に数値変換してから加算する防衛策が有効です。

パフォーマンスが期待ほど良くない

reduceは可読性は高いですが、forループより劇的に速いわけではありません。1000万件のような巨大データではfor文の方が若干速い場合もあります。可読性とのバランスで選択してください。

配列集計手法の比較

手法 可読性 適合シーン
reduce 非常に良い 合計・最大・グループ化など全般
forループ 初心者向け 巨大データ・複雑な制御
forEach 良い 副作用あり処理
SUM関数(数式) 非常に良い シート上で完結
map+reduce 良い 変換+集計のチェーン

まとめ

Apps Scriptで配列の合計を求めるならreduceが最も簡潔で可読性の高い書き方です。arr.reduce((acc, cur) => acc + cur, 0) のような1行で集計処理が完結し、合計だけでなく最大値・連結・グループ化など幅広い用途に応用できます。getValuesから取得した2次元配列はflatで1次元化してから処理する点、初期値を必ず指定する点を押さえれば、安定した集計処理が書けます。filter・mapと組み合わせたチェーン処理で、業務ロジックを宣言的に記述できる強力な手法として覚えてください。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

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