スプレッドシートで「全セルに同じ加工をしたい」場面、ありませんか? 数値の四捨五入、条件に応じたラベル付け、文字列の変換など、1つずつ数式をコピーしていくのは手間がかかります。
MAP関数を使えば、配列のすべてのセルにLAMBDA関数で処理を一括適用できます。しかも複数の配列を同時に処理できるのが、MAP関数ならではの強みです。
この記事では、MAP関数の基本から、ARRAYFORMULA関数やBYCOL・BYROW関数との違いまでわかりやすく解説します。
MAP関数とは?
MAP関数(読み方: マップ関数)は、配列やセル範囲の各セルに対してLAMBDA関数を適用する関数です。結果は元の配列と同じサイズで返ります。「map(対応づける)」が名前の由来で、各値を別の値に変換するイメージですね。
たとえば、3行x3列の売上データにMAP関数でROUND処理を適用すると、9つのセルすべてが四捨五入された値に置き換わります。元の表と同じ形のまま一括で変換できるのがポイントです。
MAP関数にできることをまとめると、次のとおりです。
- 各セルに同じ処理(四捨五入、条件分岐、文字変換など)を一括適用する
- LAMBDA関数で処理内容を自由にカスタマイズできる
- 複数の配列を同時に渡して、対応するセル同士を処理できる
NOTE
MAP関数はGoogleスプレッドシート独自の関数です。Excelには同じ名前の関数がないため、Excelで同様の処理をしたい場合は、ARRAYFORMULA関数や配列数式で代用してください。
MAP関数の基本構文
=MAP(配列, LAMBDA(値, 処理))
カッコの中に、処理対象の配列と、各セルに適用するLAMBDA関数を指定します。
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 配列 | 必須 | 処理対象のセル範囲または配列(複数指定可) |
| LAMBDA(値, 処理) | 必須 | 各セルに適用する関数。「値」は各セルを受け取る仮引数 |
LAMBDA関数の仮引数(上の例では「値」)には好きな名前を付けられます。valやvでもOKです。この仮引数に各セルのデータが1つずつ渡されて、処理が実行されます。
複数配列を渡す場合の構文はこうなります。
=MAP(配列1, 配列2, LAMBDA(値1, 値2, 処理))
配列1と配列2の同じ位置にあるセルが、それぞれ値1・値2としてLAMBDA関数に渡されます。配列は3つ以上でも指定可能です。ただし、すべての配列は同じサイズ(行数×列数)にしてください。
LAMBDA関数のおさらい
MAP関数を理解するには、LAMBDA関数の基本を知っておく必要があります。詳しくはBYCOL関数の記事で解説していますが、ここでもかんたんにおさらいしておきますね。
LAMBDA関数は「自分だけの関数を作れる」関数です。引数と処理内容を自分で定義できます。
=LAMBDA(引数, 処理)(値)
たとえば =LAMBDA(x, x2)(5) と書くと、xに5が入って「52=10」が返ります。MAP関数の中では、このLAMBDA関数に各セルの値が自動的に渡される仕組みです。
MAP関数の基本的な使い方
ここでは、売上データをMAP関数で一括変換する例を紹介します。
サンプルデータ
A1:D4に以下のデータが入っているとします。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 4月 | 5月 | 6月 | |
| 2 | 東京 | 98.7 | 120.3 | 110.5 |
| 3 | 大阪 | 82.4 | 91.8 | 85.2 |
| 4 | 名古屋 | 63.1 | 74.6 | 68.9 |
各セルを四捨五入する
B2:D4の数値を一括で四捨五入します。出力先のセル(たとえばF2)に以下の数式を入力して、Enterを押します。
=MAP(B2:D4, LAMBDA(val, ROUND(val, 0)))
結果が元の3行x3列と同じ形で返ります。
| F | G | H | |
|---|---|---|---|
| 2 | 99 | 120 | 111 |
| 3 | 82 | 92 | 85 |
| 4 | 63 | 75 | 69 |
すべてのセルがROUND関数で四捨五入されました。9つのセルに個別にROUND関数を入力する手間が省けますね。
条件分岐を一括適用する
各セルの値を条件で判定し、ラベルを付ける例です。
=MAP(B2:D4, LAMBDA(val, IF(val >= 100, "達成", "未達")))
| F | G | H | |
|---|---|---|---|
| 2 | 未達 | 達成 | 達成 |
| 3 | 未達 | 未達 | 未達 |
| 4 | 未達 | 未達 | 未達 |
IF関数と組み合わせれば、全セルに条件分岐を一括適用できます。目標達成の判定表が一発で完成です。
複数の配列を同時に処理する
MAP関数ならではの機能が、複数の配列を同時に処理できることです。
たとえば、売上データ(B2:D4)と目標データ(F2:H4)の2つの表がある場合を考えてみましょう。
=MAP(B2:D4, F2:H4, LAMBDA(actual, target, actual - target))
各セルの「売上 – 目標」の差額が一括で計算されます。2つの表の同じ位置にあるセルが、LAMBDAの引数に1つずつ渡される仕組みです。
この使い方はBYCOL関数やBYROW関数にはありません。「複数の表を突き合わせてセルごとに処理したい」場面では、MAP関数の出番ですよ。
MAP関数の実務活用パターン
パターン1: 空白セルにデフォルト値を埋める
データに空白セルが混じっているとき、一括で「0」や「-」に置き換えます。
=MAP(B2:D10, LAMBDA(val, IF(val="", 0, val)))
空白だったセルが0に置き換わり、それ以外はそのまま残ります。集計前のデータクリーニングに便利なパターンです。
パターン2: 数値にカンマ区切りの書式を適用する
大きな数値をカンマ区切りの文字列に変換します。
=MAP(B2:D10, LAMBDA(val, TEXT(val, "#,##0")))
TEXT関数と組み合わせれば、表示形式の一括変換がワンステップで完了します。
パターン3: 税込価格を一括計算する
税抜き価格の表から、税込価格の表を一発で作ります。
=MAP(B2:D10, LAMBDA(val, ROUND(val * 1.1, 0)))
消費税10%を掛けてROUND関数で整数に丸めています。価格表の更新に使えるパターンです。
パターン4: 2つの列を結合してフルネームを作る
姓(A列)と名(B列)を結合して、フルネームを作る例です。
=MAP(A2:A10, B2:B10, LAMBDA(sei, mei, sei & " " & mei))
複数配列の同時処理を使えば、姓と名を1つの列にまとめる作業が一括で片付きます。
パターン5: エラー値を安全に処理する
計算結果にエラーが含まれる可能性がある場合、エラーを別の値に置き換えます。
=MAP(B2:D10, LAMBDA(val, IFERROR(val / A2, "N/A")))
IFERROR関数を組み込めば、エラーが出たセルだけを「N/A」に置き換えられます。他のセルは正常に計算されますよ。
ARRAYFORMULA関数との違い・使い分け
MAP関数と似た機能を持つのがARRAYFORMULA関数です。どちらも「範囲に処理を一括適用する」関数ですが、得意分野が異なります。
| 比較項目 | MAP関数 | ARRAYFORMULA関数 |
|---|---|---|
| 処理の定義方法 | LAMBDA関数で自由に記述 | 既存関数をそのまま使用 |
| 複数配列の同時処理 | 対応(配列をいくつでも渡せる) | 非対応(1つの数式で処理) |
| 複雑な条件分岐 | 得意(LAMBDA内で自由に組める) | シンプルな条件のみ |
| 学習コスト | やや高い(LAMBDA関数の理解が必要) | 低い(既存関数を囲むだけ) |
| パフォーマンス | 大量データではやや遅い | 高速 |
使い分けの目安はこうです。
- 既存関数をそのまま範囲に適用したい → ARRAYFORMULA関数
- LAMBDAで複雑な処理を定義したい・複数配列を同時に処理したい → MAP関数
ARRAYFORMULA関数で書ける例
たとえば「各セルに2を掛ける」程度のシンプルな処理なら、ARRAYFORMULA関数のほうが簡潔です。
=ARRAYFORMULA(B2:D4 * 2)
MAP関数で書くと =MAP(B2:D4, LAMBDA(val, val * 2)) になります。結果は同じですが、ARRAYFORMULA関数のほうが短くて読みやすいですよね。
MAP関数でないとできない例
一方、複数の配列を突き合わせて処理するケースはMAP関数の出番です。
=MAP(B2:D4, F2:H4, LAMBDA(actual, target, IF(actual >= target, "OK", "NG")))
「売上」と「目標」の2つの表を突き合わせて、達成・未達を判定しています。ARRAYFORMULA関数でも =ARRAYFORMULA(IF(B2:D4>=F2:H4,"OK","NG")) と書けますが、LAMBDAで複雑な処理を組み立てられるのはMAP関数だけです。
BYCOL・BYROW関数との違い・使い分け
LAMBDA系関数にはBYCOL関数とBYROW関数もありますが、処理の粒度がまったく異なります。
| 比較項目 | MAP関数 | BYCOL関数 | BYROW関数 |
|---|---|---|---|
| 処理単位 | セル(1つずつ) | 列(まとめて) | 行(まとめて) |
| 結果の形 | 元の配列と同じサイズ | 横1行 | 縦1列 |
| 向いている処理 | 変換・加工 | 列ごとの集計 | 行ごとの集計 |
| LAMBDAに渡される値 | 各セルの値 | 各列全体(配列) | 各行全体(配列) |
| 複数配列の同時処理 | 対応 | 非対応 | 非対応 |
使い分けの目安はこうです。
- 各セルを個別に変換したい → MAP関数
- 列ごとにまとめて集計したい → BYCOL関数
- 行ごとにまとめて集計したい → BYROW関数
MAP関数は「セルごと」、BYCOL・BYROWは「まとめて集計」。この違いを押さえておけば迷いませんよ。
TIP
「合計や平均を出したい」ならBYCOL・BYROW関数、「各セルの値を変換・加工したい」ならMAP関数です。「集計か変換か」で選んでくださいね。
LAMBDA系関数の全体像
スプレッドシートには、LAMBDA関数と組み合わせて使う関数が複数あります。全体像を把握しておくと、どの場面でどの関数を使うか判断しやすくなりますよ。
| 関数 | 処理単位 | 結果の形 | 主な用途 |
|---|---|---|---|
| MAP | セルごと | 元と同じ形 | セルごとの変換・加工 |
| BYCOL | 列ごと | 横1行 | 列ごとの集計 |
| BYROW | 行ごと | 縦1列 | 行ごとの集計 |
| REDUCE | 配列全体 | 1つの値 | 全体を1つに集約 |
| SCAN | 累積 | 縦1列 | 累積計算の中間結果 |
| MAKEARRAY | 行×列 | 新しい配列 | 計算で配列を生成 |
MAP関数は「各セルを個別に変換する」という、最も直感的な使い方の関数です。配列処理のファーストチョイスとして覚えておくと便利ですよ。
よくあるエラーと対処法
MAP関数はLAMBDA関数と組み合わせるため、構文のミスが起こりやすいです。
| エラー | 原因 | 対処法 |
|---|---|---|
#NAME? | 関数名のスペルミス | 「MAP」のスペルを確認してください |
#NAME? | Excelで使用しようとした | MAP関数はGoogleスプレッドシート専用です |
#NAME? | LAMBDA関数の仮引数名が不正 | 仮引数名にセル参照(A1等)やスペースは使えません |
#VALUE! | 複数配列のサイズが不一致 | MAP関数に複数の配列を渡す場合、すべて同じ行数×列数にしてください |
#REF! | 出力先のセルにデータがある | 結果が元の配列と同じサイズで展開されるため、出力先に十分な空きスペースを確保してください |
#ERROR! | LAMBDAの引数の数が合わない | 配列が1つならLAMBDAの仮引数も1つ、配列が2つなら仮引数も2つにしてください |
特に多いのが「複数配列のサイズ不一致」エラーです。MAP関数に複数の配列を渡すとき、たとえばB2:D4(3行3列)とF2:H5(4行3列)のように行数が違うと#VALUE!になります。範囲を揃えてから試してくださいね。
TIP
LAMBDA関数の仮引数名で迷ったら、
valやvを使うのがおすすめです。複数配列を渡すときは、aとbや、意味のある名前(actualとtargetなど)を使うと読みやすくなります。
まとめ
MAP関数は、配列の各セルにLAMBDA関数で処理を適用し、結果を元の配列と同じサイズで返す関数です。セルごとの変換・加工を一括で自動化できるので、データクリーニングや表の加工がグッと楽になります。
この記事のポイントをおさらいしておきましょう。
- MAP関数は
=MAP(配列, LAMBDA(val, 処理))で、各セルに同じ処理を一括適用する - 複数の配列を渡して、対応するセル同士を処理できるのがMAP関数ならではの強み
- シンプルな計算はARRAYFORMULA関数、LAMBDA処理や複数配列はMAP関数と使い分ける
- BYCOL・BYROW関数は集計向き、MAP関数は変換・加工向き
- Googleスプレッドシート独自の関数で、Excelでは使えない
まずは=MAP(B2:D4, LAMBDA(val, ROUND(val, 0)))のシンプルな四捨五入から試してみてください。一度使い方を覚えれば、IF関数やTEXT関数など、処理部分を入れ替えるだけでさまざまな変換に応用できますよ。
