TL;DR
永遠に続くLoading...スピナーは、通常IMPORTRANGE、QUERY、またはARRAYFORMULAなどの数式が別のシートからデータを取得または更新できないことを意味します。最速の3つの解決策:セルをクリックしてアクセスを許可をクリックしてIMPORTRANGEを再認証する、再計算をファイル → 設定 → 変更時および毎分に切り替える、またはCtrl+Shift+R / Cmd+Shift+Rでタブを強制リフレッシュする。
実際に何が起きているか
Google スプレッドシートにはスプレッドシート間のネイティブなプッシュ同期機能がありません。すべてはプルベース — 数式がオンデマンドでデータを取得しに行きます。そのため、画面上でLoading...が固まっているとき、数式はデータ取得の途中で止まっています。主に6つの原因が考えられます:
- IMPORTRANGE が未認証 — ソーススプレッドシートがまだアクセスを許可していません。数式はただ待ち続けます。永遠に。
- 再計算が「変更時のみ」に設定されている — シートを編集しない限り、Sheets は外部データを再取得しません。
- 循環参照 — シートAがシートBを参照し、シートBがシートAを参照している。評価がループして固まります。
- クォータ超過 — Google は IMPORTRANGE をスプレッドシートあたり50件のクロススプレッドシート参照に制限しています。この上限に達すると、余分なセルが固まったままになります。
- ブラウザキャッシュの古さ — Sheets の Web アプリがキャッシュされた壊れた状態を読み込みます。思っている以上によく起こります。
- ソースシートの削除またはアクセス失効 — IMPORTRANGE が接続を失ってもエラーは表示されません。ただ
Loading...になるだけです。
修正1:IMPORTRANGE アクセスの再認証
まずここから試しましょう — 約70%の問題はこれで解決します。Loading...または#REF!が表示されているセルをクリックします。アクセスを許可を求めるポップアップが表示されるはずです。ポップアップが表示されない場合は次の手順を実行します:
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/SOURCE_SHEET_ID/edit", "Sheet1!A1:D100")
- セルから数式を削除します。
- 数式を貼り直してEnterを押します。
- セルを再度クリックすると、今度はアクセスを許可が表示されるはずです。
- クリックします。数秒でデータが読み込まれます。
認証はソースと宛先のペアごとに一度だけ必要なハンドシェイクです。アクセスが失効しない限り、再実行する必要はありません。
修正2:再計算設定の変更
デフォルトでは、Sheets は編集を加えたときのみ再計算します。つまり、誰もシートを触らなければ、IMPORTRANGE の数式は何時間も古いデータのままになります。自動的に更新されるように切り替えましょう:
- 宛先スプレッドシートを開きます。
- ファイル → 設定に移動します。
- 計算タブで、再計算を変更時から変更時および毎分に変更します。
- 設定を保存をクリックします。
毎分がSheetsがネイティブでサポートする最速の間隔です。もっと速い更新が必要な場合は修正5に進んでください。
修正3:ブラウザタブの強制リフレッシュ
キャッシュが古くなると、実際には正常な数式でも壊れているように見えることがあります。通常のリフレッシュ(F5)では不十分です — キャッシュを完全にバイパスする必要があります:
- Windows/Linux: Ctrl+Shift+R
- macOS: Cmd+Shift+R
その後シートが正常に読み込まれた場合、キャッシュが原因でした。ついでに、ブラウザ拡張機能も無効にしましょう — 広告ブロッカーやプライバシーツールは、Google Workspace のリクエストを頻繁にインターセプトして静かに壊してしまいます。
修正4:循環参照の確認
循環参照はやっかいです。Excelとは異なり、Sheetsは目に見えるエラーを常に表示するわけではありません — ただLoading...のまま固まります。追跡する方法は次のとおりです:
- ツール → エラーを確認(お使いのバージョンで利用可能な場合)に移動するか、数式のチェーンを手動でトレースします。
- シートAの数式がシートBを参照し、シートBがシートAを参照していないか確認します。
静的な値を持つヘルパー列を導入してループを断ち切りましょう。またはデータフローを再構成して、一方向のみに流れるようにします — ソースが宛先にデータを送るだけで、逆方向には流れないようにします。
修正5:リアルタイム同期のために IMPORTRANGE を Apps Script に置き換える
IMPORTRANGE の更新は最大で毎分1回です。より速いリフレッシュが必要なダッシュボードやデータパイプラインには、時間駆動トリガーを使った Apps Script の方がはるかに適しています:
// 宛先スプレッドシートで → 拡張機能 → Apps Script
function syncFromSource() {
const sourceId = 'YOUR_SOURCE_SPREADSHEET_ID';
const sourceSheet = SpreadsheetApp.openById(sourceId).getSheetByName('Sheet1');
const destSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Destination');
const data = sourceSheet.getRange('A1:D100').getValues();
destSheet.getRange('A1:D100').setValues(data);
}
スケジュールで実行するトリガーを設定します:
- Apps Script エディタで、トリガー(左サイドバーの時計アイコン)をクリックします。
- トリガーを追加 →
syncFromSource→ 時間主導型 → 分タイマー → 毎分。 - 保存します。スクリプトは独立して実行されます — ブラウザのタブを開いたままにする必要はありません。
このアプローチは、IMPORTRANGE の50セルのクォータを回避し、ネイティブ数式よりもはるかに確実に大規模なデータセット(5,000行以上)を処理できます。
修正6:IMPORTRANGE の制限内に収める
Google は IMPORTRANGE をスプレッドシートあたり50件のクロススプレッドシート参照に制限しています。超過すると、溢れたセルは説明なしにLoading...のまま固まります。次のスクリプトで使用数を確認しましょう:
function countImportRange() {
const sheet = SpreadsheetApp.getActiveSpreadsheet();
const allSheets = sheet.getSheets();
let count = 0;
allSheets.forEach(s => {
const formulas = s.getDataRange().getFormulas().flat();
count += formulas.filter(f => f.toUpperCase().includes('IMPORTRANGE')).length;
});
Logger.log('Total IMPORTRANGE cells: ' + count);
}
50を超えている場合は統合しましょう。ソースシート全体の列AからZなど、広い範囲を単一の IMPORTRANGE で取得し、QUERY や INDEX/MATCH を使って各セクションに必要なデータだけを抽出します。1回のインポートで複数の利用者に対応できます。
修正の確認
Loading...が表示されていたセルに実際のデータが表示されるようになった。- ソースシートの値を編集し、最大60秒待つと — 宛先が自動的に更新される。
- 対象範囲に
#REF!、#ERROR!、Loading...のセルが残っていない。 - Apps Script を使用している場合は、拡張機能 → Apps Script → 実行数を確認して、同期関数がスケジュールどおりに失敗なく実行されていることを確認する。
クイックリファレンス
- IMPORTRANGE が固まる → セルをクリック → アクセスを許可
- データが自動更新されない → ファイル → 設定 → 再計算:毎分
- ブラウザの不具合 → Ctrl+Shift+R / Cmd+Shift+R(強制リフレッシュ)
- 循環参照 → 数式のループをトレースして断ち切る
- IMPORTRANGE セルが50を超えている → より少ない範囲の QUERY で統合する
- 1分より速い同期が必要 → 時間駆動トリガーを使った Apps Script

