ARRAYFORMULAでは対応が難しい処理を綺麗に解決するモダン関数
Googleスプレッドシートで「先頭のセルに1つ数式を入力するだけで、下の行まで一括で自動計算させたい」と考えたとき、真っ先に思い浮かぶのは「ARRAYFORMULA」かもしれません。
しかし、SUMIFSやCOUNTIFSで行ごとの集計を試みたり、AND・OR関数で複数条件の合否判定を行ったり、TEXTJOINで行ごとの文字を連結しようとすると、ARRAYFORMULAではうまく動作しないケースがあります。
「単純な四則演算ならARRAYFORMULAで十分なのに、なぜMAP関数とLAMBDA関数が必要になるのか?」
本記事では、ARRAYFORMULAとの違いや、MAP×LAMBDAならではの実務での活用例(SUMIFS集計、AND/OR判定、TEXTJOIN結合など)を画面キャプチャーとともに分かりやすく解説します。
MAP関数とは?基本的な意味と役割
MAP(マップ)関数は、指定したセルの範囲(配列)からデータを「1行ずつ」順番に取り出し、LAMBDA(ラムダ)関数で定義した処理を適用して、結果をまとめて下方向へ自動展開(スピル)する関数です。
JavaScriptやPythonの「map関数(配列の各要素を1つずつ取り出して処理し、新しい配列を返す機能)」と同じ仕組みが、スプレッドシートの数式単体で利用できるようになりました。
従来のシート関数には「1つのセルを計算する」か「範囲全体をまとめて1つの数値に集計する」という選択肢が一般的でしたが、MAP関数は「範囲内のデータを1行ずつ順番に個別処理する」という動作を実現しています。
MAP関数の基本構文と引数の意味
MAP関数は、必ず「LAMBDA関数」とペアで使用します。基本構文は以下のとおりです。
=MAP(配列1, [配列2, ...], LAMBDA(仮引数1, [仮引数2, ...], 計算処理))
| 引数・キーワード | 意味と具体的な役割 |
|---|---|
| 配列1, 配列2… | 処理対象にしたいセルの範囲を指定します(例:A2:A、B2:Bなど)。複数指定する場合は行数を一致させます。 |
| LAMBDA(…) | その場で自分好みの処理を定義する無名関数です。MAPから渡されるデータを受け取って計算します。 |
| 仮引数1, 仮引数2… | 各行から取り出された値を受け取るための一時的な変数名です。「x」「y」や「rep」「cat」など自由に命名できます。 |
| 計算処理 | 各行ごとに実行したい数式(SUMIFS、AND/OR、TEXTJOIN、四則演算など)を記述します。 |
ARRAYFORMULAでできること・できないことの境界線
「1セル入力で下まで自動展開するだけなら、ARRAYFORMULAでも十分では?」と感じる方も多いはずです。
実のところ、単純な四則演算や記号での文字列結合であれば、ARRAYFORMULAでも問題なく動作します。
| 処理内容 | ARRAYFORMULA | MAP × LAMBDA | 理由・解説 |
|---|---|---|---|
| 単純な四則演算(単価×数量) | ○ 可能 | ○ 可能 | 掛け算記号「*」などは配列の要素同士を自然に計算できるため。 |
| 単純な文字列結合(A列 & ” 様”) | ○ 可能 | ○ 可能 | 「&」演算子は配列全体に適用可能なため。 |
| 別シートの条件合計(SUMIFS) | × 不可(全行同じ値) | ○ 可能(行ごと集計) | SUMIFSは引数の配列をまとめて合算してしまうため。 |
| 複数条件判定(AND / OR) | × 不可(全体判定) | ○ 可能(行ごと判定) | ANDやORは配列全体を1つのTRUE/FALSEに集約してしまうため。 |
| 複数セル結合(TEXTJOIN) | × 不可(1セルに合体) | ○ 可能(行ごと結合) | TEXTJOINは全セルの文字を1つの枠にすべて結合してしまうため。 |
このように、ARRAYFORMULAは「引数を集約・合計する性質を持つ関数」と組み合わせると、行ごとの個別計算ができなくなります。
これらを1セル入力で自動展開させるには、配列を1行ずつ個別処理できる「MAP × LAMBDA」が適しています。
MAP×LAMBDAならではの実践活用例
ARRAYFORMULAでは対応が難しい、MAP×LAMBDAならではの代表的な3つの活用例を紹介します。
実例:MAP × LAMBDA × SUMIFS(別シートからの行ごと条件集計)
実務でよく利用されるのが、別シートにある明細データ(売上明細、日報、受注履歴など)から、担当者ごとや店舗ごとの合計金額を行単位で自動集計するパターンです。
=MAP(A2:A6, LAMBDA(rep, IF(rep="", "", SUMIFS('売上明細'!$C:$C, '売上明細'!$B:$B, rep))))
▲ B2セルに数式を置くだけで、各担当者の売上合計が売上明細シートから1行ずつ自動計算される様子
ARRAYFORMULAでうまく動かない理由
もし「=ARRAYFORMULA(SUMIFS(‘売上明細’!C:C, ‘売上明細’!B:B, A2:A))」と記述すると、スプレッドシートは「全担当者の総合計金額」を1つの値として計算し、すべての行に同じ合計金額を表示してしまいます。
MAP関数を使えば、A列の担当者を「rep」という変数に1人ずつ代入しながらSUMIFSを個別に実行するため、行ごとの売上合計が出力されます。
実例:MAP × LAMBDA × AND / OR(行ごとの複数条件判定)
「英語が80点以上、かつ数学も80点以上なら合格」のように、行ごとに複数の条件をANDやORで判定したいケースです。
=MAP(B2:B, C2:C, LAMBDA(e, m, IF(e="", "", IF(AND(e>=80, m>=80), "合格", "不合格"))))
▲ AND判定の比較。ARRAYFORMULAは全体を判定してしまうのに対し、MAP関数は各行を個別に判定
ARRAYFORMULAでAND関数を使うと、指定した範囲の中に1つでも条件を満たさないセルがあれば、全体の判定がFALSEになってしまいます。
MAP関数であれば、行ごとに独立したAND判定が行われるため、条件を満たした行のみ「合格」と判定されます。
実例:MAP × LAMBDA × TEXTJOIN(行ごとの複数セル結合と空欄スキップ)
商品マスターなどで「カテゴリ」「カラー」「サイズ」の3つの列を「 – 」(ハイフン)で連結したいケースです。
特に「カラーがない商品は自動でスキップして詰める」という処理を行いたい場合、TEXTJOIN関数が便利です。
=MAP(A2:A6, B2:B6, C2:C6, LAMBDA(cat, col, sz, IF(cat="", "", TEXTJOIN(" - ", TRUE, cat, col, sz))))
▲ カラーが空欄の場合も、ハイフンが重ならず自然にスキップされて結合されます
TEXTJOINの第2引数「TRUE」の働き
TEXTJOINの第2引数に「TRUE」を指定すると、途中の空欄セルを自動的に無視して詰めてくれます。
もし単純な結合記号「&」で結ぶと「ソックス – – Free」のように余計なハイフンが残ってしまいますが、TEXTJOINなら「ソックス – Free」と仕上がります。
ARRAYFORMULAでは表全体の全文字が1つのセルに混ざり合ってしまうため、このような処理にはMAP関数が適しています。
実務で差がつく!IF空行ガードが必要な理由
上記の数式で常に登場している「IF(変数=””, “”, …)」という記述は、実務運用において大切なポイントです。
もしこのIF判定を入れずに列全体(A2:Aなど)を走査すると、以下のような問題が生じる場合があります。
▲ 空行ガードにより、データが存在しない行(6〜7行目)は余計な0を表示せず綺麗な白紙を維持
- 不要な「0」が並ぶ:データの入っていない空行まで計算が走り、下方向に不要な「0」が表示されてしまうことがあります。
- ファイルの動作への影響:シートの最終行まですべて計算が走り続けると、シート全体のスクロールや表示速度に影響を与える場合があります。
「先頭の値が空っぽなら、何も計算せず空文字(””)を返す」というIFガードを1行挟むことで、実データのある行だけをすっきりと処理できます。
基本から復習!シンプルな作り方の実例
もちろん、1列だけの加工やシンプルな四則演算にもMAP関数は活用できます。
単一列の加工(敬称の付与と自動展開)
=MAP(A2:A6, LAMBDA(name, IF(name="", "", name & " 様")))
▲ B2セルに入力した数式が、B3〜B6セルまで自動的にスピル(展開)されている基本形
この基本形をベースにして、LAMBDA内部の計算式を「SUMIFS」や「AND/OR」「TEXTJOIN」に差し替えることで、実務のさまざまな自動集計へ柔軟に応用できます。
MAP関数を使う際の注意点とエラー対処法
実務でMAP関数を運用する際に遭遇しやすいトラブルと、その解決策をまとめました。
#REF! エラー(スピル範囲の衝突)
数式を入力したセルの下方向に、すでに手入力された文字や別の計算式が存在すると、「#REF!(展開先が空ではありません)」というエラーが出ます。
数式を入力したセルより下の列のデータを消去して空欄にしておくことで解決します。
#VALUE! エラー(配列のサイズ不一致)
複数の配列を指定した際に、範囲の行数が異なっていると「#VALUE!(すべての配列引数の次元が同じである必要があります)」というエラーになります。
指定したすべての範囲(例:A2:AとB2:B)の開始行と終了行が一致しているか確認しましょう。
仮引数の個数と配列の個数の不一致
MAP関数に渡した配列が3つあるのに、LAMBDA側の仮引数が2つしかない場合、あるいはその逆の場合も数式エラーになります。
「MAPに渡す範囲の個数 = LAMBDAの引数の個数」となっているか、必ずペアを揃えてください。
まとめ
- 四則演算ならARRAYFORMULAでも可能:単純な掛け算や文字列結合はARRAYFORMULAでも動きますが、集計や判定を伴う処理ではARRAYFORMULAでは対応できない場面があります。
- MAP×LAMBDAならではの処理:SUMIFSやCOUNTIFSによる行ごと条件集計、AND/ORによる複合条件判定、TEXTJOINによる空欄スキップ結合などはMAP関数の強みです。
- IF空行ガードで安定運用:空行での不要な計算や「0」の出力を防ぐため、実務では「IF(変数=””, “”, …)」を組み合わせておくと安心です。
- メンテナンス性の向上:先頭セルに1つ記述するだけで下方向へ自動追従するため、コピペ漏れや誤消去による集計事故を防ぐことができます。
「ARRAYFORMULAで行ごとの集計がうまく動かない」「条件判定を1行ずつ正確に判定したい」という場面では、ぜひMAP関数とLAMBDA関数の組み合わせを活用してみてください。
