見出し画像

Google スプレッドシートで BYROW 関数を使う練習をしてみた

はじめに

この記事では、Google スプレッドシートにて ARRAYFORMULA 関数を多用している弊社が、ARRAYFORMULA 関数で実現できていなかった計算を、BYROW 関数を使うことで解決する練習をしてみた結果をご紹介します。
練習であるために、正しい使い方であるかは保証できませんが、参考になれば幸いです。

2023 年 10 月 22 日現在は、GOOGLE のヘルプページにある、BYROW 関数の使い方のみとなります。
練習をすることで、適宜更新をしていきます。

BYROW 関数とは

Google のヘルプでは、BYROW 関数は次のように説明されています。

この関数は、LAMBDA 関数を各行に適用して、配列を行単位でグループ化します。
使用例
BYROW(A1:C3,LAMBDA(行,MAX(行)))
BYROW(A1:C3,LAMBDA(行,SUM(行)))

BYROW 関数

LAMBDA 関数が分かっていないと、どう使えば良いのか分からない関数です。。。

LAMBDA 関数とは

Google のヘルプでは、LAMBDA 関数は次のように説明されています。

一連の名前とそれらを使用する数式を含むカスタム関数を作成して返すことができます。数式を計算するために、名前で宣言されている個数の値を指定して、返された関数を呼び出します。
使用例
LAMBDA(Salary, Salary0.3)(1000)
LAMBDA(Temp, (5/9)(Temp-32))(85)

LAMBDA関数

また、LAMBDA 関数内の説明を読むと、BYROW 関数は、LAMBDA ヘルパー関数というものの一つということのようです。
LAMBDA 関数と LAMBDA ヘルパー関数は、従来のスプレッドシートの関数とは、少し違う使い方をする関数のようです。

使い方

LAMBDA 関数と LAMBDA ヘルパー関数はかなり奥が深いものであるようですが、ここでは、ARRAYFORMULA 関数で実現が難しかった、SUM 関数などとの組み合わせについて、練習をしてみました。

ARRAYFORMULA 関数で実現できなかった計算

ARRAYFORMULA 関数を使うと、配列の各要素に対して、同じ計算を行うことができます。
しかし、ARRAYFORMULA 関数内では、SUM 関数などの配列の集計を行う関数を使うことがうまくできませんでした。

例えば、次のような A〜C 列のデータについて、各行の合計を求める場合、ARRAYFORMULA 関数を使おうとする場合、次のように書きたくなると思います。

$$
\begin{array}{:l:l:l:l:}
A & B & C & D \\ \hline
1 & 4 & 7 & =ARRAYFORMULA(SUM(A1:C3)) \\ \hline
2 & 5 & 8 &   \\ \hline
3 & 6 & 9 &   \\ \hline
\end{array}
$$

しかし、この結果得られるのは、

$$
\begin{array}{:l:l:l:l:}
A & B & C & D \\ \hline
1 & 4 & 7 & 45 \\ \hline
2 & 5 & 8 &   \\ \hline
3 & 6 & 9 &   \\ \hline
\end{array}
$$

という表になってしまい、各行の合計ではなく、全てのセルの合計が D1 セルに表示されてしまいます。
これは、SUM 関数自体が、ARRAYFORMULA で無くても、この配列の合計を求める関数であるためです。

BYROW 関数で実現できた計算

GOOGLE のヘルプにある、BYROW 関数の使用例の一つを検証します。
改めて冒頭の BYROW 関数の説明について、もう一度見てみます。

この関数は、LAMBDA 関数を各行に適用して、配列を行単位でグループ化します。
使用例
BYROW(A1:C3,LAMBDA(行,MAX(行)))
BYROW(A1:C3,LAMBDA(行,SUM(行)))

BYROW 関数

上記では、行が日本語になっていますが、英語のページでは row と記載がありますので、row のままの方が、変数名として読みやすいのではないかと思います。

BYROW(A1:C3,LAMBDA(row,MAX(row)))
BYROW(A1:C3,LAMBDA(row,SUM(row)))

BYROW 関数

そういうことで、BYROW 関数と、その中の LAMBDA 関数を使うと、次のように書くことで、各行の合計を求めることができるようです。

$$
\begin{array}{:l:l:l:l:}
A & B & C & D \\ \hline
1 & 4 & 7 & =BYROW(A1:C3,LAMBDA(row,SUM(row))) \\ \hline
2 & 5 & 8 &  \\ \hline
3 & 6 & 9 &  \\ \hline
\end{array}
$$


この結果得られるのは、以下の表です。

$$
\begin{array}{:l:l:l:l:}
A & B & C & D \\ \hline
1 & 4 & 7 & 12 \\ \hline
2 & 5 & 8 &  15\\ \hline
3 & 6 & 9 &  18 \\ \hline
\end{array}
$$

このように、各行の合計を求めることができました。
ARRAYFORMULA 関数で、このような形で合計を出したかった方は多いのではないでしょうか。

ざっくりなイメージとしては、BYROW の第一引数である A1:C3 は、この関数を適用する範囲を指定していますが、1〜3 については、各行に適用するということを意味しているようです。
一方で、A〜C については、各行で計算する際の、LAMBDA 関数の引数として渡されているイメージです。

1 行目の値を計算される際には、
A1〜C1 の値が、LAMBDA 関数の row という引数に配列として渡され、SUM 関数によって合計が求められます。

まとめ

Googleのヘルプページにある、BYROW 関数の使い方を練習してみました。
すごく便利な ARRAYFORMULA 関数が苦手としていた、配列計算をする関数と組み合わせた計算を、BYROW 関数を使うことで実現できることが分かりました。
このページは、BYROW 関数の新たな使い方を学ぶたびに、更新していきたいと考えています。

この記事が気に入ったらサポートをしてみませんか?