便利なARRAYFORMULAの挙動について落ち着いて考えてみました

あなたが明日も幸せでいていい理由
2023.12.05

こんばんは。僕です。

Googleスプレッドシートの使い方を調べていると、よくARRAYFORMULA関数が出てきますよね。便利なので、スプシ使いの皆さんはよく使っているのではないかと思います。

しかし、ARRAYFORMULAでできることの中に「できるのは確かに便利だけど……なんでそんなことできるの?」と思うものがあったので、どうしてできるのかについて考えてみました。

ARRAYFORMULAでできること

ざっくり言うと、一つの値に対する計算を、値の配列に対する計算に拡張できます。たとえば、以下のようなことができます。

特定の範囲に対して一気に計算できる

たとえば、「特定の列の全てのセルに対して、同じ計算をしたい」というようなケースで使えます。

図の例では、A列の全てのセルに対し、その2倍の値がB列に入ります。極めてわかりやすいですね。大量のデータを処理するのに便利です。

また、レアケースかもしれませんが、「特定の行の全てのセル」に対する計算でも、同様に扱えます。

範囲同士を計算できる

たとえば、「複数の列のデータを用いて、行ごとに計算したい」というようなケースで使えます。

図の例では、A列とB列を足し合わせた結果がC列に入ります。こちらも比較的わかりやすいですし、特に疑問に思えるような部分もありません。

九九の表のような計算もできる

これが「なんでそんなことできるの?」「どうしてそうなるの?」と思ったケースです。

たとえば以下のように、行見出しと列見出しにデータがある場合、見出しの範囲同士で計算できます。

図の例では、行見出しのデータが2つ、列見出しのデータが2つありますから、2×2=4つのデータが出力されます。

すごい。便利すぎる。感動してしまいました。いや、感動しているのは、スプレッドシート初心者である僕だけなのかもしれませんが……。

実際に九九の表そのものを作る場合は、以下のようになります。

こうして見たとき、直感的には、当たり前にできてほしい感じの計算ではあります。

ただ、公式ドキュメントを一読しただけで、結果がこのように周辺のセルへ展開されることを予想するのは、ちょっと難しいかもしれないですよね。

「まあ、ウェブ検索で調べればこういう使い方の例がたくさん出てくることだし、実際便利だし、正しく動けばそれでいいでしょ! みんなもぜひ使ってみてね〜〜!!」

……しかしですよ。ちょっと立ち止まってみてほしいのですが……

この上ない幸せが自分の身に突然訪れたときに、

「本当に、こんなに幸せでいいんだろうか……? あとで足元を掬われたりしないだろうか……?」

と、不安になってしまうようなことってありませんか? 僕はあります。

ということで、「本当にこんなに便利で幸せでいいのか」ということについて、落ち着いて考えてみたいと思います。

どうしてできるのか順を追って考える

単純な例を用いて、ARRAYFORMULAの動きを追ってみたいと思います。

基本的な動きを追う

まず、特定の列の全てのセルに対して同じ計算をするケースについて考えてみます。

この引数を、セルを参照せずにベタ書きで表現してみると、以下のようになります。

縦に並べるときは、セミコロンで区切りますね。同じデータを表現しているので、結果も同じになります。

さらに、それぞれの行について数式を展開してみます。

数学に出てくる「式の展開」に似ていますね。展開しているだけなので、もちろん結果は同じになります。結果の配列はセミコロンで区切られていますから、計算結果も縦に並びます。

ここで、特定の行の全てのセルに対して同じ計算をするケースについても同様に考えてみます。

これをベタ書きで表現すると、以下のようになります。横に並べるときは、カンマ区切りですね。

上のケースと同様に展開します。

上のケースとほとんど同じような展開ですから、結果がこのように表示されるのも納得できますね。

行に対して計算すれば行として出力されますし、列に対して計算すれば列として出力されるというわけです。

そしてクライマックスです

さて、以上を踏まえて、九九の表のような計算をするケースを考えます。

まず、ベタ書きで表現します。

つぎに、行について展開します。

そして、列について展開します。

なるほど、順番に展開していけば、2×2の二次元配列として展開されることになるというわけですね。

個人的には、ここまで試行して、ようやくこの挙動を納得するに至りました。

まとめ

ARRAYFORMULAの挙動について、その便利さを納得するために、細かく動きを確かめてみました。このように納得することで、機能を深く理解することにつながり、いろいろなところで応用していけそうだという感じがしました。

それじゃ、おやすみなさい。