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

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

横方向のセル範囲を行ごとにまとめて集計・自動展開するモダン関数

Googleスプレッドシートで「テストの3科目の合計点」や「単価×個数の小計」などを下方向へ一括展開したいとき、どのように数式を組んでいますか?
オートフィルで数式を下にコピーする運用だと、行が増えるたびにコピーし直す手間が発生し、共同編集者が途中の数式を消してしまうリスクもあります。
そこで活躍するのが、2022年に追加された「BYROW(バイ・ロー)関数」です。
本記事では、BYROW関数の意味や仕組み、基本構文、実務でよく使われる作り方の実例(SUM合計、単価×個数の掛け算、INDEXでの列指定)、そして多くの人が悩む「MAP関数との決定的な違い・使い分け」まで分かりやすく解説します。

BYROW関数とは?基本的な意味と仕組み

BYROW(バイ・ロー)関数は、指定した配列や表の範囲からデータを「1行分(横一列のセル範囲)」ずつ取り出し、LAMBDA(ラムダ)関数に渡して計算を行い、その結果を縦1列の配列として自動展開(スピル)する関数です。

英語の「by row(行ごとに)」という名前のとおり、指定した範囲を「行単位」で順番にループ処理してくれます。
先頭のセルに数式を1つ書くだけで、下方向のすべての行に対して計算結果が出力されるため、オートフィルや数式のコピーが一切不要になります。

BYROW関数の基本構文と引数の意味

BYROW関数は、必ずLAMBDA関数とセットで記述します。基本構文は以下のとおりです。

=BYROW(配列または範囲, LAMBDA(行の名前, 計算式))
構成要素 意味と具体的な役割
配列または範囲 処理対象とする表の範囲を指定します(例:A2:B5、B2:D6など)。縦横の2次元範囲をそのまま渡せます。
行の名前(仮引数) 1行分のセル範囲を受け取るための一時的な変数名です。「r」(rowの頭文字)や「row_data」など、任意の名前を付けられます。
計算式 各行に対して実行したい処理を記述します。受け取った行範囲(r)に対して、SUM(r)やAVERAGE(r)、PRODUCT(r)などの関数を直接適用できます。

MAP関数とBYROW関数の決定的な違い

Googleスプレッドシートには、同じように配列をループ処理する「MAP関数」も存在します。
「MAPとBYROWはどちらを使えばいいのか?」と迷う方も多いですが、この2つには「データを取り出す単位」に明確な違いがあります。

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

▲ セル単位で値を取り出すMAP関数と、横一列の範囲を取り出すBYROW関数の違い

MAP関数:セル単位(値)でデータを取り出す

MAP関数は、複数の列を別々の引数として渡し、1行ごとの「1個ずつの値(スカラー値)」を変数に代入して計算します。
たとえば「=MAP(A2:A, B2:B, LAMBDA(a, b, a * b))」のように、離れた列同士の値をペアにして計算するのが得意です。
一方で、変数「a」の中には1つのセルの値しか入っていないため、「SUM(a)」のように横方向をまとめて集計することはできません。

BYROW関数:行単位(セル範囲)でデータを取り出す

BYROW関数は、表の範囲(例:B2:D6)をまるごと渡し、横方向の「1行分のセル範囲」を配列の塊として変数に受け取ります。
そのため、変数「r」に対して直接「SUM(r)」や「AVERAGE(r)」「MAX(r)」を実行できるのが最大の強みです。
横方向の複数セルをまとめて集計したい場合は、BYROW関数を使うのがもっともシンプルで自然な書き方になります。

実践!作り方の実例

実務でよく使われる具体的なシーンを取り上げ、BYROW関数の作り方を見ていきましょう。

実例:行ごとの合計(SUM)を一括自動展開

生徒ごとの「国語・数学・英語」の3科目の得点を横方向に合計し、合計欄に自動展開する例です。

=BYROW(B2:D6, LAMBDA(r, IF(INDEX(r, 1, 1)="", "", SUM(r))))

スプレッドシート BYROW×LAMBDA×SUM 行ごと合計の画面キャプチャー

▲ E2セルに数式を入力するだけで、全生徒の3科目合計が自動的に計算・スピル出力されます

この数式では、B2:D6の範囲が1行ずつ「r」に渡されます。1行目を処理するとき、「r」にはB2:D2のセル範囲が入っているため、「SUM(r)」と書くだけで85+90+88の合計(263)が計算されます。
オートフィルで数式を下までコピーする必要は一切ありません。

実例:行ごとの要素を掛け合わせる計算(PRODUCT関数)

単価(A列)と個数(B列)が並んでいる表で、各行の「単価 × 個数」を計算して合計欄に出力する例です。
行全体の数値を掛け合わせたいときは、掛け算を行う「PRODUCT関数」を行範囲に適用するのが便利です。

=BYROW(A2:B5, LAMBDA(r, IF(INDEX(r, 1, 1)="", "", PRODUCT(r))))

スプレッドシート BYROW×LAMBDA×PRODUCT 単価×個数計算の画面キャプチャー

▲ C2セルに数式を1つ置くだけで、全行の単価×個数が一括計算されてスピル展開されます

PRODUCT関数は指定した範囲内のすべての数値を掛け合わせる関数です。各行の単価と個数が「r」としてまとめて渡されるため、シンプルに記述できます。

実例:INDEX関数を使って特定列を指定して計算する

「掛け算だけでなく、1列目と2列目を個別に指定して引き算や割り算を行いたい」という場合は、INDEX関数を組み合わせて行データから特定の列を取り出します。

=BYROW(A2:B5, LAMBDA(r, INDEX(r, 1, 1) * INDEX(r, 1, 2)))

INDEX(r, 1, 列番号) の意味

変数「r」には1行分のデータ(1行×複数列の範囲)が入っています。
「INDEX(r, 1, 1)」は「その行の1列目のセル」、「INDEX(r, 1, 2)」は「その行の2列目のセル」を指します。
このように書くことで、行範囲の中から特定の列を取り出して柔軟な四則演算や条件判定を組み立てることができます。

実務で差がつく!IF空行ガードの作り方

BYROW関数で表全体(例:A2:BやB2:D)を範囲指定する場合、データが入っていない空白行まで計算が実行されてしまうのを防ぐため、「IF判定」による空行ガードを組み込むのが実務の鉄則です。

=BYROW(B2:D, LAMBDA(r, IF(INDEX(r, 1, 1)="", "", SUM(r))))

「INDEX(r, 1, 1)=””」と記述することで、「もしその行の1列目(先頭セル)が空っぽなら、何も計算せず空文字(””)を返す」という判定を行っています。
このガードを1つ入れておくことで、シート下部に無駄な「0」がズラーッと並んだり、ファイル全体の動作が重くなるトラブルを未然に防止できます。

BYROW関数を使う際の注意点とエラー対処法

BYROW関数を導入する際によくあるエラーと対処法を確認しておきましょう。

#REF! エラー(展開先のセル重複)

数式を入力したセルの下方向に、すでに手作業で入力した数値や文字、別の計算式が存在すると、「#REF!(展開先が空ではありません)」というエラーが発生します。
数式を入力したセルより下の列のデータをすべてクリアして空欄にしておくことで解消されます。

LAMBDAの引数は「1つ」だけ指定する

MAP関数では渡した配列の数だけ仮引数を指定(LAMBDA(a, b, …))できますが、BYROW関数では渡す範囲が1つのため、LAMBDAの仮引数も必ず「1つ(LAMBDA(r, …))」になります。
仮引数を2つ以上書いてしまうとエラーになるため注意してください。

まとめ

  • BYROW関数の本質:表の範囲から「1行分のセル範囲」を配列として取り出し、LAMBDAで定義した処理を行単位で実行して全行スピル出力する関数。
  • 横方向の集計に最適:行ごとの合計(SUM)、平均(AVERAGE)、最大値(MAX)、掛け算(PRODUCT)などをシンプルに計算できる。
  • MAP関数との使い分け:離れた列のセル同士をペアで計算するなら「MAP」、横方向のまとまった範囲を集計するなら「BYROW」を選択するのが基本。
  • 実務では空行ガードを活用:未入力行での無駄な計算や「0」表示を防ぐため、「IF(INDEX(r, 1, 1)=””, “”, …)」を組み合わせておくと安心。

これまでオートフィルで数式を下まで引っ張っていた集計表も、BYROW関数を活用することで、数式を1箇所で管理できるスマートで保守性の高いスプレッドシートに生まれ変わります。ぜひ日々の実務に役立ててみてください。


eguchi.netをもっと見る

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