IMPORTRANGE・QUERY・ARRAYFORMULAが動かない原因と対処

スポンサーリンク

「関数の使い方は調べた通りに入力したのに、なぜかエラーが消えない」「昨日まで動いていた集計表が、今日開いたら壊れている」。スプレッドシートで部門間のデータを自動連携し始めると、IMPORTRANGE・QUERY・ARRAYFORMULAの3関数でこの手のトラブルに必ずぶつかります。

厄介なのは、エラーメッセージを見ても「なぜそうなるか」が分からないことです。原因が分からないまま数式をいじると、かえって悪化してしまいます。

この記事では、3関数の「動かない」を症状別に整理しました。「症状 → 原因 → 直し方」の順で即解決できます。まずは冒頭の早見表で自分のエラーを特定し、該当セクションへジャンプしてください。

対象バージョンについて: IMPORTRANGE・QUERY・ARRAYFORMULAはいずれもGoogleスプレッドシート専用の関数です。デスクトップのExcelやExcel Onlineには存在しません。SheetsはWebアプリのため全ユーザーが同一バージョンで、版による挙動差はありません。

このエラーは別記事へ: 「アクセスを許可」を何度押しても許可が繰り返し求められる症状は、スプレッドシートのIMPORTRANGEでアクセス許可エラーが繰り返し出る問題の解決法で扱っています。本記事は「初回の許可がまだ通っていない」「展開されない」「列が認識されない」といった別の症状群を診断します。

症状別早見表:どのエラー?どの関数?

いま出ている症状を下の表で探してください。主な原因と、ジャンプ先のセクションがひと目で分かります。

関数症状主な原因対処の方向
IMPORTRANGE#REF! と「これらのシートをリンクする必要があります」アクセス許可が未承認「アクセスを許可」をクリック
IMPORTRANGE#REF! が出るが許可ボタンが見当たらない出力先セルに既存データがある出力先を空にして再入力
IMPORTRANGE「読み込んでいます…」が消えないリクエスト数・データ量の超過数式の数とデータ量を減らす
IMPORTRANGE#ERROR! になるURL・範囲文字列の指定ミス、揮発性関数の参照引数の書式を見直す
QUERYNO_COLUMN: Col1 などのエラー列の指定方法が範囲と合っていないCol表記とA表記を使い分ける
QUERY数字の列が空(NULL)になる列に文字列と数値が混在データ型をそろえる
QUERY「パラメータが正しくありません」クエリ文字列の引用符・句順の誤り一重引用符と句順を確認
ARRAYFORMULA最初の1行しか結果が出ない出力先にデータが残っている展開先のセルを空にする
ARRAYFORMULA「配列数式を書き出すことはできません」展開ブロック(既存データ)邪魔しているセルを削除
ARRAYFORMULAIFやANDで思った結果にならない配列に非対応の関数を使用演算子に置き換える

「どの関数か」「どの症状か」が決まったら、対応するセクションへ進んでください。

IMPORTRANGEが反映されない・「展開されませんでした」が出るとき

IMPORTRANGEのトラブルは、原因が3つに大別できます。順番にチェックしていけば、たいていここで解決します。

まず構文を確認しておきましょう。基本形は次の通りです。第1引数が参照元のURL、第2引数が「シート名!範囲」の文字列です。

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/abcd1234.../edit", "売上データ!A1:D100")

第1引数はURL全体でもスプレッドシートID部分だけでも動きます。第2引数は必ず二重引用符で囲んだ文字列にしてください。ここを誤ると、後述の指定ミスにつながります。

出力先セルが空になっていない(許可済みなのに直らないとき)

許可は済んでいるはずなのに #REF! が消えない場合は、出力先のセルに別のデータが残っているケースを疑ってください。

IMPORTRANGEは取得した範囲を下方向・右方向へ自動で展開します。展開しようとする先のセルにすでに文字や数式が入っていると、ぶつかって展開できず #REF! になります。

直し方はシンプルです。数式を入れたセルの右と下を見て、邪魔しているデータをよけてください。一度数式を削除し、展開予定の範囲をすべて空にしてから入力し直すと確実です。

アクセス許可がまだ承認されていない

最も多いのがこれです。IMPORTRANGEを初めて入力すると、必ず一度 #REF! エラーが表示されます。これは異常ではなく仕様です。

エラーセルにカーソルを当てると、「これらのシートをリンクする必要があります」というメッセージと「アクセスを許可」ボタンが表示されます。このボタンをクリックすれば、データが読み込まれます。

許可するとどうなるかも知っておきましょう。一度許可すると、読み込み先シートの編集権限を持つすべてのユーザーが、そのデータを参照できるようになります。社外秘データを扱うときは、誰が編集権限を持っているかを確認してから許可してください。

URLやシート名の指定ミス

#ERROR! が出る場合は、引数の書式ミスがほとんどです。次の点を確認してください。

  • URLを引用符で囲み忘れている、または途中で改行・空白が混ざっている
  • 第2引数のシート名が実際のタブ名と違う(全角・半角や空白の差も区別されます)
  • 範囲文字列を「シート名!A1:D100」の形にせず、シート名だけ・範囲だけになっている

参照元のセルに NOW・RAND・RANDBETWEENなどの揮発性関数が含まれていると、IMPORTRANGEでは参照できず #ERROR! になります。TODAY() は参照可能です。A→BとB→Aのように複数シートを相互参照すると循環参照エラーになるため、参照は一方向にしてください。基本構文の詳細はスプレッドシートのIMPORTRANGE関数の使い方で確認できます。

「アクセスを許可」ボタンが表示されない・押しても直らないとき

許可ボタンがそもそも出ない、または押しても何度も許可を求められる場合は、原因が初回設定以外にあります。

「読み込んでいます…」が消えないなら、リクエスト数やデータ量の超過が原因です。IMPORTRANGEはリクエストごとに10MBまでという上限があります。数式の数を減らす、参照範囲を必要な列だけに絞る、参照元で先に集計してデータを圧縮する、といった対処が有効です。

許可を繰り返し求められるループ状態は、別の原因群があります。スプレッドシートのIMPORTRANGEでアクセス許可エラーが繰り返し出る問題の解決法で詳しく解説しているので、そちらを参照してください。IMPORTRANGE全般をもっと深く知りたい場合はスプレッドシートのIMPORTRANGE関数 完全ガイドもあわせてどうぞ。

QUERYの列が認識されない・結果がずれるとき

QUERYは強力な反面、列の指定方法とデータの状態にシビアです。エラーの大半は次の3つに集約されます。

QUERYの基本構文は次の通りです。第1引数がデータ範囲、第2引数がクエリ文字列、第3引数が見出し行数です。

=QUERY(A1:D100, "SELECT A, B WHERE C = '東京' ORDER BY D DESC", 1)

Col番号指定と見出し行が混在している

「NO_COLUMN: Col1」というエラーが出たら、列の指定方法が範囲と合っていません。ここがQUERYで最も誤解されやすいポイントです。

ルールは次の通りです。

  • シート内のローカルな範囲(A1:D100など)を直接指定する場合は、列をアルファベットの A・B・C で指定する
  • IMPORTRANGEで取り込んだデータを対象にする場合は、Col1・Col2・Col3 という数値序数で指定する

なぜ使い分けが必要かというと、IMPORTRANGEで取得したデータは「列のアルファベットを持たない一時的なデータ」だからです。シート上に存在しないため、A・B・Cという列名で呼び出せません。Col1・Col2…という順番でしか参照できません。逆に、ローカル範囲なのにCol1を使うと「NO_COLUMN: Col1」になります。

列のデータ型(文字列/数値)が混在してNULLになる

数字を入れたはずの列が、QUERYの結果では空(NULL)になることがあります。1つの列に文字列と数値が混在しているのが原因です。

QUERYは列ごとにデータ型を1つに判定します。混在していると、少数派のデータをNULL扱いにして切り捨てることがあります。たとえば数値の列に1つだけ「-」やコメント文字列が混ざっていると、列全体がうまく読めなくなります。

直し方は、列のデータ型をそろえることです。数値の列にテキストが混ざっていないか、逆に数字を文字列として入力していないかを確認してください。空欄に意味のない記号を入れている場合は、本当の空欄に戻すと改善します。

「パラメータが正しくありません」と出る場合は、クエリ文字列自体のミスです。文字列の条件は一重引用符 ' で囲み(二重引用符は不可)、句は SELECT → WHERE → GROUP BY → ORDER BY → LIMIT の順で書いてください。クエリ言語の詳しい構文はスプレッドシートのQUERY関数の使い方にまとめています。

IMPORTRANGEと組み合わせるときのheaders指定

QUERYでIMPORTRANGEのデータを処理するときは、第3引数の見出し行数を省略しないことが重要です。組み合わせ構文は次のようになります。

=QUERY(IMPORTRANGE("URL", "売上データ!A1:D100"), "SELECT Col1, Col2 WHERE Col3 = '東京'", 1)

ポイントは2つです。列はCol1・Col2…の数値序数で指定すること、そして末尾の見出し行数(通常は1)を明示的に書くことです。この見出し行数を省略すると、QUERYが見出しを自動判定する際にデータ行を見出しと誤認し、列認識エラーや結果ズレの原因になります。

行や列を削除した後にQUERYが崩れる症状は、原因が別にあります。その場合は行・列削除後にFILTER/QUERYが崩れる問題の直し方を参照してください。

ARRAYFORMULAが1行しか反映されないとき

ARRAYFORMULAは「数式を範囲全体に一括適用する」関数ですが、「最初の1行しか結果が出ない」という相談が非常に多い関数でもあります。原因は主に3つです。

基本構文は配列数式を ARRAYFORMULA() で包むだけです。Ctrl+Shift+Enter(Macは Cmd+Shift+Enter)で自動的に付与することもできます。

=ARRAYFORMULA(A2:A100 * B2:B100)

展開先のセルにデータが残っている(展開ブロック)

1行しか出ない、あるいは「配列数式を書き出すことはできません」というエラーが出る場合、展開しようとする範囲の下に既存データがあるのが原因です。

ARRAYFORMULAは下方向へ結果を展開しますが、通り道に1つでもデータが入ったセルがあると、ぶつかって展開を止めてしまいます。古い手入力の値や、前に入れた数式が残っていないか確認してください。

直し方は、展開予定の範囲をすべて空にすることです。数式を入れた行の下を選択して、不要なデータを削除してから入力し直してください。

IF関数の中でARRAYFORMULAを使っているとき

VLOOKUPのように単体では1つの値しか返さない関数を使うと、ARRAYFORMULAで包んでも展開されないことがあります。

ARRAYFORMULAは「配列を受け取って配列を返す」のが前提です。中身の関数が単一値しか返さない作りだと、結果も1つになります。VLOOKUPを配列展開したい場合は、検索値に範囲(A2:A100など)を渡して配列として扱わせる必要があります。参照範囲がA1:A1のように1セルだと1つしか返らないので、範囲が複数行になっているかも確認してください。

QUERYと二重に包んでいる(非対応)

意外な落とし穴が、QUERYをARRAYFORMULAで包んでしまうケースです。次のような書き方はしないでください。

(非推奨・正常動作しない)
=ARRAYFORMULA(QUERY(A1:D100, "SELECT A, B", 1))

QUERYはもともと結果を範囲全体へ自動展開する関数なので、ARRAYFORMULAで包む必要がありません。二重に包むとかえって誤動作の原因になります。QUERYはQUERYだけで使ってください。

なお、ARRAYFORMULAとQUERYの二重包みが動作しないという点は、公式ドキュメントに明記された仕様ではなく、広く知られたコミュニティ知識に基づくものです。挙動が気になる場合はご自身の環境で確認することをおすすめします。

ANDやOR関数も、ARRAYFORMULAと組み合わせると1つの値しか返せず正しく機能しません。配列処理では、AND相当に掛け算 *、OR相当に足し算 + を使うのが定石です。ARRAYFORMULAの基本動作はスプレッドシートのARRAYFORMULA関数の使い方で詳しく解説しています。

3関数を組み合わせたときの特有トラブル

3関数を単体で使えても、IMPORTRANGE・QUERY・ARRAYFORMULAを組み合わせると、それぞれの制限が連鎖して原因の切り分けが難しくなります。ここが他の解説記事ではあまり触れられない部分です。代表的な2パターンを押さえておきましょう。

IMPORTRANGE未許可のままQUERYをかけると全列がエラーになる

=QUERY(IMPORTRANGE(...), ...) と一気に書いたとき、結果がすべてエラーになることがあります。原因は、内側のIMPORTRANGEがまだアクセス許可されていないことです。

許可が通っていないIMPORTRANGEは #REF! を返すだけで、データを渡せません。その状態でQUERYをかけても、QUERY側には空のエラーが渡るため、すべての列が読めなくなります。

切り分けのコツは、先にIMPORTRANGE単体をセルに入力して許可を済ませてからQUERYで包むことです。許可が通ってデータが見えるのを確認してから組み合わせれば、QUERY側のエラーかIMPORTRANGE側のエラーかを混同せずに済みます。

ARRAYFORMULAでIMPORTRANGEを包んでも展開しない

IMPORTRANGEはそれ自体が範囲を展開する関数なので、ARRAYFORMULAで包む必要はありません。包んでも展開が増えるわけではなく、むしろ展開ブロックや混乱の元になります。IMPORTRANGEの結果に何か処理を加えたいときは、ARRAYFORMULAではなくQUERYで包むのが正しいアプローチです。

組み合わせ時のチェックリスト

組み合わせがうまくいかないときは、内側から順に確認してください。

  • IMPORTRANGE単体でデータが見えているか(許可済みか)
  • QUERYの列指定をCol1・Col2…の数値序数にしているか
  • QUERYの第3引数(見出し行数。通常1)を明示しているか
  • QUERYやIMPORTRANGEを不要にARRAYFORMULAで包んでいないか
  • 出力先の下方向・右方向に既存データが残っていないか

よくある質問(FAQ)

Q. 昨日まで動いていたのに、今日はエラーが出ます。
A. 参照元シートの構成が変わった可能性が高いです。元シートで行や列が削除された、シート名が変更された、参照範囲のデータが空になった、のいずれかを確認してください。IMPORTRANGEは元シートのシート名や範囲が変わると追従できず #REF! や #ERROR! になります。

Q. 別シートのデータを参照したいのですが、IMPORTRANGEとVLOOKUPのどちらを使うべきですか。
A. 同じスプレッドシートファイル内の別タブを参照するなら、IMPORTRANGEは不要です。VLOOKUPやそのまま範囲指定で参照できます。IMPORTRANGEは「別ファイルのスプレッドシート」を参照するための関数です。同一ファイル内で使うとアクセス許可の手間が増えるだけなので避けてください。

Q. QUERYでWHERE条件を使うと、列が消えたり結果が空になります。
A. 条件値の囲み方が原因のことが多いです。文字列の条件は一重引用符 '東京' で囲んでください。二重引用符は使えません。条件に指定した列に文字列と数値が混在していると正しく比較できないため、データ型をそろえてから試してください。

Q. ARRAYFORMULAを使ったら、シート全体の計算が遅くなりました。
A. ARRAYFORMULAは指定範囲を一括計算するため、A2:A100000のように極端に広い範囲を指定すると重くなります。実際にデータがある行数まで範囲を絞ると改善します。空行まで含めて指定しないのがコツです。

Q. スマホのスプレッドシートアプリでもIMPORTRANGEは使えますか。
A. IMPORTRANGEを含むシートをアプリで開いて閲覧することはできます。ただし、初回の「アクセスを許可」操作はパソコンのブラウザで行うのが確実です。アプリ上では許可ボタンの操作がうまくいかないことがあるため、最初の設定はPCで済ませておくことをおすすめします。

Q. IMPORTRANGEの結果がいつ更新されるか分かりません。
A. 参照元・参照先のドキュメントが開かれている間、約1時間ごとに自動更新されます。すぐに反映したいときは、数式セルを一度削除して入力し直すか、参照範囲を少し変更すると再読み込みされます。

まとめ:まず試すべき3ステップ

3関数のトラブルは、原因さえ特定できればどれもシンプルに直せます。どの関数で詰まったときも最初に試すべき3ステップをまとめます。

  1. 出力先を空にする ── IMPORTRANGEもARRAYFORMULAも、展開先にデータが残っていると展開できません。数式セルの下と右をまず空けましょう。「反映されない」「1行しか出ない」の最多原因です。
  1. アクセス許可と列指定を確認する ── IMPORTRANGEは初回に必ず「アクセスを許可」が必要です。IMPORTRANGEのデータをQUERYで扱うときは、列をCol1・Col2…の数値序数で指定し、見出し行数(通常1)を明示します。
  1. 組み合わせは内側から切り分ける ── 3関数を組み合わせてエラーが出たら、IMPORTRANGE単体 → QUERY → と内側から順に動作確認します。一気に書かず、段階的に組み立てるのが遠回りに見えて一番の近道です。

この3ステップで多くのケースは解決します。それでも直らない繰り返しの許可エラーはアクセス許可エラーが繰り返し出る問題の解決法を、各関数の使い方そのものを復習したいときはIMPORTRANGE関数の使い方QUERY関数の使い方ARRAYFORMULA関数の使い方をそれぞれ参照してください。

タイトルとURLをコピーしました