Google Sheetsは単なる表計算ソフトではなく、Google Apps Script(JavaScriptのランタイム)と組み合わせることで、公開ウェブデータの収集、価格変動の監視、テーブルの抽出、ダッシュボードへのフィードのための軽量なスクレイピングプラットフォームとなる。
このガイドでは、JavaScriptによる信頼性の高いGoogle SheetsのWebスクレイピングワークフローの構築、自動化、よくあるブロックの回避、プロキシの統合(以下のようなプロバイダを使用する実践的なルートを含む)について、ステップバイステップで説明します。 オッケープロキシー403エラーを減らし、成功率を向上させる。
簡単なメモ:サイトのrobots.txt、利用規約、現地の法律を常に尊重すること。スクレイピングは、合法的な公開データおよび調査/モニタリングの目的で使用してください。
JavascriptによるGoogle Sheets Webスクレイピングとは?
Google SheetsウェブスクレイピングJavaScriptとは、Google SheetsとGoogle Apps Script(JavaScript環境)を併用し、プログラムでウェブページを取得し、構造化データを抽出し、そのデータをシートに挿入することです。Apps Scriptは以下を公開します。 UrlFetchApp でコンテンツを取得し 表計算アプリ APIを使って結果を書き込む。多くの迅速なユースケースにおいて、これは高速でサーバーレス、そして無料(Apps Scriptクォータの範囲内)である。
なぜGoogle Apps Script (Urlfetchapp)なのか?
- 慣れ親しんだ環境:JavaScriptの構文、簡単に始められる。
- インフラなしGoogleのサーバー上で動作するため、サーバーを管理する必要がない。
- 統合Googleシートへの直接書き込み、メール送信、トリガーなど。
- スケジューリング時間駆動型トリガーは定期的なスクレイピングを自動化する。
注意すべき制限:Apps ScriptはGoogleのインフラから実行され(そのため、リクエストはGoogleのIP範囲から発信される)、実行/時間のクォータがあり、Cheerioのような組み込みの堅牢なHTML解析ライブラリがありません(これを回避するか、重いタスクには外部のプロキシ/リレーを使用できます)。
- IMPORTXMLを超える:スプレッドシートでデータをスクレイピングしようとしたことがある人なら、次のような問題に遭遇したことがあるだろう。
=IMPORTXML関数である。
何なのか? インポートエックスエムエル?これは、URLとXPath(データへの「マップ」)を提供することで、特定のウェブサイトからデータを引き出すことを可能にするGoogle Sheetsの組み込み式です。例えば =IMPORTXML("https://example.com", "//h1") はページの大見出しを引っ張ってくる。
簡単そうに聞こえるが、現実の世界では主な理由で失敗することが多い。例えば、最近のウェブサイトの多くは「シングル・ページ・アプリケーション」(ReactやVueで構築されている)である。IMPORTXMLは、最初のソースコードしか読めません。JavaScriptが実際のデータを読み込むのを「待つ」ことはできません。
簡単なスクレイピングの例:HTMLをフェッチしてシートに書き込む
ページを取得し、タイトルをシートに書き込む最小限のAppsスクリプト:
関数 fetchPageTitle() {
const url = 'https://example.com';
const resp = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
const html = resp.getContentText();
const titleMatch = html.match(/([^<]*) /i);
const title = titleMatch ? titleMatch[1].trim() : 'No title found';
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.appendRow([new Date(), url, title]);
}
これは単純な静的ページに適している。より構造化されたコンテンツ(テーブルやリスト)の場合は、解析ロジックが必要になります。
HTMLの解析:戦略と例
オプション A - 軽量正規表現/文字列解析
小さくて予測可能なページには便利。不正なHTMLには強くない。
関数 parseTable(html) {
// 粗雑な例 - 複雑なHTMLでは正規表現に頼らないこと
const rows = html.match(/]*>([\sS]*?) /gi)|| [];
return rows.map(r => {)
const cols = (r.match(/]*>([˶s]*?)/gi))。|| [])
.map(c => c.replace(/]+>/g, '').trim());
cols を返す;
});
}
オプションB - 整形式HTML/XMLのためのXmlService
XmlService はXHTMLやXMLに変換されたHTMLを解析することができるが、多くのページは有効なXMLではない。
オプションC - 解析を外部サービスにオフロードする。
複雑なページの場合、最良のアプローチは、Cloud RunまたはCloud Functionsで小さな解析マイクロサービス(Node.js + Cheerio/Puppeteer)を実行することです。Apps Scriptはそのサービス(JSONを返す)を呼び出し、サービスはHTMLの解析とボット対策を行います。
動的(JSレンダリング)コンテンツを扱う
最近のサイトの多くは、JavaScript (AJAX)を使ってクライアントサイドでコンテンツをレンダリングしています。UrlFetchAppは、サーバーのHTMLのみをフェッチし、ページのJavaScriptは実行しません。
オプション
- JSON/XHRエンドポイントを見つける ページで使用され、それを直接呼び出す(DevToolsのNetworkタブを調べる)。
- ヘッドレス・ブラウザを使う (PuppeteerまたはPlaywright)をCloud Run/Cloud Functionsでホストしてページをレンダリングし、HTMLまたはJSONを返します。このレンダラーを Apps Script から呼び出します。
- サードパーティのレンダリングサービスを利用する (完全にレンダリングされたHTMLを返す(支払われた)、コンプライアンスを確認する。
トリガーとエラー処理によるスクレイピングの自動化
- 時間駆動型トリガー:毎日/毎時のスクレイピングをスケジュール。
- 指数関数的バックオフ:HTTP 429/5xxでは、バックオフして再試行する。
- ログと通知:失敗をログに記録し、永続的なエラーについては電子メールを送信します。
例毎日のトリガーを作る:
関数 createDailyTrigger() {
ScriptApp.newTrigger('fetchPageTitle')
.timeBased()
.everyDays(1)
.atHour(6)
.create();
}
一般的なブロッキングの問題IPレピュテーション、レート制限、キャプチャ
ウェブサイトは積極的にスクレイピングをブロックしている:
- IPレピュテーション既知のクラウドプロバイダーIP(GoogleのApps Script IPなど)からの多くのリクエストは、レート制限またはブロックされる可能性があります。
- 料金制限短時間にリクエストが多すぎると、スロットルが作動する。
- キャプチャ自動化された、あるいは不審な行動が見られる場合に提示される。
主な防御策
- リスペクト
robots.txtと法的/ToS的制約。 - リクエストの間に人間のような遅延を加える。
- リクエストヘッダを正当なものに保つ
ユーザーエージェント,受け入れる). - プロキシを使ってリクエスト元を分散させる(詳細は後述)。
- CAPTCHAを迂回しようとするのは避けましょう。代わりに、公式APIを使うか、適合する場合は人間が解決するようにしましょう。
プロキシによるブロックの克服 - 設計と制約
プロキシはリクエストの送信元IPを変更するので、ターゲットサイトは異なるアドレスからのリクエストを見ることができます。Google Sheetsの場合:
- 重要な制約:
UrlFetchAppはGoogleサーバー上で動作し、ネイティブのプロキシホスト:ポート設定を公開しません。UrlFetchAppのオプションでSOCKS5やHTTPプロキシホストを直接設定することはできません。
回避策
- プロキシリレー/フェッチャー:小さなプロキシ/リレーサービス(Cloud Run / Cloud Function / VPS)をデプロイします。 オッケープロキシー).Apps Script はリレー・エンドポイント (
https://your-relay.example.com/fetch?url=...)、リレーはプロキシされたフェッチを実行し、HTML/JSONを返す。これが最も信頼性が高く、柔軟なアプローチです。 - プロバイダーHTTPフォワードAPI:一部のプロキシプロバイダは、お客様に代わって任意のURLを取得できるHTTP APIエンドポイントを公開しています。OkeyProxyや他のプロバイダが認証済みのフォワーダAPIを提供している場合、Apps Scriptから直接呼び出すことができます(リレーは不要です)。プロバイダのドキュメントを確認してください。
セキュリティ・ノート:リレーを使用する場合は、セキュアなリレー(APIキー、HTTPS)を使用して、Apps Scriptだけが使用できるようにします。
キャプチャ:遭遇したときの対処法
明確な許可がない限り、プログラムでキャプチャを回避しようとしないでください。保護機能を回避するためにキャプチャをバイパスすることは違法であり、多くのサイトの規約に違反します。
頻繁にキャプチャに遭遇する場合
- リクエスト速度を落とす。
- IPトラストの向上(使用 回転居住用プロキシ または 静的ISPプロキシ OkeyProxyのような)。
- 合法的な大規模調査の場合は、サイトの所有者に連絡してアクセスするか、APIエンドポイントを入手してください。
- ビジネス・ワークフローの中で避けられないCAPTCHAについては、ヒューマン・インタラクション・サービスや公式パートナーシップを利用し、コンプライアンスを確保する。
ベストプラクティス(スピード、ヘッダー、クォータ、倫理)
機能するスクレーパーを構築することは1つのことだが、信頼性が高く、敬意を払い、ブロックされないことを保証するには、自動化に対してより規律正しく、「人間のような」アプローチが必要である。
📜 robots.txtとサイトのToSを尊重する。
1バイトのデータも取り出さないうちに、ターゲット・サイトのルールを必ずチェックすること-コンプライアンスを守ることが、プロジェクトの長期的な持続性を確保する唯一の方法なのだ。
🎭 リアルなヘッダーを使う
標準的なUser-Agent、Accept-Language、RefererヘッダーをUrlFetchAppオプションに組み込み、リクエストがスクリプトではなく標準ブラウザーのように見えるようにします。
レート制限とジッターの実装
1秒間に1000ものリクエストをサーバーにぶつけるのはやめましょう。自然なトラフィックパターンを保つために、フェッチ間に "ジッター"(ランダムなスリープ間隔)を導入しましょう。
モニター・レスポンスとバックオフ
429(リクエストが多すぎる)または5xx(サーバーエラー)のレスポンスをキャッチするロジックを設定する。サイトが速度を落とすように指示したら、すぐに耳を傾ける。
⚖️ 著作権侵害を避ける
スクレイピングされたデータは、社内の分析、調査、価格監視のために使用しますが、著作権で保護された素材を再配布または公共の商業利用のためにスクレイピングすることはありません。
トリガーのログと監査
Google Apps Scriptはバックグラウンドで実行されるため、実行時間とエラーコードの簡単なログを記録しておくと、「サイレント」エラーをすばやくデバッグできます。
結論
JavaScriptを使ったGoogle Sheetsのウェブスクレイピング(Apps Script + UrlFetchApp)は、多くの軽量スクレイピングとモニタリングタスクのための実用的なソリューションです。
データセンターのIPをブロックしたり、キャプチャーを頻繁にトリガーするページの場合、制御されたプロキシ戦略を導入することで、理想的には、OkeyProxyのような評判の良いプロバイダーの住宅用/静的ISPプロキシを使用するセキュアリレーを経由することで、ワークフローをサーバーレスに保ちながら、Sheetsと統合することで、劇的に成功率を高めることができます。
よくある質問
Q:Apps Scriptはプロキシを直接使用できますか?
A: いいえ - UrlFetchAppは組み込みのプロキシ・ホスト/ポート設定を提供しません。リレーまたはプロバイダーのサーバー側APIを使用してください。
Q: ウェブサイトのスクレイピングは合法ですか?
A: 場合によります。しかし、サイトのToSや法律(著作権、プライバシー、スクレイピング防止規則)は常に尊重してください。疑問がある場合は、サイトの所有者に問い合わせてください。
Q:キャプチャについてはどうですか?
A: リクエストをスローダウンさせる、IPレピュテーションを向上させる(居住型プロキシ)、APIアクセスを取得するなど、合法的なアプローチを使用してください。明示的な許可なしに、プログラムでキャプチャを破ろうとすることは避けてください。






