データ分析

Google Sheets ARRAYFORMULA関数完全ガイド — ヘルプに載らない実務パターン

ModelMonkey2026年6月26日読了約 2 分

Google Docs エディタ ヘルプのARRAYFORMULAページには、構文が一行で書かれています。ARRAYFORMULA(array_formula)。これ自体は正確です。しかし、実際の財務モデルを構築しようとすると、必要な知識の1割にも満たないことに気づきます。どの関数にこのラッパーが必要なのか、内部でサイレントに失敗する関数はどれか、複数タブにまたがって参照するときに計算チェーンを壊さないようにするにはどうすればいいか--そういった情報はGoogle Docs エディタ ヘルプのどこにも書かれていません。

本記事では、その空白を埋めます。

公式ドキュメントが実際に教えてくれること

Google Docs エディタ ヘルプがしっかりカバーしているのは3点です。

  1. キーボードショートカット(WindowsはCtrl+Shift+Enter、MacはCmd+Shift+Enter)を使うと、現在の数式を自動的にARRAYFORMULAでラップできる
  2. 算術演算子と組み合わせると、=ARRAYFORMULA(A2:A100 * B2:B100)のように2列を要素ごとに掛け合わせられる
  3. 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、両方に対応しています。