Google Docs エディタ ヘルプのARRAYFORMULAページには、構文が一行で書かれています。ARRAYFORMULA(array_formula)。これ自体は正確です。しかし、実際の財務モデルを構築しようとすると、必要な知識の1割にも満たないことに気づきます。どの関数にこのラッパーが必要なのか、内部でサイレントに失敗する関数はどれか、複数タブにまたがって参照するときに計算チェーンを壊さないようにするにはどうすればいいか--そういった情報はGoogle Docs エディタ ヘルプのどこにも書かれていません。
本記事では、その空白を埋めます。
公式ドキュメントが実際に教えてくれること
Google Docs エディタ ヘルプがしっかりカバーしているのは3点です。
- キーボードショートカット(Windowsは
Ctrl+Shift+Enter、MacはCmd+Shift+Enter)を使うと、現在の数式を自動的にARRAYFORMULAでラップできる - 算術演算子と組み合わせると、
=ARRAYFORMULA(A2:A100 * B2:B100)のように2列を要素ごとに掛け合わせられる IF、LEN、基本的な演算子など、配列対応の関数はモダンなSheetsではラッパー不要(2024年以降、多くの関数が自動スピル対応となっている)
3点目は重要なポイントですが、ドキュメントでの扱いは控えめです。Googleは静かに多くの関数を「配列ネイティブ」化しています。たとえば=IF(A2:A100>0, "正", "負")は、現在のSheetsではARRAYFORMULA不要でスピルします。このラッパーが今日最も活躍するのは、配列非対応の関数に対してセル範囲を処理させたいときや、出力の形を明示的にコントロールしたいときです。
ARRAYFORMULA対応関数・非対応関数の一覧
実務でよく使う関数のARRAYFORMULA対応状況をまとめました。なお、Google Sheetsの全関数一覧も公式リファレンスとして参照できます。
| 関数 | ARRAYFORMULA対応 | 推奨の使い方 |
|---|---|---|
IF | ✅ ネイティブ対応(スピル) | ARRAYFORMULAなしでも動作。ラップすると意図を明示できる |
SUMIFS | ✅ ARRAYFORMULAで拡張 | 行ごとの複数条件集計が可能になる |
IFS | ✅ ネイティブ対応(スピル) | ARRAYFORMULAなしでも動作 |
LEN / LEFT / MID | ✅ ネイティブ対応(スピル) | ラップ不要 |
IFERROR | ✅ ARRAYFORMULAで使用可 | INDEX/MATCHと組み合わせて使う |
INDEX/MATCH | ✅ 推奨 | ARRAYFORMULA内でのVLOOKUP代替として最適 |
VLOOKUP | ⚠️ 制限あり | 先頭の一致のみ返すことが多い。INDEX/MATCHを推奨 |
QUERY | ❌ 効果なし | ARRAYFORMULAでラップ不要。オーバーヘッドが増えるだけ |
IMPORTRANGE | ❌ 効果なし | ARRAYFORMULAでラップ不要 |
UNIQUE / SORT | ❌ 単体で動作 | 自体が配列を返す関数のため、ラップは不要 |
FP&A実務でARRAYFORMULAが真価を発揮するシーン
複数タブの財務モデルにおいて、ARRAYFORMULAの本来の用途は列の乗算ではありません。条件付き集計やクロスタブ参照を、200行にコピーするのではなく1つのセルで管理することです。
パターン1:列全体を対象にしたSUMIF
Google Docs エディタ ヘルプには記載がありませんが、SUMIFやSUMIFSは合計範囲が列の場合、ネイティブでは配列を返しません。ARRAYFORMULAで行ごとの評価を強制します。
=ARRAYFORMULA(
SUMIFS(
'損益明細'!$D:$D, -- 集計対象:部門別売上
'損益明細'!$B:$B, 前提条件!$B$3:$B$14, -- 照合:コストセンターコード
'損益明細'!$C:$C, ">=" & 前提条件!$D$3 -- フィルター:対象期間以降
)
)
この数式はサマリータブの1セルに入力するだけで、前提条件!$B$3:$B$14に対応した12ヶ月分の値を返します。コピー貼り付けは不要で、行間で数式がずれる心配もなく、9行目と10行目で異なる期間を参照してしまうリスクもありません。
パターン2:複数条件によるテキスト分類
500行の仕訳明細を「売上原価」「販管費」「営業外費用」などに分類する作業を、IF関数のネストを列コピーで対応しようとすると、メンテナンスが煩雑になります。ARRAYFORMULAなら1セルで完結します。
=ARRAYFORMULA(
IF('仕訳明細'!C2:C="売上原価", "COGS",
IF('仕訳明細'!C2:C="営業費用", "OpEx",
IF('仕訳明細'!C2:C="一般管理費", "G&A",
"その他")))
)
経理部門が新しい勘定科目を追加して30行の分類が崩れたとき、修正箇所はたった1ヶ所です。2分で直せるか、20分かけて調査が必要かの差は、ここに生まれます。
パターン3:別タブから行数を動的に取得
このシナリオはGoogle Docs エディタ ヘルプでまったく触れられていません。売上タブに四半期ごとに増減する商品SKUがある場合、A2:A100とハードコードすると、空行が生じるか、データが途中で切れるかのどちらかになります。次のパターンが解決策です。
=ARRAYFORMULA(
IF(
'売上'!A2:A = "", -- データが終わる行で止まる
"",
'売上'!B2:B * 前提条件!$C$4 -- 単価 × 数量調整係数
)
)
IF(...="", "")によるガードは、ドキュメントには登場しないパターンです。これがないと、ARRAYFORMULAは列内のすべての空行に結果を出力し続け、1万行の可能性がある列ではパフォーマンスが著しく低下します。
ARRAYFORMULAではできないこと(試してみてわかること)
Google Docs エディタ ヘルプには制限事項の記載がありません。しかし、いくつか存在します。
VLOOKUPはARRAYFORMULA内では期待通りに動きません。=ARRAYFORMULA(VLOOKUP(A2:A100, '単価マスタ'!$A:$B, 2, 0))と書いても、最初の一致のみ返すかエラーになることが多いです。代わりにINDEX/MATCHを使いましょう。
=ARRAYFORMULA(
IFERROR(
INDEX('単価マスタ'!$B:$B,
MATCH('売上'!A2:A100, '単価マスタ'!$A:$A, 0)
),
0
)
)
**QUERYとIMPORTRANGEはARRAYFORMULAを必要とせず、効果もありません。**ラップしてもオーバーヘッドが増えるだけで、出力は変わりません。公式ドキュメントにこの注意書きはありません。
**参照方式のミスはサイレントに誤った結果を生みます。**ARRAYFORMULAで$D$4のような絶対参照とC2:Cのような範囲を組み合わせると、Sheetsは単一セルを正しくブロードキャストします。しかし誤ってD4(相対参照)と書いてしまうと、Sheetsは評価時に行ごとにセルをシフトするため、数値は一見もっともらしく見えながら実は間違っています。これがモデルを崩壊させる原因になります。数値に違和感があればCtrl+~(数式表示モード)で確認してください。
大規模モデルにおけるパフォーマンスの現実
Google Sheetsのセル上限は1,000万セルです。Google Docs エディタ ヘルプにもこの制限は記載されています。しかし書かれていないのは次の点です--5万行あるタブでA:Aのような列全体を対象にしたARRAYFORMULAが8つの別タブから参照されると、再計算に30秒以上かかることがあります。
対策は範囲の上限を明示することです。取引データが5,000行を超えないなら、A:AではなくA2:A5000と書きましょう。取締役会向けの四半期報告モデルで損益タブが6つのダウンストリームタブにデータを供給している場合、この差が「4秒で開くモデル」と「タイムアウトするモデル」を分けることになります。
2026年6月現在、Google Sheetsはソース範囲が編集されるたびに関連するすべてのARRAYFORMULA結果を再計算します。値の貼り付けによる静的化以外に、これを止める方法はありません--ただし、それではARRAYFORMULAを使う意味がなくなります。
ドキュメントに載っているショートカットと、載っていないもの
Ctrl+Shift+Enterで現在の数式を自動的にARRAYFORMULAでラップできます。これはGoogle Docs エディタ ヘルプに記載があります。
載っていないのは次の点です。Excelから移行した旧来の配列数式({...}の波括弧で囲まれた形式)の波括弧を削除すると、Sheetsが想定外の評価をする場合があります。波括弧の構文はExcelの配列数式表記です。Google SheetsはARRAYFORMULAをラッパーとして使用します。Excelからモデルをインポートした場合、{=SUM(IF(...))}のような数式は必ず確認してください。=ARRAYFORMULA(SUM(IF(...)))に書き換えないと、Sheetsで正しく評価されないことがあります。
ARRAYFORMULAを使わない方がいいケース
同じ計算を3行だけ行い、モデルが今後拡張しない場合は、数式をコピーする方が早く構築でき、他のアナリストがレビューするときも追いやすいです。ARRAYFORMULAは間接層を1つ加えることになり、ロジックをステップごとに追う際にモデルレビューの速度を落とします。
ARRAYFORMULAが最も効果を発揮するのは、20行以上の可変長データ、または同じ数式を増加するデータセットと同期し続ける必要がある箇所です。固定した5行の前提条件テーブルには、オーバースペックです。
よくある質問(FAQ)
Q. Google Sheets のARRAYFORMULA関数とは何ですか?
A. ARRAYFORMULAは、通常は単一セルを対象とする関数にセル範囲を渡し、複数行・複数列にわたる結果を1つの数式で返せるようにするGoogle Sheetsの関数です。=ARRAYFORMULA(array_formula)という構文で使用します。Google Docs エディタ ヘルプの公式ページにも基本的な説明が掲載されています。
Q. ARRAYFORMULAのキーボードショートカットは?
A. WindowsではCtrl+Shift+Enter、MacではCmd+Shift+Enterです。現在入力中の数式を自動的に=ARRAYFORMULA(...)でラップしてくれます。
Q. VLOOKUPはARRAYFORMULAの中で使えますか?
A. 推奨しません。=ARRAYFORMULA(VLOOKUP(...))は先頭の一致のみ返すかエラーになることが多いです。代わりに=ARRAYFORMULA(IFERROR(INDEX(...), MATCH(...)))の組み合わせを使ってください。
Q. スピル(自動展開)とARRAYFORMULAの違いは何ですか?
A. 2024年以降のGoogle Sheetsでは、IFやLENなど多くの関数がARRAYFORMULAなしでも自動的に複数行へ結果を展開(スピル)します。一方、SUMIFSなど配列非対応の関数には引き続きARRAYFORMULAが必要です。また、ARRAYFORMULAは出力範囲を明示的にコントロールしたい場合にも有効です。
Q. ARRAYFORMULAで計算が遅くなったときの対処法は?
A. A:Aのような列全体参照をA2:A5000のように上限付き範囲に変更するのが最も効果的です。また、1つのARRAYFORMULAが多くのダウンストリームタブから参照される構造は、再計算のたびに負荷が集中します。大規模モデルでは参照チェーンを整理することが重要です。
Q. QUERYやIMPORTRANGEをARRAYFORMULAでラップする必要はありますか? A. 不要です。これらの関数は自体が配列を返すため、ARRAYFORMULAでラップしてもオーバーヘッドが増えるだけで出力は変わりません。
ModelMonkeyは複数タブの財務モデルをスキャンし、ARRAYFORMULAによってコピー貼り付けの数式を集約できる箇所を特定します。たとえば、同じロジックが40行にわたって入力されているが参照先は1つのマスタタブ、といったケースも検出できます。手作業では1時間かかる棚卸し作業が、数式構造を読み取れるAIなら数秒で完了します。ModelMonkeyのプランを選ぶ - Google SheetsとExcel、両方に対応しています。