何が起きているか
別のスプレッドシートからデータを取得するために IMPORTRANGE 数式を追加したところ、データの代わりに以下のエラーが表示されています:
Error: Result too large
Google スプレッドシートは1つのスプレッドシートあたり1,000万セルの上限があります。IMPORTRANGE はそれよりずっと手前で独自の制限に達します — 通常は100〜200万セル前後、または返される配列が宛先シートに対して幅や高さが大きすぎる場合です。
よくあるトリガーは以下のとおりです:
- 数百列・数千行のシート全体をインポートしている(例:
Sheet1!A:ZZ) - 数式を最初に設定してから、ソーススプレッドシートのデータが大幅に増加した
- 行・列の制限なしに IMPORTRANGE を QUERY や FILTER の中にネストしている
- 1つのシート内の複数の IMPORTRANGE 呼び出しが合計で上限を超えている
デバッグ手順
ステップ1:範囲が何セルをカバーしているか確認する
ソーススプレッドシートを開き、実際にインポートしている量を確認します。A:Z のような開放的な範囲を使用している場合は、列数に行数を掛けてください。
=IMPORTRANGE("spreadsheet_url", "Sheet1!A:Z")
50,000行・26列のソースは130万セルになります。これはすでに上限に近づいています。
ステップ2:宛先シートの既存データを確認する
IMPORTRANGE が何かを追加する前に、宛先シートがすでに1,000万セルの上限に近づいている可能性があります。10,000行 × 1,000列のシートはすでに1,000万セルに達しており、余裕がありません。行数と列数を手動で、または拡張機能 → Apps Script から確認してください。
ステップ3:より小さい範囲でテストする
小さなスライスに絞り込んで、IMPORTRANGE 自体が動作するか確認します:
=IMPORTRANGE("spreadsheet_url", "Sheet1!A1:D100")
データが返ってきた場合、問題は範囲のサイズです — 権限の問題でも URL の誤りでもありません。
解決策
解決策1:範囲を明示的に制限する(最速の修正)
開放的な列参照を境界付きの範囲に置き換えます。すべてを取得するのをやめましょう:
// 修正前 — 列AからZのすべての行を取得
=IMPORTRANGE("spreadsheet_url", "Sheet1!A:Z")
// 修正後 — 行1〜5000、列A〜Fのみ取得
=IMPORTRANGE("spreadsheet_url", "Sheet1!A1:F5000")
行と列の境界を、ソースデータが実際に含むものに合わせて設定してください — 将来含むかもしれないものではなく。
解決策2:IMPORTRANGE の内側で QUERY を使ってフィルタリングする
IMPORTRANGE を QUERY で囲み、必要な列と行だけを取得します。1つの数式でフィルタリングと行制限の両方を処理できます。
// 列3が空でない行から、列1、2、5のみインポート
=QUERY(
IMPORTRANGE("spreadsheet_url", "Sheet1!A:E"),
"SELECT Col1, Col2, Col5 WHERE Col3 <> '' LIMIT 2000"
)
3つの QUERY 句が重い処理を担います:
SELECT Col1, Col2— 不要な列を除外するWHERE Col1 <> ''— 空白行をスキップするLIMIT 1000— 返される行数のハードキャップ
解決策3:インポート前に FILTER で行数を削減する
条件に一致する行だけが必要な場合、FILTER で結果を大幅に削減できます:
// 列Cが"Active"の行のみインポート
=FILTER(
IMPORTRANGE("spreadsheet_url", "Sheet1!A1:F5000"),
IMPORTRANGE("spreadsheet_url", "Sheet1!C1:C5000") = "Active"
)
**注意:**各 IMPORTRANGE 呼び出しはクォータに対して個別にカウントされます。パフォーマンスが低下した場合は、QUERY アプローチに切り替えてください — 1回の呼び出しですべてを処理できます。
解決策4:複数のシートにインポートを分割する
すべてのデータが本当に必要な場合は、列グループで分割します。宛先ファイルに2つのシートを作成します:
// シート: Import_Part1
=IMPORTRANGE("spreadsheet_url", "Sheet1!A:M")
// シート: Import_Part2
=IMPORTRANGE("spreadsheet_url", "Sheet1!N:Z")
そして、IMPORTRANGE を再度呼び出す代わりに、分析シートでそれらのシートを直接参照してください — Import_Part1!A:M。
解決策5:ソーススプレッドシートで事前にフィルタリングする
ソースファイルを所有している場合は、そこでフィルタリングを行います。専用の「Export」シートを追加し、QUERY 数式を入れます:
// ソーススプレッドシート内 — "Export"という名前のシート
=QUERY(RawData!A:Z, "SELECT A, B, C, D WHERE A <> '' LIMIT 3000")
// 宛先スプレッドシートで:
=IMPORTRANGE("source_spreadsheet_url", "Export!A:D")
ソースファイルが処理を担います。宛先は生データのダンプではなく、すでにフィルタリングされた小さな結果をインポートするだけです。
確認手順
- 修正を適用します — 範囲の制限、QUERY、または FILTER。
- 10〜20秒待ちます。IMPORTRANGE にはネットワークの遅延があります。再計算する時間を与えてください。
- セルにローディングスピナーが表示され、その後データが表示されるはずです(エラーではなく)。
- 行数を確認します:
=ROWS(IMPORTRANGE(...))— 期待値と一致しているか検証してください。 - 宛先の合計セル数を確認します:
行数 × 列数が1,000万を大きく下回っていることを確認してください。
範囲を制限してもエラーが続く場合は、新しいスプレッドシートを作成してそこで IMPORTRANGE をテストしてください。新しいファイルで動作する場合、宛先シートにクォータの問題がある可能性が高いです。
得られた教訓
- 開放的な列範囲は罠です。
Sheet1!A:Zは無害に見えますが、シートが将来持つすべての行を取得します — まだ追加していない将来の行も含めて。 - QUERY が最も長期的にクリーンな修正です。 結果がシートに届く前に行と列の両方をフィルタリングします。無駄なセルもなく、ソースが成長しても突然壊れることもありません。
- ソースシートの成長が動作中の数式を壊します。 500行で問題なく動いていた数式が50,000行で失敗します。ハードな行制限を追加しましょう —
LIMIT 5000や固定の行番号など — そうすれば成長を早期に検知できます。 - 同じ範囲の IMPORTRANGE 呼び出しを重複させないようにしましょう。 FILTER 内では各呼び出しがクォータに対して個別にカウントされます。QUERY を使って1回の呼び出しに統合してください。

