スプレッドシートのMAP×LAMBDA×SUMIFS完全解説!関数の意味と誕生背景を徹底解剖

スプレッドシート実務で遭遇する「最強の自動集計数式」を徹底解読

Googleスプレッドシートの先頭セルに1つ書き込むだけで、下方向の全行に対して別シートの複数条件合計(SUMIFS)を自動計算・展開してくれる数式があります。
それが「MAP × LAMBDA × SUMIFS」を組み合わせたモダンな数式です。
一見すると難解でとっつきにくく感じるこの数式が「なぜこのような構造になっているのか」「どのような業務課題を経てこの形に進化したのか」を、構成要素のひとつひとつまで丁寧に分かりやすく解説します。

解剖する対象の数式

今回詳しく解説するのは、実務の日報集計や売上集計で非常によく使われる以下の数式です。

=MAP($B:$B, $D:$D, LAMBDA(b,e,
   IF(e="","",
     SUMIFS(
       '日報'!$W:$W,
       '日報'!$D:$D, b,
       '日報'!$C:$C, e
     )
   )
))

この数式を1行目のセル(または先頭行)にポンと置くだけで、オートフィルやコピペを一切することなく、下の行まで一括で集計結果が自動的に出力(スピル)されます。

数式の意味をパーツごとに詳しく解説

この数式は「MAP」「引数範囲」「LAMBDA」「IFによる空白判定」「SUMIFS」という5つのパーツが美しく連携して動いています。外側から順番に役割を紐解いていきましょう。

構成パーツ 役割と意味
=MAP(…) 指定した配列の行を1行ずつ取り出して、指定した関数(LAMBDA)に渡して連続実行するループ処理の司令塔。
$B:$B, $D:$D MAP関数に流し込む元データ。現在シートのB列全体とD列全体を1行ずつペアにして取り出す。
LAMBDA(b,e, …) 渡された各行のデータを受け取る仮の変数「b」と「e」を定義し、その変数を使って行単位の計算を実行する無名関数。
IF(e=””,””, …) 空行ガード。D列が空白の行は何も計算せず空文字「””」にしておくことで、無駄な計算負荷や不要な「0」の大量表示を防ぐ。
SUMIFS(…) 「日報」シートのW列を合計。条件は「日報のD列がb」かつ「日報のC列がe」に合致するデータのみ。

MAP関数:配列を1行ずつ巡回する司令塔

Googleスプレッドシートの「MAP関数」は、渡された配列(セルの範囲)からデータを1つずつ取り出し、後ろに続く関数へ順番に引き渡していく関数です。
プログラミング言語でいうところの「forEach」や「map」ループのような動きを、スプレッドシートの数式単体で実現してくれます。

引数「$B:$B, $D:$D」:行ごとにペアで取り出す列データ

MAP関数には複数の列を同時に指定できます。ここでは集計先シートの「B列全体」と「D列全体」を指定しています。
たとえば、次のように1行ずつペアになって処理に送られます。

  • 1行目を処理するとき:B1の値とD1の値
  • 2行目を処理するとき:B2の値とD2の値
  • 3行目を処理するとき:B3の値とD3の値

LAMBDA関数と仮引数「b, e」:各行の値を受け取る一時的な箱

LAMBDA(ラムダ)関数は、自分好みのオリジナル計算処理をその場で組み立てるための仕組みです。
ここで定義されている「b」と「e」は、MAPから渡されてくる各行の値を一時的に入れておく「ラベル(変数)」です。

  • b:B列から取り出された値(例:日付や拠点コードなど)
  • e:D列から取り出された値(例:担当者名や社員番号など)

このおかげで、以降の数式の中では「B列のセルの値」を「b」、「D列のセルの値」を「e」というシンプルな名前で自由に扱えるようになります。

IF(e=””,””, …):空白行での0表示と重さを防ぐ安全装置

数式で「$B:$B」や「$D:$D」のように列全体を指定した場合、データが入力されていない下部の空白行(千行〜数万行先)までMAP関数の処理対象になります。
もしこのIF文がないとどうなるでしょうか?

IF判定がない場合に発生する問題

  • データのない空行すべてに「0」という数字が何千行もズラーッと表示されてしまう。
  • 空っぽの行に対して毎回SUMIFSの全件検索が走り、スプレッドシートが激しく重くなる。

そこで「もしe(D列)が空っぽなら、何も計算せず空文字(””)を返す」というIFガードを1枚挟むことで、データが存在する有効な行だけをスマートに集計しています。

SUMIFS関数:日報シートから条件合致する数値を合計

数式の心臓部であるSUMIFS関数は、別シートである「日報」シートから目的の数値を集計しています。

SUMIFS(
  '日報'!$W:$W,  // 合計したい列(例:作業時間や売上金額)
  '日報'!$D:$D, b,  // 条件1:日報のD列が現在の行のb(B列)と一致
  '日報'!$C:$C, e   // 条件2:日報のC列が現在の行のe(D列)と一致
)

日報シートの膨大な行の中から、「D列がb」かつ「C列がe」に当てはまる行だけをピックアップし、その行のW列に入っている数値を合算して返しています。

どうやってこうなった?数式誕生に至る進化の軌跡

「なぜ最初からこんなに長い数式を使うのか?」と疑問に思う方も多いはずです。
実はこの数式は、スプレッドシート運用者が誰もが直面する「現場のトラブルや苦悩」を解決していく中で、自然と辿り着いた完成形なのです。その歴史を4つの段階で追ってみましょう。

ステップ:通常のSUMIFSをオートフィルしていた時代

スプレッドシートを使い始めた頃は、誰もが以下のような普通のSUMIFS関数を各行に入力していました。

=SUMIFS('日報'!$W:$W, '日報'!$D:$D, $B2, '日報'!$C:$C, $D2)

そして、セルの右下の青い四角(フィルハンドル)をつかんで、一番下までマウスで引っ張ってコピーします。
しかし、この運用には現場で大きな問題が次々と発生しました。

  • コピペの手間:新しい行が追加されるたびに、人間が手動で数式を下にコピーしなければならない。
  • 数式破損の恐怖:共同編集者が途中の行の数式を誤って消したり、値を手入力で上書きしてしまい、集計が狂う。
  • 動作の重さ:千行あれば千個のSUMIFSが別々のセルで動作するため、ファイル全体が重くなる。

ステップ:ARRAYFORMULAに挑戦して味わった挫折

「行が増えても自動で数式が適用されるようにしたい!」と考えた上級者が次に試すのが、スプレッドシート名物の「ARRAYFORMULA(配列数式)」です。

// よくある失敗例(正常に動作しません)
=ARRAYFORMULA(SUMIFS('日報'!$W:$W, '日報'!$D:$D, B2:B, '日報'!$C:$C, D2:D))

「これですべて解決する!」と確信してエンターキーを押すと、衝撃の事態に直面します。
全行にまったく同じ合計値が表示されてしまったり、エラーになってしまうのです。

ARRAYFORMULAの致命的な弱点

SUMIFSやCOUNTIFS、SUM、AND、ORなどの関数は、引数として渡された配列全体をひとまとめにして集計しようとする性質があります。
そのため、ARRAYFORMULAで囲んでも「行ごとに1件ずつ条件判定して合計を出す」という処理ができず、シート全体の合計を1つの値として計算してしまうのです。

長年、スプレッドシートのユーザーはこの問題に悩まされ、複雑怪奇なQUERY関数を組んだり、扱いにくいSUMPRODUCT関数を駆使して回避する苦難の道を強いられていました。

ステップ:LAMBDAとMAPの登場による革命

この長年の苦悩を一瞬で終わらせたのが、Googleスプレッドシートに追加された「LAMBDAヘルパー関数」です。
その中でも「MAP関数」は、まさに「配列の各行を1つずつ取り出して、指定した関数を個別実行する」という待ち望んでいた機能そのものでした。

=MAP($B:$B, $D:$D, LAMBDA(b,e, SUMIFS('日報'!$W:$W, '日報'!$D:$D, b, '日報'!$C:$C, e)))

この数式により、「ARRAYFORMULAでは不可能だったSUMIFSの1行ごとの自動計算とスピル展開」が、驚くほどシンプルかつ直感的に実現できるようになりました。

ステップ:実務の現場で磨かれたIF空白ガードの完成形

MAPとSUMIFSを組み合わせたことで行ごとの自動展開には成功しましたが、最後に残ったのが「データのない空行まで0が表示されてしまう」「列全体を指定しているため計算が無駄に重くなる」という実務特有の課題でした。
そこで、LAMBDAの内部に「IF(e=””,””, …)」という条件判定を組み込みました。

  • D列に値が入っていない空行は、SUMIFSの計算を一切スキップして空文字を出力する。
  • 無駄な計算リソースを消費しないため、大量データでも動作が極めて軽快になる。
  • 見た目にも不要な「0」が画面下に散らからず、美しい帳票画面が維持できる。

こうして、実務における「保守性の高さ」「計算スピードの速さ」「見た目の綺麗さ」のすべてを満たした究極の数式として完成したのです。

実務でこの数式を運用する際のポイント

この数式を自社の業務シートに導入する際は、以下の2つのポイントを押さえておくとトラブルを防ぐことができます。

展開先(スピル範囲)の下に文字や数式を入力しない

MAP関数は、数式を入力したセルの下に自動的に結果を流し込みます(スピル)。
もし数式の下のセルに手作業で文字や別の数式が入っていると、スプレッドシートは「計算結果を展開する場所がない」と判断し、数式が「#REF!」エラーになってしまいます。
数式を入力する列の下方向は、完全に空にしておきましょう。

行数が数万件に及ぶ場合は範囲の指定方法を工夫する

今回の数式では「$B:$B」「$D:$D」のように列全体を指定しています。直感的で入力が楽な反面、シートに何万行も空行が存在する場合はわずかなオーバーヘッドが生じることがあります。
もしファイル全体の動作をより極限まで高速化したい場合は、ヘッダーを除いた「$B2:$B」「$D2:$D」のように開始行を指定する記述もおすすめです。

まとめ

  • 「=MAP(…)」は、ARRAYFORMULAでは実現できなかった「SUMIFSの行ごと自動展開」を可能にする最新の関数構成。
  • 「LAMBDA(b,e, …)」で各行のB列・D列の値を一時変数として取り込み、SUMIFSの検索条件として渡している。
  • 「IF(e=””,””, …)」の安全装置によって、空行の無駄な計算と0の大量表示を防止している。
  • 先頭セルに1つ置くだけでメンテナンスフリーな運用ができ、数式のコピペ漏れや誤消去事故をゼロにできる。

日々のスプレッドシート業務で「毎回数式を下に引っ張ってコピーしている」「計算が合わなくて誰かが数式を消していないか探している」という方は、ぜひこのMAP × LAMBDA × SUMIFSを活用して、メンテナンスフリーな自動集計シートを構築してみてください。


eguchi.netをもっと見る

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