Google SheetsでIMPORTXMLの「インポートされたコンテンツは空です」エラーを修正する方法

intermediate📗 Google Sheets2026-06-10| Google Sheets (Webベース), すべてのオペレーティングシステム

Error Message

Error: Imported content is empty.
#importxml#xpath#google-sheets#ウェブスクレイピング#トラブルシューティング

データが表示されない:イライラの原因Amazonの商品の価格追跡や、ニュースサイトの見出しを取得するためにスプレッドシートを設定し、=IMPORTXML(url, xpath) 関数を完璧に記述したとします。しかし、データが表示される代わりに、忌々しい赤い三角形と「インポートされたコンテンツは空です」というメッセージが表示されることがあります。

これは非常によくある壁です。ChromeのデベロッパーツールでXPathを何度も再確認しても、セルは頑なに空白のままです。これはXPathが間違っているからではなく、多くの場合、Google Sheetsと対象のWebサイトが「同じ言語」で話していないことが原因です。

なぜGoogle Sheetsには空白のページが見えるのかこの問題を解決するには、Googleのスケーレイパー(抽出プログラム)がどのように動作するかを理解する必要があります。ブラウザとは異なり、Google Sheetsはインタラクティブなツールではありません。IMPORTXMLを使用すると、Googleのサーバーはサイトに対して基本的なリクエストを送信します。これは、1990年代のテキスト専用ブラウザのようなものです。

データが見つからない主な理由は3つあります。

  • JavaScriptの壁: 最近のサイト(React、Vue、Angularなどで構築されたサイト)の多くは、コンテンツを動的に読み込みます。Google SheetsはJavaScriptを実行しないため、初期状態の空のHTMLテンプレートしか認識できません。- 「隠れた」TBODY: Chromeの「検証」ツールは、テーブルを読みやすくするために <tbody> タグを自動的に追加することがよくあります。しかし、元のソースコードにはこれらのタグが存在しないことが多く、その結果XPathが失敗します。- ボット保護: AmazonやLinkedInなどのサイトは、GoogleのIPアドレスを認識しています。自動化されたボットによるアクセスをブロックするために、403 Forbiddenエラーを返したり、CAPTCHAを表示したりすることがあります。## ステップ1:生のソースコードを確認するGoogle Sheetsが実際に何を「見ている」かを確認する最も早い方法は、ブラウザのレンダリングを介さずに確認することです。対象のWebサイトを開き、Ctrl + U(Windows)または Cmd + Option + U(Mac)を押して、**「ページのソースを表示」**タブを開きます。 取得したい特定の価格やテキストを検索(Ctrl + F)してください。もしそこにデータがなければ、データは後からJavaScriptによって挿入されているため、IMPORTXMLで見つけることは不可能です。もしデータが存在するのであれば、XPathを微調整するだけで解決します。

より良いXPathの書き方Chromeから「フルXPath」をコピーするのは避けましょう。これらは構造が脆く、divが1つ変わるだけで壊れてしまいます。代わりに、一意のIDやクラスをターゲットにします。例えば、spanタグから価格を取得する場合:

=IMPORTXML("https://example.com", "//span[contains(@class, 'price-amount')]")

注意: パスから /tbody を必ず削除してください。これは、Google SheetsでXPathの不一致が起こる最も一般的な原因です。

ステップ2:JavaScriptを多用するサイトへの対応ステップ1で生のソースコードにデータが含まれていなかった場合、IMPORTXMLはその作業には適していません。2つの代替案があります。

Apps Scriptによる回避策サイトによってはGoogleのデフォルトのスクレイパーをブロックしていても、カスタムリクエストを許可する場合があります。Google Apps Scriptを使用して、実際のブラウザのヘッダーを模倣できます。拡張機能 > Apps Script を開き、以下の関数を試してみてください。

function customFetch(url) {
  const options = {
    'muteHttpExceptions': true,
    'headers': {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/115.0.0.0'
    }
  };
  const response = UrlFetchApp.fetch(url, options);
  return response.getContentText();
}

このスクリプトは、標準の関数をブロックする基本的なボット検知を回避できることがよくあります。ただし、Google Apps Scriptには30秒の実行制限と、1リクエストあたり10MBのフェッチ制限があることに注意してください。

APIプロキシの使用Amazonのようにセキュリティが強固なサイトの場合、JavaScriptをレンダリングするプロキシが必要です。ScraperAPIやZenscrapeのようなサービスが、JavaScriptの実行などの重い処理を代行してくれます。数式は以下のようになります。

=IMPORTXML("http://api.scraperapi.com?api_key=YOUR_KEY&url=" & ENCODEURL("https://amazon.com/product-url"), "//span[@id='priceblock_ourprice']")

最終確認修正が完了したら、安定性をテストします。Google Sheetsは IMPORTXML の結果を約2時間キャッシュします。修正が実際に機能したか確認するために強制的にリフレッシュするには、URLの末尾にランダムな数字を追加します。

=IMPORTXML("https://example.com/page?refresh="&RANDBETWEEN(1,1000), "//h1")

それでもエラーが続く場合は、そのサイトにRSSフィードがないか確認してください。=IMPORTFEED(url) を使用する方が、HTMLをスクレイピングするよりも10倍信頼性が高く、長期的にはトラブルシューティングの時間を大幅に節約できます。

Related Error Notes