ADVERTISEMENT

【Googleスプレッドシート】REDUCE関数で配列集約!累積計算の実装

【Googleスプレッドシート】REDUCE関数で配列集約!累積計算の実装
🛡️ 超解決

Googleスプレッドシートで大量のデータを集計するとき、SUMやAVERAGEだけでは対応できない複雑な累積計算が必要になることがあります。特に、前の計算結果を次の行で参照しながら値の累積を求めたい場合、通常の関数では一発で処理できません。そんなときに役立つのがREDUCE関数です。この記事では、REDUCE関数を使って配列を集約し、累積計算を実装する具体的な手順を解説します。

REDUCE関数は、配列の各要素に対して繰り返し計算を行い、一つの値に集約する関数です。累積和や累積積、さらには条件付き集計まで幅広く応用できます。この記事を読み終えると、REDUCE関数の基本構文から実践的な累積計算のテクニックまでを身につけられます。

【要点】REDUCE関数で配列を集約し累積計算を実装する方法

  • =REDUCE(初期値, 配列, LAMBDA(累積, 現在値, …)): 配列の各要素を順に処理し、累積値を更新して最終結果を返します。
  • LAMBDA関数で累積計算のロジックを定義: 累積値と現在値を使って新しい累積値を計算する式を記述します。
  • SCAN関数との違いを理解: REDUCEは最終結果のみ、SCANは中間結果をすべて返す点が異なります。

ADVERTISEMENT

REDUCE関数が配列を集約する仕組み

REDUCE関数は、指定した配列の最初の要素から順に、累積値と各要素を使って計算を繰り返します。最終的に一つの値に集約するのが特徴です。構文は =REDUCE(初期値, 配列, LAMBDA(累積, 現在値, 計算式)) です。初期値は累積計算の出発点となる値で、数値や文字列などを指定できます。配列は処理したいセル範囲または配列定数です。LAMBDA関数内で、累積値と現在値を使って新しい累積値を返すロジックを記述します。

例えば、A1:A5の数値の累積和を求める場合、初期値を0とし、LAMBDAの中で「累積+現在値」を計算します。REDUCEは1回目に累積が0、現在値がA1なので0+A1を返し、2回目にその結果を新たな累積としてA2と足し、これを繰り返して最終的な合計を返します。累積計算に加えて、条件付き集計や文字列連結などにも使えます。

REDUCE関数で累積計算を実装する手順

ここでは、具体的な例として売上データの累積合計を計算します。以下の手順に従って操作してください。

  1. データを準備する
    スプレッドシートに、A列に日付、B列に売上金額が入力された表を用意します。例えばA2:A10に日付、B2:B10に数値が入っているとします。
  2. REDUCE関数を入力するセルを決める
    累積合計の最終結果を表示したいセル(例:C2)を選びます。
  3. REDUCE関数の基本形を入力する
    C2に以下の数式を入力します。
    =REDUCE(0, B2:B10, LAMBDA(acc, val, acc+val))
    これでB2からB10までの累積合計が計算されます。初期値0から開始し、accが累積値、valが各セルの値です。
  4. 日付ごとの累積合計を表示する(応用)
    累積合計を各行に表示したい場合は、SCAN関数のほうが適しています。REDUCEでは最終値しか得られないため、複数の累積結果を得たいときはSCANを使用します。ただし、REDUCEで配列数式として使う方法もあります。詳細は次のセクションで説明します。

上の手順では、シンプルな累積和を計算しました。次に、より複雑な累積計算として、ある条件を満たす場合のみ加算する例を示します。

  1. 条件付き累積合計のデータを準備する
    A列に商品カテゴリ、B列に売上金額があるとします。例えば、カテゴリが「食品」の場合のみ累積したいとします。
  2. 条件付きREDUCEを実装する
    以下の数式で、食品カテゴリのみの累積合計を計算します。
    =REDUCE(0, B2:B10, LAMBDA(acc, val, IF(OFFSET(val,0,-1)="食品", acc+val, acc)))
    ここでは、現在値の左隣のセル(OFFSETで取得)が「食品」なら加算し、それ以外はaccをそのまま返します。
  3. 別の方法:FILTERと組み合わせる
    より簡潔に書くなら、FILTERで条件に合う値だけを取り出してからREDUCEを使う方法もあります。
    =REDUCE(0, FILTER(B2:B10, A2:A10="食品"), LAMBDA(acc, val, acc+val))
    この方法のほうが可読性が高いです。

REDUCE関数使用時の注意点とよくあるエラー

配列が空の場合にエラーになる

REDUCEの第2引数に空の範囲を指定すると、#N/Aエラーが発生します。対策として、IFERRORでラップするか、初期値を返すようにします。例えば、=IFERROR(REDUCE(0, B2:B10, LAMBDA(acc,val,acc+val)), 0) とすれば空の場合も0を返せます。

LAMBDA内の引数名が他のセル参照と衝突する

LAMBDAで定義する引数名(例えばaccやval)は、シート上のセル範囲名やテーブル名と重複しないように注意します。重複すると予期しない結果になります。引数名は短くてもユニークなものにするのがコツです。

大量のデータでパフォーマンスが低下する

REDUCEは配列の要素ごとにLAMBDAを実行するため、データ量が数千行を超えると計算が遅くなることがあります。その場合は、SUM関数やQUERY関数など別の方法で代替できないか検討してください。

SCAN関数と混同しやすい

REDUCEは最終結果だけを返しますが、SCAN関数は中間の累積値をすべて配列として返します。累積和の過程を確認したい場合はSCANを使いましょう。REDUCEとSCANはLAMBDAの書き方が同じなので、使い分けを間違えないようにします。

ADVERTISEMENT

REDUCE関数とSCAN関数の違い

項目 REDUCE関数 SCAN関数
返す値 最終的な集約値のみ(単一セル) 各ステップの累積値を含む配列
用途 合計や平均など最終結果だけ必要な場合 累積過程を各行に表示したい場合
構文 =REDUCE(初期値, 配列, LAMBDA) =SCAN(初期値, 配列, LAMBDA)
出力例 1つの数値 元の配列と同じサイズの配列

REDUCEで累積和の過程を表示したい場合は、SCANを使うか、REDUCEを繰り返し使う工夫が必要です。例えば、各行に累積和を表示するには、SCANで一発です。

まとめ

この記事では、GoogleスプレッドシートのREDUCE関数を使って配列を集約し、累積計算を実装する方法を解説しました。REDUCE関数はLAMBDAと組み合わせることで、単純な合計から条件付き集計まで柔軟に対応できます。初期値と計算ロジックを工夫すれば、文字列の連結や複雑な演算も可能です。まずは簡単な累積和から試し、徐々に条件分岐や複数配列の処理に挑戦してみてください。また、SCAN関数との違いを理解しておくと、状況に応じて適切な関数を選べるようになります。

次のステップとして、REDUCE関数をARRAYFORMULAと組み合わせるテクニックや、MAP関数との併用も調べてみると、さらに高度なデータ加工ができるようになります。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

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