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で合計を計算する基本手順
- スプレッドシートから値を取得します
const range = SpreadsheetApp.getActiveSheet().getRange(“B2:B100”); const values = range.getValues(); で2次元配列が取得できます。 - 2次元配列を1次元化します
const flat = values.flat(); で1次元配列に変換します。これでreduceが各要素を順に処理できる形になります。 - reduceで合計を計算します
const sum = flat.reduce((acc, cur) => acc + cur, 0); で配列内のすべての数値の合計が変数 sum に格納されます。 - 結果を別セルに書き込みます
SpreadsheetApp.getActiveSheet().getRange(“D1”).setValue(sum); で結果を D1 セルに反映します。 - ログで動作確認します
console.log(sum); を入れておくと、Apps Script の実行ログでも結果を確認できます。デバッグ時に便利です。
reduceの応用パターン
- 最大値を求める
const max = arr.reduce((acc, cur) => Math.max(acc, cur), -Infinity); のように書くと、Math.max を逐次適用して最大値が取れます。 - 文字列の連結
const text = arr.reduce((acc, cur) => acc + cur + “, “, “”); で配列要素をカンマ区切りで連結できます。 - 条件付き合計
const total = arr.reduce((acc, cur) => cur > 100 ? acc + cur : acc, 0); で100超の値だけ加算する条件付き集計が書けます。 - オブジェクトでグループ集計
const grouped = arr.reduce((acc, cur) => { acc[cur.category] = (acc[cur.category] || 0) + cur.amount; return acc; }, {}); でカテゴリごとの合計を1回のループで作れます。 - 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
超解決 第一編集部
疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。
Googleスプレッドシートの人気記事ランキング
- 【Googleスプレッドシート】GOOGLEFINANCE関数で株価・為替を取得!リアルタイムデータの呼び出し
- 【Googleスプレッドシート】印刷範囲を指定して印刷!特定範囲だけPDFや紙に出す手順
- 【Googleスプレッドシート】新しいスプレッドシートを作成する3つの方法!ドライブ・URL・テンプレート
- 【Googleスプレッドシート】数値の連続データを自動入力!オートフィルの活用
- 【Googleスプレッドシート】ダークモードを有効にする!目に優しい配色への切替
- 【Googleスプレッドシート】株価APIで株式データを自動取得!GOOGLEFINANCE超え活用
- 【Googleスプレッドシート】共有相手が編集できない時のチェック!権限と許可状態の確認
- 【Googleスプレッドシート】ページ設定で用紙サイズと向きを調整!印刷レイアウトの基本
- 【Googleスプレッドシート】Excelファイルxlsxをインポートする手順!ドラッグ&ドロップで取り込み
- 【Googleスプレッドシート】条件付き書式をコピーする!書式のみペーストの活用
