「アクセスを許可」を何度クリックしても、またすぐに#REF!エラーが出る。「権限を追加しています…」のまま画面がフリーズして、いつまで経ってもデータが表示されない。IMPORTRANGEを設定するたびに、この認証地獄にハマって時間だけが溶けていく――。
もしあなたが今まさにこの状況なら、安心してください。あなただけではありません。GoogleスプレッドシートのIMPORTRANGE関数は、別ファイルからデータを引っ張ってこられる非常に強力な関数ですが、その認証まわりのトラブルは2026年になった今も世界中のユーザーを悩ませ続けています。しかも厄介なことに、この問題は「ただボタンを押せば直る」というシンプルな話ではなく、複数の原因が絡み合って発生するケースがほとんどなのです。
この記事では、IMPORTRANGE認証ループの根本的なメカニズムから、2026年時点で確認されている最新の原因パターン、そしてGoogle Apps Script(GAS)を使った上級者向けの自動化テクニックまでを網羅的に解説します。初心者の方には「まずここを確認して」というチェックリストを、上級者の方にはAPIレベルでの解決策をお届けします。
- IMPORTRANGEの認証ループが発生する7つの原因と、それぞれに対応した具体的な解決手順の解説
- 「アクセスを許可」ボタンが表示されない・押しても反応しないときの緊急対処法
- Google Apps Scriptで認証許可を自動化し、二度とループに悩まされなくなる上級テクニック
- そもそもIMPORTRANGEの認証とは何か?仕組みを理解すればトラブルの半分は防げる
- IMPORTRANGE認証ループが発生する7つの原因と対処法
- 認証ループを根本解決するための上級テクニック
- 認証ループを未然に防ぐ設計のベストプラクティス
- 情シス歴10年超の現場視点で語るIMPORTRANGEトラブルの「本当の沼」
- 現場で即使えるGASスクリプト集IMPORTRANGEの運用を劇的に楽にする
- 「Loading…」が永遠に終わらないときの緊急リカバリー手順
- IMPORTRANGE運用で「地味に困る」現実的な問題とその解決策
- Sheets APIの公式プロパティと非公式エンドポイントの違いを正しく理解する
- ぶっちゃけこうした方がいい!
- IMPORTRANGEの認証ループに関するよくある疑問を解決
- 今すぐパソコンやスマホの悩みを解決したい!どうしたらいい?
- まとめ
そもそもIMPORTRANGEの認証とは何か?仕組みを理解すればトラブルの半分は防げる
解決策に飛びつく前に、まずIMPORTRANGEがどんな仕組みで動いているかを理解しましょう。ここを知っているかどうかで、トラブル対応のスピードがまるで違ってきます。
IMPORTRANGE関数の基本構文と動作原理
IMPORTRANGE関数は、別のGoogleスプレッドシートファイルからセル範囲のデータを読み込むための関数です。構文はとてもシンプルで、以下のように記述します。
=IMPORTRANGE("スプレッドシートのURL", "シート名!セル範囲")
たとえば、売上管理シートからA1からD50までのデータを引っ張りたい場合は、こう書きます。
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/abcd1234XYZ/edit", "売上データ!A1:D50")
ここで重要なのは、IMPORTRANGEは外部データ関数に分類されるという点です。IMPORTXMLやGOOGLEFINANCEと同じカテゴリであり、インターネット接続が必須で、1回のリクエストで受信できるデータは最大10MBに制限されています。つまり、ローカルのセル参照とはまったく別物の、いわば「スプレッドシート間のAPI通信」のような処理が裏側で走っているわけです。
認証が必要になるタイミングと「アクセスを許可」の意味
初めて別のスプレッドシートからデータを取得するとき、セルには#REF!エラーが表示され、「これらのシートをリンクする必要があります」というメッセージとともに「アクセスを許可」ボタンが現れます。これは、取得先スプレッドシートに対して「このスプレッドシートからのデータ読み取りを許可しますか?」と確認しているのです。
一度「アクセスを許可」をクリックすれば、その許可は永続的に維持されます。許可を取り消すには、アクセスを許可したユーザーをソース元のスプレッドシートから削除するしかありません。また、このアクセス許可はソース元スプレッドシートの600ユーザー共有制限にカウントされる点も見落としがちなポイントです。
正常なフローでは、この認証は1回きりの手続きで完了します。ところが、ここが何度も繰り返される「ループ」になってしまうのが、今回のテーマというわけです。
IMPORTRANGE認証ループが発生する7つの原因と対処法
認証ループにはさまざまなパターンがありますが、2026年時点で報告されている主な原因を7つに整理しました。上から順に確認していくことで、あなたの問題がどこに該当するか効率的に特定できるはずです。
原因1Googleアカウントの権限不足またはログイン状態の問題
最も基本的でありながら、最も見落とされやすい原因がこれです。IMPORTRANGEを使うには、ソース元のスプレッドシートに対して最低でも「閲覧者」権限を持っている必要があります。自分が所有するファイルなら自動的に権限がありますが、他人のファイルを参照する場合は事前にアクセス権をもらう必要があります。
また、複数のGoogleアカウントでブラウザにログインしている場合、意図しないアカウントでスプレッドシートを開いていることがあります。ブラウザのアドレスバーに表示されるURLの「/u/0/」や「/u/1/」の部分は、どのアカウントで開いているかを示しています。ソース元と取得先の両方を、同じGoogleアカウントで開いているか確認してください。
対処法としては、一度すべてのGoogleアカウントからログアウトし、使いたいアカウント1つだけでログインし直してから再度試してみてください。シークレットモード(プライベートブラウジング)で試すのも効果的です。
原因2スプレッドシートのURLまたはIDの記述ミス
IMPORTRANGEの第1引数に指定するURLやスプレッドシートIDに誤りがあると、認証プロンプト自体が正しく表示されず、ループのような挙動になることがあります。よくあるミスとしては、URLの短縮やリダイレクト、URLの一部が欠けている、といったケースが挙げられます。
URLの代わりにスプレッドシートキー(URLの「/d/」と「/edit」の間にある長い英数字の文字列)を使う方法もあります。関数が短くなるため、記述ミスも減らせます。たとえば以下のように書けます。
=IMPORTRANGE("1MrlXHTfTO8a5F-o3TxPQprsZ-Zz_m_237DW05_2JuGw", "注文データ!B1:F10")
必ずブラウザのアドレスバーからURLを直接コピーし、手打ちは避けましょう。また、引用符は半角のストレートクォーテーション(”)を使ってください。ワープロソフトからコピーした場合、カーリークォーテーション(” “)に自動変換されてエラーの原因になります。
原因3シート名やセル範囲の不一致
第2引数の「シート名!範囲」部分にタイポがあると、認証に成功しているのにデータが表示されず、まるでループしているように見えることがあります。シート名は大文字小文字、スペース、記号まで完全に一致させる必要があります。
たとえばソース元のタブ名が「売上データ 2026」(半角スペース入り)なのに、関数側で「売上データ2026」(スペースなし)と書いてしまうとエラーになります。ソース元のスプレッドシートを実際に開いて、タブ名を目視で確認してからコピーペーストするのが最も確実です。
また、存在しない範囲(実際のデータが100行なのにA1:Z10000を指定するなど)を指定すると、データ読み込みに失敗して「Error Loading Data」になることもあります。まずは小さな範囲(A1:B3など)でテストし、成功してから範囲を広げるのが鉄則です。
原因4IMPORTRANGEの循環参照(サイクル)が発生している
これが「認証ループ」という検索キーワードでたどり着く方の、まさに本丸ともいえる原因です。スプレッドシートAがBを参照し、BもAを参照している状態を作ってしまうと、互いが互いのデータを読み込もうとして永遠に解決しないループが発生します。
Googleの公式ヘルプでも、この循環参照は明確に「避けるべきパターン」として記載されています。データが出力されないだけでなく、スプレッドシート全体の動作が極端に遅くなることもあります。
対処法は明確で、IMPORTRANGEのデータフローを一方通行にすることです。AからBへデータを流すなら、BからAへのIMPORTRANGEは絶対に設定しない。どうしても双方向のデータ共有が必要な場合は、中間にCという集約用スプレッドシートを置き、AもBもCにデータを送り、CからはIMPORTRANGEを使わない設計にしましょう。
原因5IMPORTRANGEのチェーン(連鎖)による遅延とタイムアウト
循環ではないものの、AがBを参照し、BがCを参照し、CがDを参照するという多段階のチェーンも問題を引き起こします。ソース元のデータが更新されたとき、すべてのチェーンを通じて更新が伝播するため、末端のスプレッドシートでは非常に長い遅延が発生します。
IMPORTRANGEは、ドキュメントが最初に開かれたときか、過去5分以内に開かれたときにリロードされます。チェーンが深い場合、すべてのドキュメントを「起こす」必要があるため、途中でタイムアウトしてエラー状態のままになることがあります。これが認証ループのように見えるケースもあるのです。
対策としては、チェーンの段数をできるだけ減らすことです。可能であれば、集計処理をソース元で行い、IMPORTRANGEでは集計済みの結果だけを転送する設計にしましょう。100万行の生データを転送するより、ソース側でSUM関数などで集計して1つの数値だけを転送するほうが、圧倒的に高速で安定します。
原因6「アクセスを許可」ボタンが表示されない
これは世界中のGoogleコミュニティフォーラムで繰り返し報告されている、非常にフラストレーションの溜まる症状です。#REF!エラーは出ているのに、セルにカーソルを合わせても「アクセスを許可」ボタンがどこにも見当たらない、というパターンです。
この症状が起きやすいのは、IMPORTRANGEを他の関数(QUERYやFILTER、VLOOKUPなど)の中にネストして使っている場合です。外側の関数がIMPORTRANGEの認証プロンプトを隠してしまうのです。
解決策は非常にシンプルで、まずIMPORTRANGE単体を空いているセルに貼り付けて認証を通します。認証が完了してデータが表示されたら、そのテスト用のセルを削除し、本来のネストされた数式に戻せばOKです。一度認証が通れば、同じソース元への接続は記憶されるので、ネストした状態でも問題なく動作します。
原因7Excelファイル形式(.xlsx)のまま使用している
意外と知られていませんが、GoogleドライブにアップロードしたExcelファイル(.xlsx形式)を、Googleスプレッドシート形式に変換せずにそのまま使っていると、IMPORTRANGEが正しく機能しないことがあります。ソース元か取得先のいずれかが.xlsx形式の場合、認証プロセスが途中で止まる「権限追加中」のフリーズが発生するケースが報告されています。
対処法は、両方のファイルをGoogleスプレッドシート形式(.gsheet)に変換することです。Googleドライブでファイルを右クリックし、「Googleスプレッドシートとして保存」を選択すれば変換できます。変換後はURLが変わるため、IMPORTRANGE関数のURL部分も新しいものに更新してください。
認証ループを根本解決するための上級テクニック
ここからは、基本的な対処法では解決できなかった方や、大量のIMPORTRANGEを管理している方のための上級テクニックを紹介します。
Google Apps Script(GAS)で「アクセスを許可」を自動化する
スプレッドシートをテンプレートとしてコピーして配布する業務フローでは、コピーするたびに全IMPORTRANGEの認証を手動で通す必要があり、大変な手間になります。この問題を解決するのが、GASによる認証の自動化です。
2024年にGoogleは、Sheets APIに
importFunctionsExternalUrlAccessAllowed
というプロパティを追加しました。これにより、IMPORTHTML、IMPORTDATA、IMPORTFEED、IMPORTXMLなどの外部データ関数については、プログラムからアクセス許可を設定できるようになりました。
IMPORTRANGEについては、公式APIプロパティはまだ提供されていませんが、非公式のエンドポイントを使って同等のことが実現できます。以下のGASコードは、指定したスプレッドシートのIMPORTRANGE認証を自動で通すものです。
function allowImportrangeAccess() {
var destinationId = "取得先スプレッドシートのID";
var sourceId = "ソース元スプレッドシートのID";
var url = "https://docs.google.com/spreadsheets/d/" + destinationId + "/externaldata/addimportrangepermissions?donorDocId=" + sourceId;
var params = {
method: "post",
headers: { authorization: "Bearer " + ScriptApp.getOAuthToken() },
muteHttpExceptions: true
};
var response = UrlFetchApp.fetch(url, params);
Logger.log(response.getContentText());
}
このスクリプトをGASエディタに貼り付け、スプレッドシートIDを自分のものに置き換えて実行するだけです。手動で「アクセスを許可」をクリックするのと同じ処理がプログラム的に行われます。なお、一度許可した接続を取り消すことはできない仕様なので、その点は注意してください。
IMPORTRANGEの代替手段を検討する
認証ループに何度も悩まされるなら、そもそもIMPORTRANGEを使わないという選択肢も真剣に検討する価値があります。IMPORTRANGEは便利ですが、実はデータを「インポート」しているのではなく「参照」しているだけなので、数式が壊れたらデータにアクセスできなくなるという本質的な脆弱性があります。
代替手段としては、GASのSpreadsheetAppを使ったデータ転送が最も柔軟です。ソース元からデータを読み取り、取得先に書き込むスクリプトを作成し、トリガーで定期実行すれば、認証の問題とは無縁でデータ連携ができます。さらに、データのフィルタリングや加工もスクリプト内で自由に行えるため、QUERYやFILTERとIMPORTRANGEを組み合わせる複雑な数式からも解放されます。
また、Googleが提供するConnected Sheetsも有力な代替手段です。スケジュール更新に対応しており、大規模データセットの読み込みにも適しています。BigQueryとの連携も可能なので、数十万行を超えるデータを扱う場合はIMPORTRANGEよりもはるかに適しています。
認証ループを未然に防ぐ設計のベストプラクティス
問題が起きてから対処するよりも、起きない設計にするほうがずっと効率的です。ここでは、IMPORTRANGE認証ループを未然に防ぐための設計指針を紹介します。
データフローを一方通行にし可視化する
複数のスプレッドシート間でIMPORTRANGEを使う場合は、まずデータの流れを図に描いてみましょう。矢印が循環していないか、チェーンが深すぎないかを確認します。理想的なのは、1つの「マスターデータ」シートから各部門や用途別のシートへ一方通行でデータが流れるハブ&スポーク型の構成です。
IMPORTRANGEの使用数を最小限に抑える
IMPORTRANGEを使えば使うほど、スプレッドシートの読み込み時間は長くなり、認証トラブルのリスクも高まります。複数のIMPORTRANGEを使っている場合は、ソース元で集計処理を行い、転送するデータ量を最小化するのが鉄則です。たとえば、100万行の生データをIMPORTRANGEで転送するのではなく、ソース元でSUMやQUERYで集計した結果の数行だけを転送すれば、速度も安定性も劇的に向上します。
揮発性関数との組み合わせを避ける
IMPORTRANGEは、NOW()、RAND()、RANDBETWEEN()などの揮発性関数を直接的にも間接的にも参照できません。これらの関数は頻繁に再計算されるため、IMPORTRANGEと組み合わせると過剰なリクエストが発生し、スロットリング(速度制限)の原因になります。唯一の例外はTODAY()関数で、1日に1回しか更新されないため許容されています。
名前付き範囲を活用して変更に強い設計にする
IMPORTRANGEの第2引数にセル範囲を直接指定する代わりに、ソース元で名前付き範囲を設定しておくと、データの位置や範囲が変わっても数式を書き換える必要がなくなります。たとえば、ソース元でA2:D100に「SalesData2026」という名前を付ければ、取得先では以下のように書けます。
=IMPORTRANGE("スプレッドシートURL", "SalesData2026")
これにより、ソース元でデータの行数が増減しても、名前付き範囲を更新するだけで済み、取得先の数式は一切変更不要です。
情シス歴10年超の現場視点で語るIMPORTRANGEトラブルの「本当の沼」
ここからは、ネットの一般的な解説記事にはまず載っていない、社内の情報システム部門で10年以上スプレッドシートの運用トラブルと向き合ってきた現場目線の話をします。正直なところ、IMPORTRANGEのトラブルで一番厄介なのは「技術的な原因」ではなく「人的な原因」と「組織的な原因」なんです。
退職者のアカウントが削除されてIMPORTRANGEが全滅する問題
これは現場で本当に頻繁に起きるのに、どの記事でもほとんど触れられていない問題です。IMPORTRANGEの「アクセスを許可」は、その操作を行ったユーザー個人のアカウントに紐づいています。つまり、田中さんが認証ボタンを押してIMPORTRANGEを繋いだ場合、田中さんがソース元スプレッドシートの共有メンバーから外れた瞬間に、その接続は切れます。
何が起きるかというと、田中さんが退職してGoogleアカウントが削除されると、田中さんが認証を通したすべてのIMPORTRANGEが一斉にエラーになります。しかも、この状況では#REF!エラーが出るだけで「なぜ壊れたか」の手がかりがまったく表示されません。月曜の朝に出社したら営業部の集計シートが全部死んでいて、原因を調べたら先週金曜に退職した人のアカウント削除が原因だった、というのは情シスあるあるです。
対策として、社内では「IMPORTRANGEの認証は必ず共有サービスアカウントまたは部署の共有アカウントで行う」というルールを徹底すべきです。個人アカウントで認証を通してしまうと、異動や退職のたびにこの爆弾が爆発します。もし既に個人アカウントで認証してしまっている場合は、一度IMPORTRANGEの数式をコピーしておき、セルをクリアして、共有アカウントでログインした状態で数式を再入力して認証し直してください。
共有ドライブ(Shared Drive)とマイドライブ間のIMPORTRANGEで起きる罠
Google Workspace(旧G Suite)を使っている組織では、共有ドライブ(旧チームドライブ)を利用していることが多いと思います。ここで起きる罠が「共有ドライブのファイルからマイドライブのファイルへのIMPORTRANGE、またはその逆」です。
共有ドライブのファイルは、所有者が「組織」になっています。一方、マイドライブのファイルは個人が所有者です。この所有者の違いが、IMPORTRANGEの認証で思わぬ挙動を引き起こすことがあります。具体的には、共有ドライブの管理者権限設定によっては、外部へのデータ参照が制限されていて、IMPORTRANGEの認証が永遠に通らないケースがあるのです。
管理コンソールの「アプリ」→「Google Workspace」→「ドライブとドキュメント」→「共有設定」から、共有ドライブのメンバー以外へのファイル共有が許可されているかを確認してください。ここが「オフ」になっていると、IMPORTRANGEでどれだけ認証ボタンを押しても接続が成立しません。この設定はWorkspace管理者しか変更できないため、一般ユーザーが自力で解決するのは不可能です。「なぜかIMPORTRANGEが繋がらない」と延々悩む前に、まず情シスに確認しましょう。
Google Workspaceの組織外共有ポリシーとDLPの落とし穴
もう一つ、組織レベルで厄介なのがデータ損失防止(DLP)ポリシーです。Workspace管理者がDLPルールを設定している場合、特定のキーワードやデータパターン(クレジットカード番号、マイナンバーなど)を含むスプレッドシートからのIMPORTRANGEがブロックされることがあります。
この場合、エラーメッセージは非常にわかりにくく、単に「権限がありません」としか表示されません。ユーザーは自分のアクセス権の問題だと思い込んで延々と権限設定を弄り回すのですが、実際にはDLPが裏で通信を遮断しているわけです。管理コンソールの「セキュリティ」→「データの保護」→「ルール」から、IMPORTRANGEに影響するDLPルールが設定されていないか確認してもらう必要があります。
現場で即使えるGASスクリプト集IMPORTRANGEの運用を劇的に楽にする
ここでは、IMPORTRANGEの運用で本当に役立つGASスクリプトを複数紹介します。すべて実務で使えるように設計しており、コピーペーストで動くレベルまで仕上げています。
スクリプト1スプレッドシート内の全IMPORTRANGEの接続状態を一覧診断する
大量のIMPORTRANGEを使っているスプレッドシートで「どのIMPORTRANGEがエラーになっているか」をいちいちセルを見て回るのは非現実的です。以下のスクリプトは、スプレッドシート内のすべてのIMPORTRANGE数式を検出し、そのセルの値がエラーかどうかを一覧で出力します。
function diagnoseAllImportrange() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var report = ;
report.push);
sheets.forEach(function(sheet) {
var finder = sheet.createTextFinder("IMPORTRANGE")
.matchFormulaText(true)
.matchCase(false);
var cells = finder.findAll();
cells.forEach(function(cell) {
var formula = cell.getFormula();
var value = cell.getDisplayValue();
var status = "正常";
if (value === "#REF!" || value === "#ERROR!" || value === "Loading..." || value === "") {
status = "異常";
}
report.push);
});
});
// 診断結果を新しいシートに出力
var reportSheet = ss.getSheetByName("IMPORTRANGE診断") || ss.insertSheet("IMPORTRANGE診断");
reportSheet.clear();
reportSheet.getRange(1, 1, report.length, report.length).setValues(report);
SpreadsheetApp.getUi().alert("診断完了: " + (report.length - 1) + "件のIMPORTRANGEを検出しました。");
}
このスクリプトを実行すると、「IMPORTRANGE診断」という新しいシートが作成され、シート名、セル位置、数式内容、現在の表示値、正常/異常のステータスが一覧で表示されます。月に一度、定期的に実行して接続状態を監視する運用がおすすめです。
スクリプト2IMPORTRANGEを使わずに別スプレッドシートのデータを定期同期する
認証ループ問題を根本的に回避する最も確実な方法は、IMPORTRANGEを使わないことです。以下のスクリプトは、ソース元スプレッドシートの指定範囲のデータを取得先スプレッドシートにコピーする処理を行います。トリガーを設定すれば、毎時や毎日など任意のタイミングで自動同期できます。
function syncDataFromSource() {
// ===== 設定項目 =====
var SOURCE_SS_ID = "ソース元のスプレッドシートID";
var SOURCE_SHEET_NAME = "売上データ";
var SOURCE_RANGE = "A1:G"; // 最終行まで自動取得
var DEST_SHEET_NAME = "同期データ";
// ===== 設定ここまで =====
try {
var sourceSheet = SpreadsheetApp.openById(SOURCE_SS_ID).getSheetByName(SOURCE_SHEET_NAME);
var lastRow = sourceSheet.getLastRow();
var lastCol = sourceSheet.getLastColumn();
if (lastRow === 0) {
Logger.log("ソース元にデータがありません。");
return;
}
var data = sourceSheet.getRange(1, 1, lastRow, lastCol).getValues();
var destSS = SpreadsheetApp.getActiveSpreadsheet();
var destSheet = destSS.getSheetByName(DEST_SHEET_NAME);
if (!destSheet) {
destSheet = destSS.insertSheet(DEST_SHEET_NAME);
}
destSheet.clear();
destSheet.getRange(1, 1, data.length, data.length).setValues(data);
// 同期日時をメタデータとして記録
var timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy/MM/dd HH:mm:ss");
destSheet.getRange(1, lastCol + 2).setValue("最終同期: " + timestamp);
Logger.log("同期完了: " + lastRow + "行のデータを転送しました。");
} catch(e) {
Logger.log("同期エラー: " + e.message);
// エラー時にメール通知を送る場合
// MailApp.sendEmail("admin@example.com", "IMPORTRANGE同期エラー", e.message);
}
}
このスクリプトの利点は3つあります。第一に、IMPORTRANGEのような認証問題が一切発生しません。スクリプトの実行権限はGASプロジェクトのオーナーに紐づくため、個人の異動や退職に影響されにくいです。第二に、データが「参照」ではなく「コピー」されるため、ソース元との接続が切れてもデータが消えません。第三に、try-catchでエラーハンドリングしているため、問題が起きたときにメール通知するなどの仕組みも簡単に追加できます。
トリガーの設定方法は、GASエディタの左メニューにある時計アイコン(トリガー)をクリックし、「トリガーを追加」から関数名「syncDataFromSource」を選択して、「時間主導型」→「時間ベースのタイマー」→「1時間おき」などを選べばOKです。
スクリプト3テンプレートコピー時にIMPORTRANGEの認証を一括で自動承認する
営業チームに毎月スプレッドシートのテンプレートを配布していて、コピーするたびにIMPORTRANGEの認証を手動で通す必要がある、という業務は本当に多いです。以下のスクリプトは、テンプレートをコピーすると同時に、すべてのIMPORTRANGE認証と外部関数の許可を自動で処理します。
function copyTemplateWithAutoAuth() {
// ===== 設定項目 =====
var TEMPLATE_SS_ID = "テンプレートのスプレッドシートID";
var NEW_NAME = "2026年4月_営業レポート";
var SOURCE_SS_IDS = ; // IMPORTRANGEの参照先ID一覧
// ===== 設定ここまで =====
// テンプレートをコピー
var template = SpreadsheetApp.openById(TEMPLATE_SS_ID);
var copied = template.copy(NEW_NAME);
var copiedId = copied.getId();
var params = {
method: "post",
headers: { authorization: "Bearer " + ScriptApp.getOAuthToken() },
muteHttpExceptions: true
};
var requests = ;
// 外部URL関数(IMPORTHTML等)の許可
requests.push({
url: "https://docs.google.com/spreadsheets/u/0/d/" + copiedId + "/externaldata/allowexternalurlaccess",
method: "post",
headers: params.headers,
muteHttpExceptions: true
});
// 各ソース元に対するIMPORTRANGE認証
SOURCE_SS_IDS.forEach(function(sourceId) {
requests.push({
url: "https://docs.google.com/spreadsheets/d/" + copiedId + "/externaldata/addimportrangepermissions?donorDocId=" + sourceId,
method: "post",
headers: params.headers,
muteHttpExceptions: true
});
});
// 一括実行(fetchAllで高速処理)
var responses = UrlFetchApp.fetchAll(requests);
responses.forEach(function(res, i) {
Logger.log("リクエスト" + (i + 1) + ": " + res.getResponseCode());
});
Logger.log("コピー完了: " + copied.getUrl());
SpreadsheetApp.getUi().alert("テンプレートのコピーと認証が完了しました。\\n" + copied.getUrl());
}
ポイントは
UrlFetchApp.fetchAll()
を使って複数のリクエストを並列実行している点です。IMPORTRANGEの参照先が10個あっても、直列に処理するより圧倒的に速く認証が完了します。なお、このスクリプトで使用しているIMPORTRANGE認証のエンドポイント(
addimportrangepermissions
)は非公式APIである点に注意してください。Googleの仕様変更で動かなくなる可能性はゼロではありませんが、2026年3月時点では問題なく動作しています。
スクリプト4IMPORTRANGEが壊れたら自動でSlackやメールに通知する監視スクリプト
IMPORTRANGEが壊れたことに気づくのが遅れると、古いデータで意思決定してしまう危険があります。以下のスクリプトをトリガーで定期実行しておけば、エラーが発生した時点でメールで通知が届きます。
function monitorImportrange() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var errors = ;
sheets.forEach(function(sheet) {
var finder = sheet.createTextFinder("IMPORTRANGE")
.matchFormulaText(true)
.matchCase(false);
var cells = finder.findAll();
cells.forEach(function(cell) {
var value = cell.getDisplayValue();
if (value === "#REF!" || value === "#ERROR!" || value === "" || value.indexOf("Loading") >= 0) {
errors.push(sheet.getName() + "!" + cell.getA1Notation() + " → " + value);
}
});
});
if (errors.length > 0) {
var subject = "【警告】IMPORTRANGEエラー検出: " + ss.getName();
var body = "以下のIMPORTRANGEでエラーが発生しています。\\n\\n";
body += errors.join("\\n");
body += "\\n\\nスプレッドシートURL: " + ss.getUrl();
MailApp.sendEmail("your-email@example.com", subject, body);
Logger.log("エラー通知を送信しました: " + errors.length + "件");
} else {
Logger.log("すべてのIMPORTRANGEは正常です。");
}
}
このスクリプトを「時間主導型トリガー」で1時間おきに実行するように設定しておけば、IMPORTRANGEが壊れてから最大1時間以内に気づけます。メールアドレスの部分は自分のアドレスに書き換えてください。Google Chatのウェブフック URLに対してUrlFetchAppでPOSTすれば、Slack通知のようにチャットへの通知も可能です。
「Loading…」が永遠に終わらないときの緊急リカバリー手順
認証は通っているはずなのに、セルがずっと「Loading…」のまま止まってしまう。これもIMPORTRANGEの現場あるあるです。認証ループとは厳密には異なりますが、体感としてはほぼ同じ「終わらない地獄」なので、ここで具体的な対処法を解説します。
リカバリー手順その1数式の「イコール外し」テクニック
最も手軽で効果的な方法が、いわゆる「イコール外し」です。具体的には、Loading状態のセルをダブルクリックして編集モードに入り、先頭の
=
を削除してEnterを押します。数式がただのテキストになるので、当然データは消えます。次にもう一度セルをダブルクリックし、先頭に
=
を付け直してEnterを押します。たったこれだけで、IMPORTRANGEが再評価されて読み込みが走り直します。
なぜこれで直るのかというと、IMPORTRANGEのキャッシュが内部的にスタックしている状態をリセットできるからです。ブラウザのリロード(F5)では解消しないのにこの方法で直ることが多いのは、セルの数式を変更するとGoogleのサーバー側で再計算がトリガーされるためです。
リカバリー手順その2スロットリング状態の確認と対処
セルに「Error: Loading data may take a while because of the large number of requests」というメッセージが出ている場合は、スロットリング(リクエスト制限)に引っかかっています。この制限はIMPORTRANGEだけでなく、IMPORTHTML、IMPORTDATA、IMPORTFEED、IMPORTXMLを含む全IMPORT系関数の合計に対してかかります。しかも、この制限はドキュメントの作成者に対して適用されるため、共同編集者が追加したIMPORT関数も作成者のクォータを消費します。
対処法としてまず試すべきは、しばらく時間を置くことです。通常は数分から数十分でスロットリングが解除されます。もし頻繁にスロットリングが発生する場合は、IMPORT関数の数を減らすか、先ほど紹介したGASによるデータ同期に切り替えることを強くおすすめします。
リカバリー手順その3再計算設定の変更による強制リフレッシュ
スプレッドシートの「ファイル」→「設定」→「計算」タブで、再計算の頻度を変更する方法も有効です。デフォルトでは「変更時」になっていますが、これを「変更時、および毎分」に変更すると、IMPORTRANGEの更新頻度が上がり、Loading状態から抜け出しやすくなります。ただし、この設定はスプレッドシート全体のパフォーマンスに影響するため、データ量が多い場合は「変更時、および毎時」の方が安全です。問題が解消したら、設定を元に戻すのを忘れないでください。
IMPORTRANGE運用で「地味に困る」現実的な問題とその解決策
ネット記事では派手なエラーばかりが取り上げられますが、実際の業務では「エラーにはなっていないけど地味に困る」問題のほうが多いです。ここでは、そうした現場のリアルな悩みに答えます。
IMPORTRANGEで取り込んだデータの書式が崩れる問題
IMPORTRANGEで読み込んだデータは、値だけが転送され、書式は引き継がれません。日付データがシリアル値(44927のような数字)で表示されたり、通貨書式が消えたり、色や太字などの装飾がすべてなくなります。これは仕様なのでIMPORTRANGE側では対処できません。
現実的な解決策としては、取得先のスプレッドシートで表示形式を事前に設定しておくことです。IMPORTRANGEが展開される範囲のセルに対して、あらかじめ日付形式や通貨形式を指定しておけば、データが読み込まれたタイミングで正しい書式で表示されます。ただし、IMPORTRANGEは配列で展開されるため、展開される範囲にあらかじめ値が入っていると#REF!エラーになる点には注意してください。
IMPORTRANGEのデータをソートやフィルターしたいけどできない問題
IMPORTRANGEで取り込んだ範囲に対して、Googleスプレッドシートの標準フィルター機能(メニューの「データ」→「フィルタを作成」)を使おうとすると、並べ替えができません。IMPORTRANGEが出力する配列はロックされているため、行の並び替えや削除ができないのです。
この問題を解決するには、IMPORTRANGEをQUERY関数で包むのが最も実用的です。たとえば、IMPORTRANGEで取り込んだデータをC列(3列目)の降順でソートしたい場合は、以下のように書きます。
=QUERY(IMPORTRANGE("スプレッドシートURL", "シート名!A1:E100"), "SELECT * ORDER BY Col3 DESC")
QUERYを使えば、WHERE句で条件フィルターしたり、GROUP BYで集計したりもできます。ただし、前述の通り、IMPORTRANGEをQUERYにネストする場合は先にIMPORTRANGE単体で認証を通しておくことを忘れないでください。
誰がいつIMPORTRANGEの認証を通したか追跡できない問題
これは監査やセキュリティの観点で重要なのに、ほぼ情報がない問題です。結論から言うと、Googleスプレッドシートの標準機能ではIMPORTRANGEの認証履歴を追跡する方法は存在しません。変更履歴にはセルの数式変更は記録されますが、「アクセスを許可」ボタンを誰が押したかは記録されません。
組織としてこの追跡が必要な場合は、2つのアプローチがあります。1つ目は、先ほど紹介したGASスクリプトによる認証自動化を使い、スクリプトのログに認証実行日時と実行者を記録する方法です。2つ目は、Google Workspaceの管理コンソールにある監査ログを活用する方法です。ドライブの監査ログには、ファイルの共有設定変更が記録されるため、間接的に認証のタイミングを推測できます。完璧な追跡は難しいですが、この2つを組み合わせればある程度のトレーサビリティは確保できます。
Sheets APIの公式プロパティと非公式エンドポイントの違いを正しく理解する
GASでIMPORTRANGEの認証を自動化する方法として、2つのまったく異なるアプローチがあることを正確に理解しておきましょう。混同すると、動かないスクリプトに時間を浪費することになります。
公式importFunctionsExternalUrlAccessAllowedプロパティ
これはSheets APIが正式にサポートしているプロパティで、
spreadsheets.batchUpdate
メソッドで設定できます。対象はIMPORTHTML、IMPORTDATA、IMPORTFEED、IMPORTXML、IMAGE関数です。IMPORTRANGEはこのプロパティの対象外です。
function enableExternalAccess() {
var spreadsheetId = SpreadsheetApp.getActiveSpreadsheet().getId();
Sheets.Spreadsheets.batchUpdate({
requests: [{
updateSpreadsheetProperties: {
properties: { importFunctionsExternalUrlAccessAllowed: true },
fields: "importFunctionsExternalUrlAccessAllowed"
}
}]
}, spreadsheetId);
}
このスクリプトを使うには、GASエディタの左メニュー「サービス」から「Google Sheets API(v4)」を有効化する必要があります。重要な注意点として、このプロパティは一度trueに設定するとfalseに戻すことができません。「Cannot set import functions external URL access allowed from true to false」というエラーが返ります。セキュリティ上の理由でこの設計になっていると思われますが、テスト環境で気軽にオンにするとオフに戻せないので注意してください。
非公式addimportrangepermissionsエンドポイント
IMPORTRANGE専用の認証を自動化するには、こちらの非公式エンドポイントを使う必要があります。これはGoogleの内部APIであり、公式ドキュメントには記載されていません。先ほど紹介したスクリプト3でも使用しているエンドポイントです。
非公式APIである以上、Googleが予告なく仕様を変更する可能性は常にあります。ただし、このエンドポイントは2024年の発見以来、2026年3月時点まで安定して動作し続けており、世界中のGAS開発者が実務で使っているのが現状です。もし将来的に動かなくなった場合は、前述のGASによるデータ同期スクリプト(スクリプト2)に切り替えるのが最も安全なフォールバック戦略です。
ぶっちゃけこうした方がいい!
ここまでIMPORTRANGEの認証ループについてかなり深く掘り下げてきましたが、正直な話をします。情シスとして10年以上この手のトラブルを見てきた人間の個人的な結論です。
IMPORTRANGEは「プロトタイプ用の関数」だと思って使った方がいいです。小規模な個人作業や、ちょっとした検証で「別のシートのデータを見たい」というときにサクッと使う分には最高に便利です。でも、部署をまたいだ業務フローの基盤にしたり、経営レポートのデータパイプラインに使ったり、何十人もが毎日触るシートに組み込んだりするものではありません。
なぜかというと、IMPORTRANGEは「参照」であって「データ転送」ではないからです。参照先が壊れたらデータは消えます。認証した人が退職したら接続は切れます。Googleの内部で何かが変わったら、ある日突然動かなくなるかもしれません。ビジネスの根幹をこの不安定さの上に乗せるのは、ぶっちゃけ怖すぎます。
じゃあどうするかというと、答えはシンプルで、「IMPORTRANGEでうまくいった仕組みは、なるべく早くGASに置き換える」ことです。IMPORTRANGEで「こういうデータ連携がしたい」という要件を検証して、うまくいったらGASのスクリプトで同じことを実装する。GASならエラーハンドリングもできるし、ログも残るし、トリガーで自動実行もできる。認証ループみたいな不可解な問題に悩まされることもありません。
もう一つ、現場でよく見る失敗パターンについても言わせてください。それは「IMPORTRANGEを使ったスプレッドシートの設計を、作った本人以外が理解できない」問題です。5つのスプレッドシートがIMPORTRANGEで数珠つなぎになっていて、どこがソースでどこが中間でどこが最終アウトプットなのか、作った本人にしかわからない。その本人が異動したら、残された人は「このシートのデータはどこから来ているの?」と途方に暮れることになります。
だから、IMPORTRANGEを使うなら最低限やってほしいのは「接続マップ」を作ることです。どのスプレッドシートがどのスプレッドシートを参照しているか、誰が認証を通したか、いつ作ったか。これをGoogleスプレッドシートでもGoogleドキュメントでもいいから一枚にまとめておく。たったこれだけで、トラブル発生時の原因特定が10倍速くなります。先ほど紹介した「診断スクリプト」を定期実行して、その出力結果を接続マップの隣に置いておくのが理想的です。
結局のところ、IMPORTRANGEの認証ループ問題の本当の解決策は「IMPORTRANGEに依存しすぎない設計思想」を持つことです。便利な道具だからこそ、その限界を理解して、適材適所で使い分ける。そうすれば、月曜朝のシート全滅パニックとは無縁の、安心して運用できるスプレッドシート環境が手に入ります。
このサイトをチップで応援
IMPORTRANGEの認証ループに関するよくある疑問を解決
認証を一度許可したのに、翌日また#REF!エラーが出るのはなぜ?
通常、一度許可した認証は永続的に有効です。再びエラーが出る場合は、別のGoogleアカウントでログインしている、ソース元のファイルが移動や削除された、またはソース元の共有設定が変更された可能性が高いです。まず、ソース元のスプレッドシートにブラウザで直接アクセスできるかを確認してください。アクセスできない場合は、ファイルのオーナーに共有設定を確認してもらいましょう。
IMPORTRANGEのデータ更新頻度はどのくらい?リアルタイムではない?
IMPORTRANGEは約30分ごとに自動更新されますが、リアルタイムではありません。ドキュメントが開かれている間は約1時間ごとにもチェックが行われます。即時に最新データを反映したい場合は、ブラウザでF5キーを押して手動リロードするか、スプレッドシートの設定で再計算頻度を「変更時と毎分」に変更してください(「ファイル」→「設定」→「計算」から変更できます)。
VLOOKUPやQUERYとIMPORTRANGEを組み合わせると認証が通らないのですが?
前述の通り、他の関数にネストした状態では「アクセスを許可」ボタンが隠されてしまうことがあります。必ずIMPORTRANGE単体を空きセルに入力して先に認証を通してから、本来のネスト数式に戻してください。この手順を守れば問題なく動作します。テスト用のIMPORTRANGEは認証完了後に削除して大丈夫です。
Google Workspace(法人版)特有の認証制限はある?
はい、あります。組織の管理者がデータ損失防止(DLP)ポリシーを設定している場合、組織外のスプレッドシートへのIMPORTRANGEが制限されることがあります。この場合、個人の設定では解決できないため、Workspace管理者にDLPポリシーの確認を依頼してください。同じ組織内のスプレッドシート間であれば問題ないケースがほとんどです。
IMPORTRANGEで取り込めるデータ量に上限はある?
Googleは公式にIMPORTRANGEのセル数上限を公表していませんが、実際のテストでは約25万〜36万セルが上限の目安とされています。1回のリクエストで受信できるデータは10MBまでという制限もあります。大量データを扱う場合は、範囲を分割するか、GASやConnected Sheetsなどの代替手段を検討しましょう。
今すぐパソコンやスマホの悩みを解決したい!どうしたらいい?
いま、あなたを悩ませているITの問題を解決します!
「エラーメッセージ、フリーズ、接続不良…もうイライラしない!」
あなたはこんな経験はありませんか?
✅ ExcelやWordの使い方がわからない💦
✅ 仕事の締め切り直前にパソコンがフリーズ💦
✅ 家族との大切な写真が突然見られなくなった💦
✅ オンライン会議に参加できずに焦った💦
✅ スマホの重くて重要な連絡ができなかった💦
平均的な人は、こうしたパソコンやスマホ関連の問題で年間73時間(約9日分の働く時間!)を無駄にしています。あなたの大切な時間が今この悩んでいる瞬間も失われています。
LINEでメッセージを送れば即時解決!
すでに多くの方が私の公式LINEからお悩みを解決しています。
最新のAIを使った自動応答機能を活用していますので、24時間いつでも即返信いたします。
誰でも無料で使えますので、安心して使えます。
問題は先のばしにするほど深刻化します。
小さなエラーがデータ消失や重大なシステム障害につながることも。解決できずに大切な機会を逃すリスクは、あなたが思う以上に高いのです。
あなたが今困っていて、すぐにでも解決したいのであれば下のボタンをクリックして、LINEからあなたのお困りごとを送って下さい。
ぜひ、あなたの悩みを私に解決させてください。
まとめ
IMPORTRANGEの認証ループは、一見すると不可解で途方に暮れてしまう問題ですが、原因を一つずつ切り分けていけば必ず解決できます。まずは基本的なチェック項目(アカウント権限、URL、シート名、ファイル形式)を確認し、それでも解決しない場合は循環参照やチェーン構成を見直してください。そして、大量のIMPORTRANGEを管理する環境であれば、GASによる認証自動化や、そもそもIMPORTRANGEに頼らないGASベースのデータ転送への移行を検討しましょう。
2026年のGoogleスプレッドシートは、Connected SheetsやGASのAPIの進化により、以前よりもずっと柔軟なデータ連携が可能になっています。IMPORTRANGEはあくまで「手軽な選択肢の一つ」であり、万能ではありません。業務の規模や要件に合わせて最適なツールを選ぶことが、認証ループのような不毛なトラブルから解放される最善の道です。この記事で紹介した対処法とベストプラクティスを実践して、スプレッドシート業務をストレスフリーにしていきましょう。






コメント