「あれ、普通に数式を入力しただけなのに、なぜかARRAYFORMULAに変わってる……」そんな経験をしたことはありませんか? Googleスプレッドシートで作業していると、自分では意図していないのに数式が勝手にARRAYFORMULA付きに変換されてしまうことがあります。特に初めて遭遇すると「壊れた?」「何か余計なことをした?」と不安になるものです。
実はこの現象、Googleスプレッドシートの配列処理の仕組みを理解すれば、すっきり納得できるものばかりです。この記事では、数式がARRAYに自動変換される原因を5つに分類し、それぞれの対処法から応用テクニックまで、初心者にもわかる言葉で丁寧に解説します。2026年2月時点の最新仕様にも対応しているので、安心して読み進めてください。
- 数式がARRAYFORMULAに自動変換される5つの原因とそれぞれの具体的な回避方法がわかる
- ARRAYFORMULA関数の仕組みとExcelのスピル機能との違いを正しく理解できる
- 配列数式を味方につけてスプレッドシート作業を劇的に効率化するテクニックが身につく
- そもそもARRAYFORMULAとは何なのか?配列数式の基本を押さえよう
- 数式が自動でARRAYに変わる5つの原因と対処法
- ARRAYFORMULAを正しく使いこなす実践テクニック
- ARRAYFORMULAのメリットとデメリットを正直に比較する
- 2026年最新!Googleスプレッドシートの配列処理をめぐる最新動向
- 「配列結果は自動的に展開されませんでした」エラーの完全対処マニュアル
- 情シス歴10年超の現場視点で語る!他サイトにはない配列数式トラブルの実戦対処術
- 現場で即使える!ARRAYFORMULA関連のGASプログラムコード集
- 現場で本当に困るARRAYFORMULAのリアルな問題と具体的な解決手順
- 大規模スプレッドシート運用時のARRAYFORMULAパフォーマンスチューニング
- ぶっちゃけこうした方がいい!
- スプレッドシートで数式が自動でARRAYに変わる現象に関するよくある疑問
- 今すぐパソコンやスマホの悩みを解決したい!どうしたらいい?
- まとめ
そもそもARRAYFORMULAとは何なのか?配列数式の基本を押さえよう
対処法を知る前に、まず「ARRAYFORMULA」が何者なのかを押さえておきましょう。ARRAYFORMULA関数とは、ひとことで言えば「ひとつの数式を複数のセルに一括適用する関数」です。通常、スプレッドシートの数式はセルごとに個別に入力しますよね。たとえばC2セルに「=A2*B2」と入れたら、C3には「=A3*B3」、C4には「=A4*B4」……と、ひとつずつコピーしていく必要があります。
ところがARRAYFORMULAを使えば、C2セルに=ARRAYFORMULA(A2:A*B2:B)と入力するだけで、A列とB列のすべての行に対して掛け算が一括実行されます。つまり、C3以降のセルには何も入力しなくても結果が自動で表示されるのです。この「一括処理」こそがARRAYFORMULAの本質であり、「配列数式」と呼ばれる理由でもあります。
Googleの公式ヘルプでは「配列数式から返された値を複数行または複数列に表示したり、非配列関数で配列を使用したりすることができます」と説明されています。少し堅い表現ですが、要するに「まとめて計算して、まとめて結果を返す仕組み」だと考えればOKです。
Excelのスピル機能との違いを理解しておこう
Excelに慣れている方は「スピル」という機能をご存じかもしれません。Excel 365以降では、ひとつのセルに配列を返す数式を入れると、結果が周囲のセルに自動で「こぼれ落ちる」ように展開されます。これがスピルです。
Googleスプレッドシートにもスピルに似た挙動はありますが、Excelほどシームレスではありません。GoogleスプレッドシートではARRAYFORMULA関数で明示的に囲む必要があるケースが多く、ここが混乱の原因になっています。ただし、FILTER関数やQUERY関数、UNIQUE関数のようにもともと配列を返す関数については、ARRAYFORMULAで囲まなくても自動的に複数セルに展開されます。この「囲む必要がある関数」と「囲まなくていい関数」の区別が、初心者がつまずきやすいポイントなのです。
数式が自動でARRAYに変わる5つの原因と対処法
ここからが本題です。数式が勝手にARRAYFORMULAに変換される現象には、大きく分けて5つのパターンがあります。それぞれの原因と対処法を具体的に見ていきましょう。
原因1キーボードショートカットの誤操作
もっとも多いのがこのパターンです。数式の入力中にEnterキーを押すつもりで、Ctrl+Shift+Enter(Macの場合は⌘+Shift+Enter)を押してしまうと、Googleスプレッドシートは自動的に数式の先頭に「ARRAYFORMULA(」を追加し、末尾に「)」を付けて閉じます。
たとえば「=A2*B2」と入力してCtrl+Shift+Enterを押すと、「=ARRAYFORMULA(A2*B2)」に変換されます。これはGoogleが公式に用意しているショートカット機能で、バグではありません。しかし意図せず押してしまうと「なんで勝手にARRAYがついたの?」と混乱してしまいます。
対処法はシンプルで、数式を確定するときは普通のEnterキーだけを押すことを意識してください。もし誤ってARRAYFORMULAがついてしまった場合は、セルをダブルクリックして編集モードに入り、「ARRAYFORMULA(」と末尾の「)」を手動で削除すれば元に戻ります。
原因2配列を返す関数との組み合わせ
FILTER関数、SORT関数、UNIQUE関数、QUERY関数、IMPORTRANGE関数など、もともと複数の値を返す仕様の関数は、結果が隣接セルに自動展開されます。これらの関数を使ったとき、Googleスプレッドシートが「この数式は配列を返しますね」と判断して、内部的にARRAY処理を適用することがあります。
たとえば「=FILTER(A2:A100, B2:B100=”東京”)」という数式を入れると、条件に合うデータが複数行にわたって自動的に表示されます。この展開先に既存のデータがあると「配列結果は自動的に展開されませんでした」というエラーが発生します。
対処法としては、配列を返す関数の出力先には十分な空白セルを確保しておくことが重要です。目安としては、返ってくるデータの行数より余裕を持って100行から1000行程度の空きを作っておくと安心です。
原因3Googleスプレッドシートの自動推測機能
Googleの公式ヘルプには「多くの配列数式は、ARRAYFORMULA関数を明示的に使用しなくても、隣接するセルに自動的に展開します」と明記されています。つまり、特定の条件を満たす数式については、Googleスプレッドシート自身が「これは配列処理すべきだ」と判断して、自動的にARRAY処理を適用するケースがあるのです。
この挙動は便利な反面、ユーザーが予期しないタイミングで発動すると混乱を招きます。特に複数の関数をネストしている場合や、範囲指定が広い場合に発生しやすい傾向があります。
意図しない自動展開を防ぎたい場合は、返す結果を1セルに限定するように数式を書くか、ARRAY_CONSTRAIN関数を使って出力の行数と列数を明示的に制限する方法が有効です。たとえば「=ARRAY_CONSTRAIN(FILTER(A:A, B:B=”東京”), 10, 1)」とすれば、最大10行1列に結果を制限できます。
原因4サジェストオートフィルによる自動変換
Googleスプレッドシートには「サジェストオートフィル」という機能があり、ユーザーが数式を入力するとパターンを検出して自動補完を提案してきます。たとえば1行目に数式を入れた後、2行目でも同じパターンの入力が検出されると、残りの行にまとめて適用するよう提案されることがあります。
この提案を受け入れると、内部的にARRAYFORMULAに変換されるケースがあります。サジェストが表示されたときにEscキーで拒否するか、提案をクリックせずに手動で数式を入力すれば、意図しない変換を回避できます。
原因5共同編集者による数式の書き換え
Googleスプレッドシートはリアルタイム共同編集が大きな魅力ですが、他の編集者がARRAYFORMULAを使って数式を書き換えることもあります。自分では何も変更していないのに「いつの間にかARRAYがついている」という場合は、共同編集者の操作が原因である可能性が高いです。
対処法としては、バージョン履歴(ファイル→変更履歴→変更履歴を表示)を確認して、いつ誰がどのセルを変更したかを特定しましょう。チームで運用する場合は、重要な数式が入っているセルやシートに保護をかけておくのも有効な手段です。
ARRAYFORMULAを正しく使いこなす実践テクニック
ここまでは「なぜ勝手にARRAYに変わるのか」を解説してきましたが、実はARRAYFORMULA関数は正しく使えば非常に強力な武器になります。むしろ積極的に活用すべき場面も多いのです。ここからは、ARRAYFORMULAを味方につけて作業効率を上げるテクニックを紹介します。
基本の使い方は3ステップで覚えられる
ARRAYFORMULAの導入は思ったより簡単です。まず通常どおり1行分の数式を作ります。たとえば「=C3*D3」のような単純な掛け算です。次に、その数式の先頭に「ARRAYFORMULA(」を追加して全体を括弧で囲みます。最後に、セル参照を範囲参照に変更します。「C3」を「C3:C」に、「D3」を「D3:D」に書き換えれば完成です。最終的な数式は=ARRAYFORMULA(C3:C*D3:D)となり、C列とD列のすべての行に掛け算が一括適用されます。
この「1行分の数式を作る→ARRAYFORMULAで囲む→セル参照を範囲に変える」という3ステップを覚えておけば、ほとんどの場面で応用が利きます。
IF関数との組み合わせで空白行の処理を忘れずに
ARRAYFORMULA関数を使うときに初心者が見落としがちなのが、空白行の処理です。範囲全体に数式を適用すると、データが入っていない空白行にまで計算が実行されてしまい、不要な「0」やエラーが大量に表示されることがあります。
これを防ぐには、IF関数で空白チェックを挟みましょう。たとえば「=ARRAYFORMULA(IF(A2:A=””,””,A2:A*B2:B))」とすれば、A列が空白の行では何も表示されず、データがある行だけ計算結果が出力されます。このIF関数による空白ガードはARRAYFORMULAを使う際のお約束とも言えるテクニックなので、ぜひ習慣にしてください。
ARRAYFORMULAと相性の良い関数・悪い関数
ARRAYFORMULA関数はすべての関数と組み合わせられるわけではありません。ここが初心者を悩ませるポイントのひとつです。相性の良し悪しを整理しておきましょう。
| 相性 | 関数の例 | 補足 |
|---|---|---|
| ◎とても良い | IF、IFS、VLOOKUP、IFERROR、TEXT、LEFT、RIGHT、MID | セル参照を範囲に変えるだけで動作する |
| ○工夫すれば使える | SUMIF、COUNTIF、XLOOKUP | 検索値や条件を範囲指定にする必要がある |
| △そのままでは使えない | SUM、AVERAGE、MIN、MAX | もともと範囲を引数に取るため、数式の書き換えが必要 |
| ×不要(単体で配列を返す) | FILTER、QUERY、UNIQUE、SORT、SEQUENCE | ARRAYFORMULAで囲む必要がない |
たとえばSUM関数をARRAYFORMULAの中で使いたい場合、「=ARRAYFORMULA(SUM(B3:B+C3:C+D3:D))」のように足し算の形に分解する必要があります。あるいはBYROW関数やMAP関数などのLAMBDAヘルパー関数を活用すれば、行ごとの集計処理もスマートに書けます。2026年現在、GoogleスプレッドシートではSCAN関数やREDUCE関数といった強力なLAMBDA系関数が使えるので、従来のARRAYFORMULAだけでは難しかった複雑な処理も実現可能になっています。
ARRAYFORMULAのメリットとデメリットを正直に比較する
ARRAYFORMULAは万能ではありません。メリットとデメリットの両方を正しく理解した上で使うことが大切です。
メリット効率化と保守性の向上
最大のメリットは、行が追加されても数式を再入力する必要がないことです。通常の数式では新しい行を挿入するたびに数式をコピーしなければなりませんが、ARRAYFORMULAなら自動的に新しい行にも適用されます。これは数百行、数千行のデータを扱うシートでは大きな時間節約になります。
また、数式の入力箇所が1セルだけなので、修正が必要になったときに1箇所を直すだけで全行に反映されます。これは保守性の面で非常に優れています。さらに、個別の数式を大量にコピーするよりもスプレッドシート全体の処理が軽くなる傾向があり、パフォーマンスの改善にもつながります。
デメリット柔軟性の制限とエラーリスク
一方、デメリットもあります。ARRAYFORMULAが展開する範囲内のセルには、他のデータや数式を一切入力できません。もし誰かが展開範囲のセルに値を入力すると、ARRAYFORMULAの結果がすべて消えてしまい「配列結果は○○のデータを上書きするため、展開されませんでした」というエラーが表示されます。
共同編集のスプレッドシートでは、この制約が思わぬトラブルを引き起こすことがあります。たとえば「特定の行だけ単価を変更したい」といった個別の修正ができなくなるため、運用ルールをしっかり決めておく必要があります。
ARRAYFORMULAを使うべき場面と避けるべき場面を整理すると、自動計算で固定されるべきデータ(行番号の振り分け、自動転記、条件判定など)にはARRAYFORMULAが最適です。逆に、個別に値を変更する可能性がある列(手入力で修正する単価や備考欄など)には通常の数式を使うのが安全です。
2026年最新!Googleスプレッドシートの配列処理をめぐる最新動向
2026年2月時点で、Googleスプレッドシートの配列処理に関連する注目すべき動きがいくつかあります。まず、2026年2月5日にGoogleは「AI Expanded Access」という新しいGoogle Workspaceアドオンを発表しました。これにより、Gemini AIがスプレッドシート上でより高度な分析を行えるようになります。
特に注目すべきは、GeminiがSheetsで複合リクエストを処理できるようになった点です。たとえば「ドロップダウンを追加して、日付を計算して、ヘッダーを固定して」という複数の指示を一度のプロンプトで実行できるようになりました。これは従来のARRAYFORMULAによる手動の効率化をさらに一歩進めるものです。
また、SheetsのAI関数がGoogleSearch経由でリアルタイム情報にアクセスできるようになり、市場動向やスケジュールなどの最新データを取り込んだ分析が可能になっています。Connected SheetsのBigQuery連携では行容量が200,000行に倍増し、大規模データセットの分析も強化されています。
こうした進化により、「数式を手で組む」作業自体がAIによって自動化される未来が近づいています。しかし、AIが生成した数式を正しく理解し修正するためにも、ARRAYFORMULAの仕組みを知っておくことは今後もますます重要になるでしょう。
「配列結果は自動的に展開されませんでした」エラーの完全対処マニュアル
ARRAYFORMULA関連で最も遭遇しやすいエラーが「配列結果は自動的に展開されませんでした。行(○)を挿入してください。」というメッセージです。一見すると意味がわかりづらいですが、原因は明確です。
エラーの根本原因は「スペース不足」
このエラーは、配列数式が結果を表示しようとした先のセルに何らかのデータが入っているか、あるいはスプレッドシートの行数が足りないときに発生します。Googleスプレッドシートは「ここに展開したいけど、置く場所がない」と判断するとこのエラーを表示するのです。
QUERY関数、FILTER関数、UNIQUE関数など、配列を返すすべての関数で同じエラーが発生する可能性があります。ARRAYFORMULAに限った話ではないことを覚えておきましょう。
5分で解決できる対処手順
- まずエラーが出ているセルをクリックし、エラーメッセージの内容を確認します。「○○のデータを上書きするため」と書かれている場合は、そのセルにデータが入っていることが原因です。
- 展開先の範囲を確認し、不要なデータや数式が残っていれば削除します。空白に見えるセルでもスペースが入っていることがあるので、Deleteキーで確実にクリアしましょう。
- スプレッドシートの行数が足りない場合は、画面最下部までスクロールして「一番下に1000行追加」ボタンをクリックし、十分な空白行を確保します。
- それでも解決しない場合は、配列数式の出力先を別シートに移すことを検討しましょう。専用の出力シートを作れば、他のデータとの競合を完全に回避できます。
- 表示したい件数が決まっている場合は、ARRAY_CONSTRAIN関数で出力サイズを制限する方法も有効です。
情シス歴10年超の現場視点で語る!他サイトにはない配列数式トラブルの実戦対処術
ここからは、10年以上にわたって企業の情報システム部門でGoogleWorkspaceの導入・運用・トラブルシューティングに携わってきた現場の経験をベースに、他のどのサイトにも書かれていない「実際に起きるARRAYFORMULA関連トラブル」とその解決法を語っていきます。教科書的な説明ではなく、リアルな現場で血を流しながら学んだ知見です。
Googleフォームの回答シートでARRAYFORMULAが壊れる問題の根本解決
これ、情シスに来る問い合わせの中でもトップクラスに多い案件です。Googleフォームの回答が自動でスプレッドシートに記録されるシートに、集計用のARRAYFORMULA数式を入れている人は多いでしょう。たとえば「回答日時から曜日を自動表示する」「部署名を元に集計コードを自動付与する」といった用途です。
ところが、ここに落とし穴があります。Googleフォームは新しい回答を記録するとき、シートに「行を挿入」するのです。普通のデータ入力なら既存の空白行にデータが入るだけですが、フォーム回答は行そのものを追加します。この挿入処理によって、ARRAYFORMULAの展開範囲がズレたり、数式が入っているセルが押し出されたりして、数式が壊れてしまうのです。
この問題の根本解決として、現場で最も安定して動いているのは「フォーム回答シートには一切数式を入れず、別シートからIMPORTRANGEまたはシート参照で読み取る」というアプローチです。フォーム回答シートは生データの保管庫と割り切り、集計や加工は完全に別シートで行います。別シート側にARRAYFORMULAを配置すれば、フォームの行挿入による影響を受けません。
もうひとつの方法として、後述するGASを使って「フォーム送信時に自動で数式を再セットする」という力技もあります。ただし運用の手間を考えると、シート分離のほうが圧倒的に安定します。
共有スプレッドシートで「誰かがARRAYFORMULAの展開先に値を入れて全部消えた」事件の予防策
これも年に何度か発生する定番トラブルです。ARRAYFORMULAが展開している範囲のセルに、誰かが手入力でデータを入れてしまうと、ARRAYFORMULA側がエラーになり、展開されていた全データが一瞬で消えます。入力した本人は「自分は1セルしか触ってないのに、なんで全部消えたの?」とパニックになり、情シスに緊急連絡が入るという流れです。
予防策として最も確実なのは、ARRAYFORMULAが展開するセル範囲に「シートの保護」をかけることです。保護の設定で「自分以外の編集を制限」もしくは「警告を表示する」のどちらかを選べます。完全にロックしてしまうと柔軟性がなくなるので、現場では「警告を表示する」設定にしておき、「このセルは数式の展開先です。変更すると全データが消えます」というメッセージを出すようにしているケースが多いです。
もうひとつの予防策として、ARRAYFORMULAが入っているセルに条件付き書式で背景色をつけておく方法もかなり有効です。具体的には、「このセルにARRAYFORMULAが入っている場合は薄い青色にする」というルールを設定します。ただし条件付き書式ではセル内の数式を直接判定できないため、GASを使ってARRAYFORMULAのセルに自動的にメモ(ノート)を追加する方法が現実的です。セルにカーソルを合わせたときに「この列はARRAYFORMULAで自動計算されています。手入力しないでください」というメモが表示されれば、多くの事故を未然に防げます。
ARRAYFORMULAが突然「Loading…」のまま固まる現象への対処
これは公式ドキュメントにもほとんど記載がなく、ネット上でも情報が少ないトラブルです。大量のデータを扱うARRAYFORMULAが、ある日突然「Loading…」や「読み込み中…」のまま結果を返さなくなることがあります。再読み込みしても直らず、他のセルの計算も遅くなるという症状です。
この原因の多くは、スプレッドシートの再計算キューが詰まっていることにあります。特にIMPORTRANGEやIMPORTDATAなどの外部データ取得関数とARRAYFORMULAが同じシート内に大量に存在すると、再計算の順序が循環的になり、いつまでも計算が終わらないという状態に陥ります。
対処法は意外と泥臭いです。まず、問題のARRAYFORMULA数式を一度コピーしてからセルを空にします。次に数秒待ってから、コピーしておいた数式をペーストし直します。これで再計算キューがリセットされて、正常に計算が始まることが多いです。それでも解決しない場合は、「ファイル」→「設定」→「計算」で再計算タイミングを「変更時および毎分」に一度切り替えてから元に戻すという操作も試してみてください。強制的にスプレッドシートの計算エンジンをリフレッシュする効果があります。
現場で即使える!ARRAYFORMULA関連のGASプログラムコード集
ここからは、ARRAYFORMULA関連のトラブル対策や効率化に直接役立つGoogle Apps Script(GAS)のコードを紹介します。すべて実際に現場で動かしてきたものをベースにしているので、コピー&ペーストですぐに使えます。GASの導入方法は、スプレッドシートのメニューから「拡張機能」→「Apps Script」を選ぶだけです。
GASコード1ARRAYFORMULAが壊れたら自動で復旧するスクリプト
共同編集中にARRAYFORMULAが誤って削除されたり上書きされたりした場合に、自動的に元の数式を復元するスクリプトです。これを時間ベースのトリガーで1時間ごとに実行するように設定しておけば、数式が消えても最大1時間以内に自動復旧します。
function restoreArrayFormulas() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("集計シート"); // 対象シート名を指定
// 復元したいARRAYFORMULAのリスト(セル番地と数式のペア)
var formulas = {
"D2": '=ARRAYFORMULA(IF(A2:A="","",A2:A&" "&B2:B))',
"E2": '=ARRAYFORMULA(IF(C2:C="","",C2:C*1.1))',
"F2": '=ARRAYFORMULA(IF(A2:A="","",VLOOKUP(A2:A,マスタ!A:C,3,FALSE)))'
};
for (var cell in formulas) {
var range = sheet.getRange(cell);
var currentFormula = range.getFormula();
// 数式が消えているか、別の値に書き換えられている場合に復元
if (currentFormula !== formulas) {
range.setFormula(formulas);
Logger.log(cell + " のARRAYFORMULAを復元しました");
}
}
}
このスクリプトを設置したら、Apps Scriptエディタの左メニューにある時計アイコン(トリガー)から「トリガーを追加」をクリックし、「時間主導型」→「時間タイマー」→「1時間おき」に設定すれば、定期的に数式の健全性がチェックされます。
GASコード2Googleフォーム送信時に集計列の数式を自動再適用するスクリプト
先ほど触れたGoogleフォーム回答シートの問題を、GASで解決するパターンです。フォームが送信されるたびに、指定した列に数式を自動セットします。
function onFormSubmit(e) {
var sheet = e.source.getActiveSheet();
var lastRow = sheet.getLastRow();
// G列に「氏名(姓+名)」を自動生成する数式を適用
var nameCell = sheet.getRange(lastRow, 7); // G列
nameCell.setFormula('=IF(D' + lastRow + '="","",D' + lastRow + '&" "&E' + lastRow + ')');
// H列に「税込金額」を自動計算する数式を適用
var taxCell = sheet.getRange(lastRow, 8); // H列
taxCell.setFormula('=IF(F' + lastRow + '="","",F' + lastRow + '*1.1)');
}
このスクリプトを使うには、Apps Scriptエディタでトリガーを追加する際に、イベントのソースを「スプレッドシートから」、イベントの種類を「フォーム送信時」に設定します。これでフォームが送信されるたびに、新しい行に数式が自動的にセットされます。ARRAYFORMULAを使わない方式なので、行挿入による数式破損の心配がありません。
GASコード3ARRAYFORMULA展開範囲を保護して誤入力を防止するスクリプト
ARRAYFORMULAが展開している範囲を自動検出し、その範囲に保護をかけるスクリプトです。手動で保護範囲を設定する手間を省けます。
function protectArrayFormulaRanges() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("データシート");
var dataRange = sheet.getDataRange();
var formulas = dataRange.getFormulas();
for (var i = 0; i < formulas.length; i++) {
for (var j = 0; j < formulas.length; j++) {
if (formulas.toUpperCase().indexOf("ARRAYFORMULA") !== -1) {
// ARRAYFORMULAを含むセルを発見
var formulaCell = sheet.getRange(i + 1, j + 1);
var formulaValue = formulaCell.getValue();
// 展開先の範囲を推定(同じ列で値がある最後の行まで)
var col = j + 1;
var lastRowInCol = sheet.getLastRow();
var protectRange = sheet.getRange(i + 1, col, lastRowInCol - i, 1);
// 保護を設定(警告のみ)
var protection = protectRange.protect()
.setDescription("ARRAYFORMULA展開範囲(自動保護)")
.setWarningOnly(true);
Logger.log("保護設定完了: " + protectRange.getA1Notation());
}
}
}
}
このスクリプトは必要なときに手動実行するか、週に1回程度の時間トリガーで定期実行するのがおすすめです。新しいARRAYFORMULAを追加したときに忘れずに実行すれば、展開範囲が自動的に保護されます。
GASコード4スプレッドシート内の全ARRAYFORMULAを一覧出力する監査スクリプト
大規模なスプレッドシートを管理していると、「どのシートのどのセルにARRAYFORMULAが入っているか」を把握しきれなくなることがあります。このスクリプトは、スプレッドシート内の全シートをスキャンし、ARRAYFORMULAを含むセルの一覧を新しいシートに出力します。
function auditArrayFormulas() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var results = ];
sheets.forEach(function(sheet) {
var sheetName = sheet.getName();
if (sheetName === "ARRAYFORMULA監査") return; // 出力先シートはスキップ
var dataRange = sheet.getDataRange();
var formulas = dataRange.getFormulas();
var values = dataRange.getValues();
for (var i = 0; i < formulas.length; i++) {
for (var j = 0; j < formulas.length; j++) {
if (formulas.toUpperCase().indexOf("ARRAYFORMULA") !== -1) {
// 展開行数を推定(同じ列で数式セルより下にある値の数)
var expandedRows = 0;
for (var k = i + 1; k < values.length; k++) {
if (values !== "" && formulas === "") {
expandedRows++;
} else if (values === "") {
break;
}
}
results.push[sheetName, sheet.getRange(i + 1, j + 1).getA1Notation(),
formulas, expandedRows]);
}
}
}
});
// 結果を出力
var outputSheet = ss.getSheetByName("ARRAYFORMULA監査");
if (!outputSheet) {
outputSheet = ss.insertSheet("ARRAYFORMULA監査");
}
outputSheet.clearContents();
outputSheet.getRange(1, 1, results.length, results.length).setValues(results);
SpreadsheetApp.getUi().alert(
"監査完了! " + (results.length - 1) + "個のARRAYFORMULAが見つかりました。"
);
}
このスクリプトは、スプレッドシートの引き継ぎ時や定期メンテナンス時に特に重宝します。前任者が作ったスプレッドシートを引き継いだときに「どこにどんなARRAYFORMULAが仕込まれているかわからない」という状況は情シスあるあるなので、まずこのスクリプトで全体像を把握するのがベストプラクティスです。
現場で本当に困るARRAYFORMULAのリアルな問題と具体的な解決手順
ここでは、「ネットで調べても出てこないけど現場ではしょっちゅう遭遇する」タイプの問題を取り上げます。どれも実際に体験した内容で、解決に至るまでの試行錯誤も含めてお話しします。
問題1ARRAYFORMULAの列をコピーして別のシートに貼り付けたら全部「値」になってしまう
これ、地味ですが毎月のように聞かれます。ARRAYFORMULAで自動計算されている列をコピーして別シートにペーストすると、数式ではなく計算結果の「値」として貼り付けられてしまいます。しかもARRAYFORMULAの展開先セル(数式が入っていない2行目以降)は、コピー元の時点で「値」として存在しているため、当然ながらペースト先でも値のままです。
解決策としては、コピーするのはARRAYFORMULAが入っている先頭セル(1セルだけ)にして、ペースト先で範囲を適宜調整する方法が確実です。あるいは、移行先で改めてARRAYFORMULAを書き直すほうが、参照先のズレを防ぐ意味でも安全です。横着してARRAYFORMULA展開済みの範囲を一気にコピーしようとすると、あとで「数式どこいった?」となりがちなので注意してください。
問題2OR関数やAND関数がARRAYFORMULAの中で行ごとに動かない
これは中級者がよくハマる罠です。たとえば「A列かB列のどちらかにチェックが入っていたらTRUEを返す」という処理を、ARRAYFORMULA(IF(OR(A2:A=TRUE, B2:B=TRUE), TRUE, FALSE))と書くと、全行をまとめてOR判定してしまい、行ごとの判定になりません。OR関数とAND関数は配列処理に対応していないのです。
解決策は、OR関数の代わりに「+」演算子を、AND関数の代わりに「*」演算子を使うことです。具体的にはこう書き換えます。
OR関数の代替=ARRAYFORMULA(IF((A2:A=TRUE)+(B2:B=TRUE)>0, TRUE, FALSE))
AND関数の代替=ARRAYFORMULA(IF((A2:A=TRUE)*(B2:B=TRUE)=1, TRUE, FALSE))
論理値のTRUEは数値の1、FALSEは0として扱われるので、「+」で足せばOR的な判定に、「*」で掛ければAND的な判定になります。この書き換えテクニックを知っているかどうかで、ARRAYFORMULAの活用幅がまったく変わってきます。
問題3CONCATENATE関数がARRAYFORMULAで展開されない
文字列結合にCONCATENATE関数を使っている人は多いですが、この関数はARRAYFORMULAとの相性が悪く、配列展開されません。セル参照を範囲に書き換えても、最初の1行分しか結果が返ってこないのです。
解決策は簡単で、CONCATENATE関数の代わりに「&」演算子を使います。たとえば「=ARRAYFORMULA(A2:A&" "&B2:B)」とすれば、A列とB列の値がスペース区切りで結合され、全行に展開されます。「&」演算子はARRAYFORMULAと完全に互換性があるので、文字列結合の場面では常にこちらを使う習慣をつけましょう。
問題4ARRAYFORMULAの数式を変更したいのに「配列の一部を変更することはできません」と言われる
ARRAYFORMULAが展開しているセル(数式が入っている先頭セル以外)をクリックして編集しようとすると、「配列の一部を変更することはできません」というメッセージが出て何も操作できません。これ自体は正常な動作なのですが、問題はARRAYFORMULAの先頭セルがどこにあるかわからない場合です。
特に他人が作ったスプレッドシートを引き継いだ場合、展開先のセルをクリックしても「このデータはどこの数式から来ているのか」がすぐにはわかりません。展開先のセルを選択すると、数式バーにそのセルの内容が表示されますが、そこには何も表示されないか、グレーアウトした数式が表示されます。
手っ取り早い見つけ方は、展開されている列の最上部に向かってスクロールしていき、数式バーに「=ARRAYFORMULA(」と表示されるセルを探すことです。あるいは、先ほど紹介した「ARRAYFORMULA監査スクリプト」を使えば、全シートのARRAYFORMULA配置場所を一発で把握できます。
大規模スプレッドシート運用時のARRAYFORMULAパフォーマンスチューニング
データが10,000行を超えてくると、ARRAYFORMULAのパフォーマンスが体感できるレベルで影響してきます。50,000行を超えると、場合によっては数十秒から1分以上の計算遅延が発生します。ここでは、大規模データ環境でARRAYFORMULAを快適に使うためのチューニング手法を紹介します。
オープンレンジ参照(A:A形式)の罠と回避策
ARRAYFORMULAでは「A2:A」のように終了行を省略した書き方がよく使われますが、この記述はA列の最終行(つまり100万行目付近)まで参照範囲に含めることを意味します。データが1,000行しかないのに100万行を走査する必要はありませんよね。
対策としては、INDIRECT関数とCOUNTA関数を組み合わせて動的に範囲を限定する方法が有効です。たとえば「=ARRAYFORMULA(IF(INDIRECT("A2:A"&COUNTA(A:A)+1)="","",INDIRECT("A2:A"&COUNTA(A:A)+1)*INDIRECT("B2:B"&COUNTA(B:B)+1)))」のように書けば、実データがある行数分だけを対象にできます。
ただしINDIRECTは揮発性関数のため、それ自体が再計算コストを生みます。データ件数が頻繁に変わらないシートであれば、手動で「A2:A5000」のように上限を固定してしまうほうが、トータルのパフォーマンスは良くなるケースもあります。データの増減頻度と計算コストのバランスを見て判断するのが、チューニングの基本的な考え方です。
揮発性関数とARRAYFORMULAの組み合わせは極力避ける
NOW()、TODAY()、RAND()、RANDBETWEEN()などの揮発性関数は、シートの再計算が走るたびに全セルで再評価されます。これをARRAYFORMULAと組み合わせると、1回の再計算で数万回の揮発性関数評価が発生し、スプレッドシート全体が著しく重くなります。
「日付列にTODAY()を使いたい」というニーズがある場合は、ARRAYFORMULAではなくGASの時間トリガーで1日1回だけ値として書き込むほうが、パフォーマンス的に圧倒的に有利です。先ほどのGASコードの応用で、以下のような簡単なスクリプトで実現できます。
function setTodayDate() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("日報");
var lastRow = sheet.getLastRow();
var today = new Date();
var formattedDate = Utilities.formatDate(today, "Asia/Tokyo", "yyyy/MM/dd");
// A列にデータがある行のうち、B列(日付列)が空白の行に今日の日付をセット
for (var i = 2; i <= lastRow; i++) {
var aValue = sheet.getRange(i, 1).getValue();
var bValue = sheet.getRange(i, 2).getValue();
if (aValue !== "" && bValue === "") {
sheet.getRange(i, 2).setValue(formattedDate);
}
}
}
ぶっちゃけこうした方がいい!
ここまで長々と書いてきましたが、正直に言います。10年以上情シスをやってきて、ARRAYFORMULAに関して最終的にたどり着いた結論はこうです。
「ARRAYFORMULAは便利だけど、チーム運用のスプレッドシートでは"使う場所"を徹底的に絞れ」ということ。
個人で使うぶんには最高の関数です。行を追加しても勝手に数式が適用されるし、メンテナンスも楽だし、スプレッドシートも軽くなる。でもこれが10人、20人が同時編集するシートになった途端、「誰かが展開先に値を入れて全部消えた」「フォーム回答で数式がズレた」「コピペしたら値しか貼り付かない」といった問い合わせが定期的に発生します。これらに対応する情シスのコストを考えると、単純にARRAYFORMULAを使えばいいという話ではなくなります。
ぶっちゃけ、個人的に最も効率的だと感じているのは「データ入力シート」と「計算・集計シート」を完全に分離する設計です。人間が触るシートにはARRAYFORMULAを一切入れず、別の集計用シートからシート参照やIMPORTRANGEで読み取って、そこにARRAYFORMULAやQUERY関数を配置します。集計シートには編集権限を管理者だけに限定しておけば、「展開先に値を入れちゃった」事故はゼロになります。
さらに言えば、2026年の今、GeminiがSheetsに統合されたことで「数式を手で書く」行為自体がどんどん減っていく流れにあります。ただし、AIが生成した数式の中身を理解してデバッグできる人間は今後もずっと必要です。むしろAIが複雑な数式を平気で生成するようになった分、「なんでこの数式がARRAYに変わったんだろう?」「なんでこの配列が展開されないんだろう?」という疑問に答えられる知識は、今まで以上に価値が高くなっています。
だから、この記事を読んだ方に伝えたいのは、ARRAYFORMULAの仕組みを「怖いもの」として避けるのではなく、「付き合い方」を覚えてほしいということです。使う場面と使わない場面を自分で判断できるようになれば、スプレッドシート運用の質は確実にワンランク上がります。そのためには、実際に手を動かして壊してみるのが一番の近道です。テスト用のスプレッドシートを1つ作って、ARRAYFORMULAをあれこれ試して、エラーを出して、直して、またエラーを出して。そのサイクルを3日も回せば、配列数式に対する苦手意識は消えているはずです。
スプレッドシートで数式が自動でARRAYに変わる現象に関するよくある疑問
ARRAYFORMULA関数はExcelでも使えますか?
いいえ、ARRAYFORMULA関数はGoogleスプレッドシート専用の関数です。Excelには存在しません。ただし、Excel 365以降には「スピル」という類似機能があり、配列を返す数式の結果が自動的に周囲のセルに展開されます。ExcelとGoogleスプレッドシートの間でファイルをやりとりする場合、ARRAYFORMULAを含む数式は正しく変換されないことがあるため注意が必要です。特にCSV形式で書き出すと数式自体が保存されず値のみになるので、ARRAYFORMULA関数はインポート後に再設定する必要があります。
Ctrl+Shift+Enterを押してしまったときの戻し方は?
誤ってCtrl+Shift+Enterを押してARRAYFORMULAが付いてしまった場合、Ctrl+Z(元に戻す)を押せば直前の状態に戻せます。もしすでに他の操作をしていてCtrl+Zで戻れない場合は、セルをダブルクリックして編集モードに入り、数式の先頭にある「ARRAYFORMULA(」と末尾の「)」を手動で削除してください。その後、通常のEnterキーで確定すれば元の数式に戻ります。
ARRAYFORMULAを使うとスプレッドシートは重くなりますか?
一般的には逆です。1000行分の個別数式をARRAYFORMULA1つに置き換えると、処理が軽くなる傾向があります。これはGoogleスプレッドシートが配列全体をひとつの演算として処理できるためです。ただし、列全体(A:Aなど)を参照するARRAYFORMULAを多数のシートに配置すると、逆にパフォーマンスが低下することもあります。必要な範囲だけを指定するのがベストプラクティスです。
ARRAYFORMULA関数の中でSUM関数が使えないのはなぜですか?
SUM関数はもともと範囲を引数として受け取る関数なので、ARRAYFORMULAの中でセル参照を範囲に書き換えると、どこからどこまでが集計範囲なのかが曖昧になってしまいます。解決策としては、SUM(B3:D3)を「B3+C3+D3」のように個別の足し算に分解してからARRAYFORMULAで囲む方法があります。2026年現在では、BYROW関数やMAP関数を使えば「=BYROW(B3:D100, LAMBDA(row, SUM(row)))」のように、各行ごとのSUMをスマートに記述することも可能です。
今すぐパソコンやスマホの悩みを解決したい!どうしたらいい?
いま、あなたを悩ませているITの問題を解決します!
「エラーメッセージ、フリーズ、接続不良...もうイライラしない!」
あなたはこんな経験はありませんか?
✅ ExcelやWordの使い方がわからない💦
✅ 仕事の締め切り直前にパソコンがフリーズ💦
✅ 家族との大切な写真が突然見られなくなった💦
✅ オンライン会議に参加できずに焦った💦
✅ スマホの重くて重要な連絡ができなかった💦
平均的な人は、こうしたパソコンやスマホ関連の問題で年間73時間(約9日分の働く時間!)を無駄にしています。あなたの大切な時間が今この悩んでいる瞬間も失われています。
LINEでメッセージを送れば即時解決!
すでに多くの方が私の公式LINEからお悩みを解決しています。
最新のAIを使った自動応答機能を活用していますので、24時間いつでも即返信いたします。
誰でも無料で使えますので、安心して使えます。
問題は先のばしにするほど深刻化します。
小さなエラーがデータ消失や重大なシステム障害につながることも。解決できずに大切な機会を逃すリスクは、あなたが思う以上に高いのです。
あなたが今困っていて、すぐにでも解決したいのであれば下のボタンをクリックして、LINEからあなたのお困りごとを送って下さい。
ぜひ、あなたの悩みを私に解決させてください。
まとめ
スプレッドシートで数式が自動的にARRAYFORMULAに変わる現象は、Ctrl+Shift+Enterの誤操作、配列を返す関数の特性、Googleスプレッドシートの自動推測機能、サジェストオートフィル、共同編集者の操作という5つの原因に整理できます。
大切なのは、この変換を「困ったバグ」としてではなく、スプレッドシートの配列処理の仕組みを学ぶきっかけとして捉えることです。ARRAYFORMULAの仕組みを理解すれば、数式のコピー忘れや行追加時のメンテナンスから解放され、作業効率が劇的に向上します。
まずは簡単な掛け算や条件分岐から試してみてください。IF関数との組み合わせで空白行をガードする書き方さえ覚えれば、実務で十分に活用できるレベルに到達できます。2026年のGemini AI統合により、スプレッドシートの自動化はさらに進化していますが、その土台となるARRAYFORMULAの知識は決して色あせることはありません。






コメント