スプレッドシートで「配列の値をすべて足し合わせたい」「条件に合う値だけを集計したい」と思うことはありますよね。SUM関数やPRODUCT関数でできる場面もありますが、独自の集計ロジックを組みたいときには対応しきれません。
REDUCE関数を使えば、配列の全要素を順番に処理して、最終的に1つの値にまとめられます。「前回の計算結果を次に引き継ぐ」という仕組みで、カスタム集約が自由自在です。
この記事では、REDUCE関数の基本からSCAN関数との違いまでわかりやすく解説します。
REDUCE関数とは?
REDUCE関数(読み方: リデュース関数)は、配列やセル範囲の全要素を順番に処理して、1つの値に集約する関数です。「reduce(減らす・まとめる)」が名前の由来で、複数のデータを1つに絞り込むイメージですね。
たとえば、5個の数値が入ったセル範囲にREDUCE関数を適用すると、先頭から順に処理して最終的な1つの値を返します。SUM関数やPRODUCT関数と似ていますが、処理内容を自分で定義できるのが最大の特長です。
REDUCE関数にできることをまとめると、次のとおりです。
- 配列の全要素を順番に処理して1つの値にまとめる
- LAMBDA関数で処理内容を自由にカスタマイズできる
- 「前回の結果を次の計算に使う」累積処理ができる
NOTE
REDUCE関数はGoogleスプレッドシート独自の関数です。Excelには対応する関数がありません。同様の処理は、SUM関数やPRODUCT関数を組み合わせて対応してください。
REDUCE関数の基本構文
=REDUCE(初期値, 配列, LAMBDA(累積値, 現在値, 処理))
カッコの中に、初期値・処理対象の配列・各要素に適用するLAMBDA関数を指定します。
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 初期値 | 必須 | 累積処理の開始値。合計なら0、積なら1、文字列結合なら”” |
| 配列 | 必須 | 処理対象のセル範囲または配列 |
| LAMBDA(累積値, 現在値, 処理) | 必須 | 各要素に適用する関数。仮引数は必ず2つ |
LAMBDA関数の仮引数は必ず2つ必要です。1つ目が「ここまでの計算結果(累積値)」、2つ目が「いま処理している値(現在値)」を受け取ります。accとvalのような短い名前でもOKですよ。
初期値・累積値とは?
REDUCE関数を理解するカギは「初期値」と「累積値」です。
初期値は「最初に手元に何を持って始めるか」を決める値です。合計を求めるなら0、積を求めるなら1、文字列を結合するなら空文字""を指定します。
累積値は「ここまでの処理結果」が入る変数です。配列の最初の要素を処理するときは初期値が入っています。2番目以降は、前回の処理結果が自動的に入ります。
たとえば =REDUCE(0, {10,20,30}, LAMBDA(acc, val, acc+val)) の場合、次のように動きます。
- acc=0, val=10 → 0+10=10
- acc=10, val=20 → 10+20=30
- acc=30, val=30 → 30+30=60(最終結果)
初期値の0からスタートして、各要素を順番に足していくイメージです。
LAMBDA関数のおさらい
REDUCE関数を理解するには、LAMBDA関数の基本を知っておく必要があります。
LAMBDA関数は「自分だけの関数を作れる」関数です。引数と処理内容を自分で定義できます。
=LAMBDA(引数, 処理)(値)
たとえば =LAMBDA(x, x*2)(5) と書くと、xに5が入って「5×2=10」が返ります。REDUCE関数の中では、このLAMBDA関数に累積値と現在値が自動的に渡される仕組みです。
REDUCE関数の基本的な使い方
ここでは、シンプルな数値データを使ってREDUCE関数の動きを確認していきます。
サンプルデータ
A1:A5に以下のデータが入っているとします。
| A | |
|---|---|
| 1 | 商品名 |
| 2 | 100 |
| 3 | 200 |
| 4 | 150 |
| 5 | 250 |
数値の合計を求める(SUM相当)
A2:A5の合計を求めます。出力先のセル(たとえばC2)に以下の数式を入力してください。
=REDUCE(0, A2:A5, LAMBDA(acc, val, acc + val))
結果は 700 です。初期値0からスタートして、100→200→150→250を順番に足し合わせています。
この例だけならSUM関数で十分ですが、REDUCE関数の基本動作を理解する第一歩として押さえておきましょう。
数値の積を求める(PRODUCT相当)
各数値をすべて掛け合わせるには、初期値を1にして掛け算します。
=REDUCE(1, A2:A5, LAMBDA(acc, val, acc * val))
結果は 750000000(100×200×150×250)です。初期値を1にするのがポイントですね。0にすると何を掛けても0になってしまいます。
文字列を連結する
B1:B4に「東京」「大阪」「名古屋」「福岡」が入っている場合、すべてを1つにつなげられます。
=REDUCE("", B1:B4, LAMBDA(acc, val, acc & val))
結果は 東京大阪名古屋福岡 です。初期値を空文字""にして、各要素を&で連結しています。
REDUCE関数の実務活用パターン
パターン1: 条件付きで数値を集計する
REDUCE関数の真価が発揮されるのは、条件付きの集計です。A2:A5の数値のうち、150以上のものだけを合計してみましょう。
=REDUCE(0, A2:A5, LAMBDA(acc, val, IF(val >= 150, acc + val, acc)))
結果は 400(150+250)です。IF関数で条件を判定し、条件に合わないときは累積値をそのまま返しています。「条件に合わなければ何もしない」という書き方がポイントですよ。
パターン2: 区切り文字付きで文字列を結合する
文字列をカンマ区切りで結合する例です。そのまま&で繋ぐと区切りがなくなるので、ひと工夫します。
=REDUCE("", B1:B4, LAMBDA(acc, val, IF(acc="", val, acc & ", " & val)))
結果は 東京, 大阪, 名古屋, 福岡 です。初回(accが空文字)だけ区切り文字なしで値を入れ、2回目以降はカンマを付けて連結しています。
TEXTJOIN関数でも同じことができます。ただし、結合前に値を加工したい場合はREDUCE関数のほうが柔軟です。
パターン3: 累積割引率を計算する
複数の割引率を順番に適用する場面です。C2:C4に「10%」「5%」「3%」が入っているとします。定価10,000円に対する最終価格を求めます。
=REDUCE(10000, C2:C4, LAMBDA(acc, rate, acc * (1 - rate)))
結果は 8,293.5 です。10,000→9,000(10%引き)→8,550(5%引き)→8,293.5(3%引き)と順番に割引が適用されます。「前回の結果に次の計算を重ねる」累積処理は、REDUCE関数ならではの得意技です。
SUM・PRODUCT関数との比較
REDUCE関数はSUM関数やPRODUCT関数の上位互換のように見えますが、使い分けが大切です。
| 比較項目 | SUM / PRODUCT | REDUCE関数 |
|---|---|---|
| できること | 単純な合計・積 | カスタムロジックで集約 |
| 条件付き処理 | SUMIF等を別途使う | LAMBDA内にIF文を書ける |
| 累積処理 | 不可 | 前回の結果を引き継げる |
| 読みやすさ | シンプルで直感的 | 慣れが必要 |
| 処理速度 | 高速 | やや遅い |
単純な合計はSUM関数、単純な積はPRODUCT関数を使いましょう。REDUCE関数の出番は「SUM/PRODUCTでは書けない処理」が必要なときです。
SCAN関数との違い・使い分け
REDUCE関数と最も混同しやすいのがSCAN関数です。どちらも累積処理をしますが、返す結果が異なります。
| 比較項目 | REDUCE関数 | SCAN関数 |
|---|---|---|
| 戻り値 | 最終値のみ(1つの値) | 中間値を含む配列 |
| 結果の形 | スカラー値 | 元の配列と同じサイズ |
| 構文 | 同じ | 同じ |
| 典型的な用途 | 合計・積など最終結果だけ欲しいとき | 累積合計・残高推移を表示したいとき |
たとえば {10, 20, 30} に対して累積合計を求めた場合、結果はこうなります。
- REDUCE: 60(最終値のみ)
- SCAN: {10, 30, 60}(途中経過も含む配列)
REDUCE関数が向いている場面
「最終的な1つの値だけ欲しい」ときはREDUCE関数です。全体の合計金額・累積割引後の最終価格・条件付き集計の結果など、答えが1つに定まる処理に向いています。
SCAN関数が向いている場面
「途中経過も見たい」ときはSCAN関数です。月次の累積売上推移・口座残高の推移など、各ステップの値を一覧で表示したい場面で活躍しますよ。
LAMBDA系関数の全体像
スプレッドシートには、LAMBDA関数と組み合わせて使う関数が複数あります。全体像を把握しておくと、どの場面でどの関数を使うか判断しやすくなりますよ。
| 関数 | 処理単位 | 結果の形 | 主な用途 |
|---|---|---|---|
| MAP | セルごと | 元と同じ形 | セルごとの変換・加工 |
| BYCOL | 列ごと | 横1行 | 列ごとの集計 |
| BYROW | 行ごと | 縦1列 | 行ごとの集計 |
| REDUCE | 配列全体 | 1つの値 | 全体を1つに集約 |
| SCAN | 累積 | 元と同じサイズ | 累積計算の中間結果 |
| MAKEARRAY | 行×列 | 新しい配列 | 計算で配列を生成 |
REDUCE関数は「全要素を1つの値にまとめる」という、最もシンプルな結果を返す関数です。集約結果だけあればいい場面で迷わず使えますね。
よくあるエラーと対処法
REDUCE関数はLAMBDA関数と組み合わせるため、構文のミスが起こりやすいです。
| エラー | 原因 | 対処法 |
|---|---|---|
#NAME? | 関数名のスペルミス | 「REDUCE」のスペルを確認してください |
#NAME? | Excelで使用しようとした | REDUCE関数はGoogleスプレッドシート専用です |
#NAME? | LAMBDA関数の仮引数名が不正 | 仮引数名にセル参照(A1等)やスペースは使えません |
#N/A | LAMBDAの引数が2つでない | LAMBDAの仮引数は必ず2つ(累積値と現在値)にしてください |
#VALUE! | 初期値の型が処理と合わない | 合計なら0、文字列結合なら””を初期値にしてください |
#ERROR! | LAMBDAの構文ミス | カッコの閉じ忘れ、カンマの過不足を確認してください |
| 結果が0になる | 初期値を0にして掛け算した | 積を求めるときは初期値を1にしてください |
特に多いのが「LAMBDAの引数が2つでない」エラーです。REDUCE関数のLAMBDAは必ず2つの仮引数(累積値と現在値)が必要です。1つや3つにすると#N/Aエラーになるので注意してくださいね。
TIP
LAMBDA関数の仮引数名で迷ったら、
acc(accumulator の略)とval(value の略)を使うのがおすすめです。累積値と現在値の役割が一目でわかります。なお、REDUCE関数は1つの配列に対して最大約39,998回まで繰り返し処理ができます。
まとめ
REDUCE関数は、配列の全要素を順番に処理して1つの値に集約する関数です。「前回の結果を次に引き継ぐ」累積処理ができるので、SUM関数やPRODUCT関数では対応できないカスタム集約が実現します。
この記事のポイントをおさらいしておきましょう。
- REDUCE関数は
=REDUCE(初期値, 配列, LAMBDA(acc, val, 処理))で、全要素を1つの値に集約する - 初期値は「最初に手元に何を持って始めるか」を決める値(合計なら0、積なら1)
- 条件付き集計や累積割引率など、カスタムロジックの集約に強い
- 単純な合計・積ならSUM関数・PRODUCT関数のほうがシンプルで高速
- SCAN関数は中間値も返す。最終値だけならREDUCE関数を選ぶ
- Googleスプレッドシート独自の関数で、Excelでは使えない
まずは=REDUCE(0, A2:A5, LAMBDA(acc, val, acc + val))のシンプルな合計から試してみてください。初期値と累積値の仕組みがわかれば、条件付き集計や文字列結合など、さまざまな集約処理に応用できますよ。
