ADVERTISEMENT

【Googleスプレッドシート】REDUCE関数で配列を1つの値に集約!合計や連結を1行で

【Googleスプレッドシート】REDUCE関数で配列を1つの値に集約!合計や連結を1行で
🛡️ 超解決

Googleスプレッドシートで複数のセルを1つの値にまとめたいとき、SUM関数やTEXTJOIN関数を使うのが一般的です。しかし、それらの関数では実現できない複雑な集約処理を行う場合、REDUCE関数が役立ちます。REDUCE関数は配列の各要素を順番に処理し、1つの累積値にまとめることができる強力な関数です。この記事では、REDUCE関数の基本的な使い方から、合計や文字列連結、条件付き集約までをわかりやすく解説します。具体例を通じて、1行の数式で複雑な集約を実現する方法を学んでいただけます。

【要点】REDUCE関数で配列を1つの値に集約する方法

  • =REDUCE(初期値, 配列, LAMBDA(累積値, 現在値, 計算式)): 配列の各要素を順に処理し、初期値から開始して累積値を計算します。
  • 合計を求める例: =REDUCE(0, A1:A10, LAMBDA(a, b, a+b)) で範囲の合計を算出します。SUM関数と同じ結果が得られます。
  • 文字列を連結する例: =REDUCE(“”, A1:A10, LAMBDA(a, b, a&b)) でセルの内容を1つの文字列に結合します。
  • 条件付き集約も可能: LAMBDA内でIF文を使うことで、特定の条件を満たす要素だけを集約できます。

ADVERTISEMENT

REDUCE関数の概要と仕組み

REDUCE関数は、配列の各要素を順番に処理し、初期値から始めて累積値を計算する関数です。構文は「=REDUCE(初期値, 配列, LAMBDA(累積値, 現在値, 計算式))」の形をとります。第1引数は累積の開始値、第2引数は処理したい配列(セル範囲や配列定数)、第3引数はLAMBDA関数で、2つのパラメータ(累積値と現在値)を受け取り、新しい累積値を返す計算式を記述します。この関数を使うと、SUM、PRODUCT、TEXTJOINなどの専用関数では難しい複雑なロジックを1行の数式で実現できます。

例えば、A列の数値データを1つずつ足し合わせる場合、=REDUCE(0, A1:A10, LAMBDA(a, b, a+b)) と書きます。この数式は、初期値0から始め、A1の値を足して累積値1、次にA2を足して累積値2、というように順次計算し、最終的に全セルの合計を返します。これはSUM関数と同様の結果ですが、計算の過程をカスタマイズできる点がREDUCEの強みです。

LAMBDA関数内では任意の計算式を記述できます。条件分岐や他の関数の組み合わせも可能なため、柔軟な集約処理が実現できます。ただし、LAMBDA関数内で使用できるのは単一の式であるため、複数行の処理が必要な場合はARRAYFORMULAなどと組み合わせるか、Apps Scriptを検討する必要があります。

REDUCE関数を使った基本的な操作手順

ここでは、REDUCE関数を実際に使いながら集約処理を行う手順を説明します。まず、準備として集約したいデータが入力されたシートを開いてください。

数値の合計を求める

  1. 結果を表示するセルを選択する
    合計値を表示したいセルをクリックして選択します。
  2. 数式を入力する
    数式バーに「=REDUCE(0, A1:A10, LAMBDA(a, b, a+b))」と入力します。セル範囲は実際のデータ範囲に合わせて変更してください。
  3. Enterキーを押して確定する
    数式を入力したらEnterキーを押します。範囲内の数値の合計が表示されます。

この数式では、初期値0から始めて、範囲内の各セルの値を順に加算しています。aは累積値、bは現在のセルの値です。a+bを返すことで、加算を繰り返します。

文字列を連結する

  1. 結果を表示するセルを選択する
    連結結果を表示したいセルをクリックします。
  2. 数式を入力する
    数式バーに「=REDUCE(“”, A1:A10, LAMBDA(a, b, a&b))」と入力します。範囲は連結したいセル範囲に変更します。
  3. Enterキーを押して確定する
    Enterを押すと、範囲内の文字列がすべて連結された結果が表示されます。

初期値を空文字「””」にすることで、文字列の連結が始まります。a&bは累積文字列aに現在の文字列bを結合します。空白や区切り文字を含めたい場合は、a&” “&bのように修正します。

条件を満たす値のみ合計する

  1. 結果を表示するセルを選択する
    合計を表示するセルをクリックします。
  2. 数式を入力する
    数式バーに「=REDUCE(0, A1:A10, LAMBDA(a, b, a + IF(b>0, b, 0)))」と入力します。この数式は正の数だけを合計します。
  3. Enterキーを押して確定する
    Enterを押すと、条件を満たす値のみの合計が表示されます。

LAMBDA内でIF関数を使うことで、現在の値bが条件(ここでは0より大きい)を満たす場合のみ加算しています。条件を変えれば、特定の範囲の値だけを集約することも簡単です。

偶数のみを積算する

  1. 結果を表示するセルを選択する
    積算結果を表示するセルをクリックします。
  2. 数式を入力する
    数式バーに「=REDUCE(1, A1:A10, LAMBDA(a, b, a * IF(ISEVEN(b), b, 1)))」と入力します。初期値は1です。
  3. Enterキーを押して確定する
    Enterを押すと、偶数だけが掛け合わされた結果が表示されます。

初期値を1にすることで掛け算の単位元とします。ISEVEN関数で偶数のみを選択し、それ以外は1(乗算に影響なし)を返します。このように、条件に応じて戻り値を変えることで多様な集約が可能です。

重複を除去してから連結する

  1. 結果を表示するセルを選択する
    連結結果を表示するセルをクリックします。
  2. 数式を入力する
    数式バーに「=REDUCE(“”, UNIQUE(A1:A10), LAMBDA(a, b, a&b))」と入力します。
  3. Enterキーを押して確定する
    Enterを押すと、重複を除いた文字列が連結されます。

UNIQUE関数で重複を除去した配列をREDUCEに渡すことで、ユニークな値のみを連結できます。同様にSORT関数などと組み合わせれば、順序を整えてから集約することも可能です。

複数列のデータを1つの文字列にまとめる

  1. 結果を表示するセルを選択する
    結合結果を表示するセルをクリックします。
  2. 数式を入力する
    数式バーに「=REDUCE(“”, A1:C10, LAMBDA(a, b, a&b&” “))」と入力します。
  3. Enterキーを押して確定する
    Enterを押すと、複数列の全セルがスペース区切りで連結された結果が表示されます。

REDUCEは2次元の範囲を1次元に展開して処理するため、複数列も問題なく扱えます。ただし、範囲が広いと処理が重くなるため注意しましょう。

REDUCE関数を使う際の注意点とよくあるエラー

初期値の型が一致しない

REDUCE関数では、初期値と累積結果、そして配列内の各要素のデータ型が一貫していないとエラーになります。例えば、数値の合計を計算する場合、初期値を文字列の「”0″」にすると、加算時に型変換が行われず予期しない結果やエラーが発生します。必ず初期値を適切な型(数値なら0、文字列なら””)に設定しましょう。

LAMBDAの引数の順序を間違える

LAMBDA関数の第1引数は累積値(アキュムレータ)、第2引数は現在の値です。この順序を逆にしてしまうと、計算結果がおかしくなります。例えば、合計の数式で「LAMBDA(b, a, a+b)」と書くと、aが現在値、bが累積値として扱われるため、最初のステップで累積値がA1の値になり、以降は累積値にA2を足すなど、意図しない動作になります。常に「LAMBDA(累積値, 現在値, 計算式)」の順序を守ってください。

配列が空の場合の動作

処理対象の配列が空の場合、REDUCE関数は初期値をそのまま返します。つまり、初期値が数値0なら0、空文字なら空文字が結果になります。期待する結果と異なる場合は、配列が正しく指定されているか確認しましょう。

パフォーマンスの問題

非常に大きな配列(数千行以上)に対してREDUCE関数を使用すると、計算に時間がかかる場合があります。また、LAMBDA内で重い関数を使用するのも避けたほうが良いです。大量データの集約には、従来のSUMやQUERYなどを検討するか、データ処理に最適化された関数を選びましょう。

LAMBDA内で複数の処理を行えない

LAMBDA関数の中では、1つの式しか記述できません。複数行のロジック(変数代入など)は不可能です。複雑な処理が必要な場合は、複数のREDUCEを入れ子にするか、LET関数と組み合わせることで対応できます。それでも難しい場合は、Apps Scriptの利用を検討してください。

ADVERTISEMENT

REDUCE関数と他の集約関数の比較

関数 用途 構文例 特徴
REDUCE 配列を任意のロジックで1つの値に集約 =REDUCE(初期値, 範囲, LAMBDA) 自由な計算式、条件分岐可能、柔軟性が高い
SUM 数値の合計 =SUM(範囲) シンプル、高速、条件付きはSUMIF/SUMIFS
TEXTJOIN 文字列の連結 =TEXTJOIN(区切り文字,空無視,範囲) 区切り文字指定、空白セル処理オプション
SCAN 累積計算の途中結果を出力 =SCAN(初期値, 範囲, LAMBDA) 各段階の累積値を配列で返す(REDUCEと似ているが出力が違う)
PRODUCT 数値の積 =PRODUCT(範囲) 単純な掛け算専用

REDUCEは自由度が高い反面、複雑な式になりやすいです。用途に応じて適切な関数を選びましょう。

まとめ

この記事では、REDUCE関数を使って配列を1つの値に集約する方法を解説しました。合計や文字列連結、条件付き集約など、さまざまな処理を1行の数式で実行できることを確認していただけたと思います。REDUCE関数の最大の魅力は、LAMBDA関数と組み合わせることで独自の集約ロジックを自由に記述できる点にあります。ぜひ、実際のデータで試しながら、複雑な集約をシンプルに実現してみてください。また、SCAN関数やMAP関数と組み合わせれば、さらに高度なデータ加工も可能になります。次のステップとして、LET関数を使って複雑な数式を整理する方法も学んでみてはいかがでしょうか。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

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