Googleスプレッドシートでは、MAP関数とLAMBDA関数を使うことで、複数行に同じ計算処理を自動適用することができます。これまで1行ごとに入力していたIF関数の計算式も、MAP関数を利用すれば1つの数式だけで列全体へ展開できます。
ただし、MAP関数へ置き換える際には、元の数式で参照しているセルが固定値なのか、行ごとに変化する値なのかを確認する必要があります。この記事では、IF関数をMAP+LAMBDAへ変換するときの考え方や正しい記述方法について解説します。
GoogleスプレッドシートのMAP関数とLAMBDA関数の基本
MAP関数は、指定した範囲の各行や各セルに対して、同じ処理を繰り返し適用するための関数です。LAMBDA関数と組み合わせることで、配列の各要素を受け取り、その結果をスピル表示できます。
例えば、A列の値を1.1倍した結果をB列へ表示したい場合、通常ならB5に数式を入力して下方向へコピーします。しかしMAP関数を使えば、1つの数式だけで範囲全体を処理できます。
=MAP(A5:A,LAMBDA(x,x*1.1))
このように、コピー作業を減らしてデータ更新にも強いシートを作成できます。
元のIF関数を確認するとMAP化するときのポイントが分かる
元の数式では、以下のような処理をしています。
=IF(OR(B5="",D5=""),"",W5*V5/U5)
この式は、B5またはD5が空白の場合は空欄を表示し、両方に値がある場合だけW5×V5÷U5の計算結果を表示するという意味です。
ここで重要なのは、B5やD5は行ごとに変わるデータですが、W5・V5・U5も本来は各行に対応した値である可能性が高いという点です。
そのためMAP関数へ変更する場合は、計算対象となるセル範囲もMAPへ渡す必要があります。
MAP関数へ変換するときの正しい考え方
質問のようなケースでは、B列、D列、U列、V列、W列をそれぞれMAPに渡して、LAMBDA内で行ごとの計算を行います。
例えば5行目以降を対象にする場合は、以下のような形になります。
=MAP(B5:B,D5:D,U5:U,V5:V,W5:W,LAMBDA(_b,_d,_u,_v,_w,IF(OR(_b="",_d=""),"",_w*_v/_u)))
この数式では、各行のB列、D列、U列、V列、W列の値を受け取り、元のIF関数と同じ処理を行います。
元の数式でW5やV5、U5を固定したままMAPしてしまうと、すべての行で同じ5行目の値を使って計算してしまうため、期待した結果になりません。
MAP関数で不要な範囲を追加するときの注意点
MAP関数では、LAMBDAの引数として渡した範囲の数だけ変数を用意する必要があります。
例えば、以下のようにG列を追加した場合です。
=MAP(B5:B,D5:D,G5:G,LAMBDA(_b,_d,_g,W5*V5/U5))
この式ではG列の値を受け取っていますが、計算式内では_Gを使用していません。また、W5、V5、U5も固定セルのままなので、元の式をスピル化したものにはなりません。
処理に使わない列はMAPへ渡さなくても問題ありません。必要なデータだけをLAMBDAへ渡すことで、数式も分かりやすくなります。
MAP関数を使うメリットと利用例
MAP関数を利用すると、行数が増減するデータでも自動的に計算結果が広がるため、管理しやすいシートになります。
例えば、商品管理表で「数量×単価」「勤務時間×時給」「売上金額÷数量」などの計算を大量に行う場合、MAP関数を使えば数式コピーの手間を減らせます。
また、新しいデータを追加した場合でも範囲内であれば自動計算されるため、入力ミスやコピー漏れの防止にもつながります。
MAP関数でエラーを防ぐための確認ポイント
MAP関数へ変更した後は、元の数式と同じ結果になるか数行分を比較することが大切です。
特に確認したいポイントは以下の通りです。
- 各行の参照先が正しく変化しているか
- 空白条件が元のIF関数と同じ動作になっているか
- 0除算エラーが発生しないか
- 不要な範囲をMAPへ渡していないか
一見すると短い数式になりますが、参照範囲を間違えると全行で同じ値を計算してしまうことがあります。
まとめ
GoogleスプレッドシートのMAP関数とLAMBDA関数を使えば、IF関数を含む計算式を列全体へスピルさせることができます。
ただし、単純に元の数式をMAPで囲むだけでは正しく動作しません。行ごとに変化するセルはすべてMAPの対象範囲として渡し、LAMBDA内で受け取った変数を使って計算することが重要です。
既存の数式をMAP化するときは、「どの値が行ごとに変わるのか」を確認してから変換すると、効率的でメンテナンスしやすいスプレッドシートを作成できます。

コメント