スプレッドシートのREDUCE関数の使い方|配列を1値に集約

スポンサーリンク

スプレッドシートで「配列の値をすべて足し合わせたい」「条件に合う値だけを集計したい」と思うことはありますよね。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つ目が「いま処理している値(現在値)」を受け取ります。accvalのような短い名前でもOKですよ。

初期値・累積値とは?

REDUCE関数を理解するカギは「初期値」と「累積値」です。

初期値は「最初に手元に何を持って始めるか」を決める値です。合計を求めるなら0、積を求めるなら1、文字列を結合するなら空文字""を指定します。

累積値は「ここまでの処理結果」が入る変数です。配列の最初の要素を処理するときは初期値が入っています。2番目以降は、前回の処理結果が自動的に入ります。

たとえば =REDUCE(0, {10,20,30}, LAMBDA(acc, val, acc+val)) の場合、次のように動きます。

  1. acc=0, val=10 → 0+10=10
  2. acc=10, val=20 → 10+20=30
  3. 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商品名
2100
3200
4150
5250

数値の合計を求める(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 / PRODUCTREDUCE関数
できること単純な合計・積カスタムロジックで集約
条件付き処理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/ALAMBDAの引数が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))のシンプルな合計から試してみてください。初期値と累積値の仕組みがわかれば、条件付き集計や文字列結合など、さまざまな集約処理に応用できますよ。


この記事で紹介した関数・関連記事

タイトルとURLをコピーしました