GoogleスプレッドシートのMAP関数とは?構文の意味・作り方の実例からARRAYFORMULAとの違いまで詳しく解説

GoogleスプレッドシートのMAP関数の基本構文と作り方の例・ARRAYFORMULAとの違いを解説するアイキャッチ画像

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))))

スプレッドシート MAP×LAMBDA×SUMIFS 行ごと自動集計の画面キャプチャー

▲ 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), "合格", "不合格"))))

スプレッドシート ARRAYFORMULAとMAP関数の違い比較画面キャプチャー

▲ 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))))

スプレッドシート MAP×LAMBDA×TEXTJOIN 行ごと文字結合の画面キャプチャー

▲ カラーが空欄の場合も、ハイフンが重ならず自然にスキップされて結合されます

TEXTJOINの第2引数「TRUE」の働き

TEXTJOINの第2引数に「TRUE」を指定すると、途中の空欄セルを自動的に無視して詰めてくれます。
もし単純な結合記号「&」で結ぶと「ソックス – – Free」のように余計なハイフンが残ってしまいますが、TEXTJOINなら「ソックス – Free」と仕上がります。
ARRAYFORMULAでは表全体の全文字が1つのセルに混ざり合ってしまうため、このような処理にはMAP関数が適しています。

実務で差がつく!IF空行ガードが必要な理由

上記の数式で常に登場している「IF(変数=””, “”, …)」という記述は、実務運用において大切なポイントです。
もしこのIF判定を入れずに列全体(A2:Aなど)を走査すると、以下のような問題が生じる場合があります。

スプレッドシート MAP関数 複数列計算と空行ガードの画面キャプチャー

▲ 空行ガードにより、データが存在しない行(6〜7行目)は余計な0を表示せず綺麗な白紙を維持

  • 不要な「0」が並ぶ:データの入っていない空行まで計算が走り、下方向に不要な「0」が表示されてしまうことがあります。
  • ファイルの動作への影響:シートの最終行まですべて計算が走り続けると、シート全体のスクロールや表示速度に影響を与える場合があります。

「先頭の値が空っぽなら、何も計算せず空文字(””)を返す」というIFガードを1行挟むことで、実データのある行だけをすっきりと処理できます。

基本から復習!シンプルな作り方の実例

もちろん、1列だけの加工やシンプルな四則演算にもMAP関数は活用できます。

単一列の加工(敬称の付与と自動展開)

=MAP(A2:A6, LAMBDA(name, IF(name="", "", name & " 様")))

スプレッドシート MAP関数 単一列スピル展開の画面キャプチャー

▲ 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関数の組み合わせを活用してみてください。


eguchi.netをもっと見る

購読すると最新の投稿がメールで送信されます。