「競合サイトの価格・ニュース・求人情報を毎日チェックするのが手間すぎる」「情報収集に時間を取られて本業に集中できない」——そんな悩みを、Google Apps Script(GAS)のWebスクレイピング機能で一気に解決します。本記事では、GASだけで競合サイトの情報を自動収集し、スプレッドシートに蓄積する仕組みを、コードをコピペするだけで作れるよう丁寧に解説します。
GASには外部URLにHTTPリクエストを送るUrlFetchAppと、HTMLを解析するParserライブラリが備わっています。これらを組み合わせれば、プログラミング経験が浅い方でも本格的なスクレイピング自動化が実現できます。
この記事でできること
- GASのUrlFetchAppで任意のWebページのHTMLを取得する
- 正規表現を使って必要な情報(価格・タイトル・日付など)を抽出する
- 収集したデータをGoogleスプレッドシートに自動で記録する
- 毎日・毎時などのタイマートリガーで完全自動化する
事前準備(5分)
必要なものは以下だけです。費用はすべて無料です。
- Googleアカウント
- Googleスプレッドシート(新規作成でOK)
- 収集対象のURL(競合サイト・ニュースサイトなど)
重要な注意点:スクレイピングを行う前に、対象サイトの利用規約とrobots.txtを必ず確認してください。スクレイピングを禁止しているサイトへの実施は規約違反になる場合があります。また、短時間に大量のリクエストを送るのは避け、クロール間隔は最低でも1時間以上空けるよう設計します。
STEP 1:スプレッドシートとGASエディタを準備する
まず情報を記録するスプレッドシートを用意します。
- Googleドライブで新しいスプレッドシートを作成する
- シート名を「競合情報」に変更する
- 1行目に見出しを入力する:A1=「取得日時」、B1=「タイトル」、C1=「価格/内容」、D1=「URL」
- メニューの「拡張機能」→「Apps Script」をクリックしてGASエディタを開く
STEP 2:HTMLを取得して情報を抽出するコードを書く
GASエディタのコードをすべて削除して、以下のコードを貼り付けます。このサンプルでは、架空の競合ECサイトの商品名と価格を取得する想定で構成しています。実際の対象サイトのHTML構造に合わせてセレクタ(正規表現)を変更してください。
// ===== 設定エリア(ここだけ編集する)=====
const TARGET_URLS = [
"https://example-competitor.com/products/", // 競合サイトURL1
"https://example-news.com/category/tech/", // ニュースサイトURL
];
// スプレッドシートID(URLの /d/ と /edit の間の文字列)
const SPREADSHEET_ID = "ここにスプレッドシートIDを入力";
const SHEET_NAME = "競合情報";
// =========================================
function scrapeCompetitorInfo() {
const sheet = SpreadsheetApp
.openById(SPREADSHEET_ID)
.getSheetByName(SHEET_NAME);
TARGET_URLS.forEach(url => {
try {
// HTMLを取得(最大待機5秒に設定)
const response = UrlFetchApp.fetch(url, {
muteHttpExceptions: true,
followRedirects: true,
headers: {
"User-Agent": "Mozilla/5.0 (compatible; GAS-Bot/1.0)"
}
});
// HTTPステータスチェック
if (response.getResponseCode() !== 200) {
Logger.log(`取得失敗: ${url} (ステータス: ${response.getResponseCode()})`);
return;
}
const html = response.getContentText("UTF-8");
// --- 抽出ロジック(対象サイトのHTML構造に合わせて変更)---
// 例1:タグの内容を抽出
const titleMatch = html.match(/]*>([^<]+)<\/title>/i);
const pageTitle = titleMatch ? titleMatch[1].trim() : "取得不可";
// 例2:特定クラスの価格を抽出(例:¥1,980)
const priceMatch = html.match(/]*class="[^"]*price[^"]*"[^>]*>([^<]+)<\/span>/i);
const price = priceMatch ? priceMatch[1].trim() : "価格情報なし";
// スプレッドシートに記録
const now = new Date();
sheet.appendRow([
Utilities.formatDate(now, "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss"),
pageTitle,
price,
url
]);
Logger.log(`記録完了: ${pageTitle} / ${price}`);
// サーバー負荷軽減のため2秒待機
Utilities.sleep(2000);
} catch (e) {
Logger.log(`エラー発生 (${url}): ${e.message}`);
}
});
Logger.log("全URL処理完了");
}
コードを貼り付けたら、SPREADSHEET_IDをご自身のスプレッドシートのIDに書き換えてください。IDはスプレッドシートのURLの/d/と/editの間にある長い文字列です。
STEP 3:正規表現を対象サイトに合わせてカスタマイズする
スクレイピングで最も重要なのが「どこから何を取り出すか」の指定です。Chromeの開発者ツール(F12)でHTMLを確認しながら正規表現を調整します。
よく使うパターンをいくつか紹介します:
// パターン1:特定のIDを持つ要素の内容を取得
// 例:商品名テキスト
const idMatch = html.match(/]*id="product-name"[^>]*>([\s\S]*?)<\/div>/i);
const productName = idMatch ? idMatch[1].replace(/<[^>]+>/g, "").trim() : "";
// パターン2:メタタグからOGPタイトルを取得(多くのサイトで有効)
const ogTitleMatch = html.match(/]*property="og:title"[^>]*content="([^"]+)"/i);
const ogTitle = ogTitleMatch ? ogTitleMatch[1] : "";
// パターン3:特定テキストの後に続く数値を取得(価格など)
// 例:「価格:12,800円」という形式
const numMatch = html.match(/価格[::]\s*([\d,]+)円/);
const price = numMatch ? numMatch[1] + "円" : "";
// パターン4:リスト形式で複数件取得(最新ニュース一覧など)
// 例:記事タイトル
const newsMatches = [...html.matchAll(/]*class="[^"]*entry-title[^"]*"[^>]*>[\s\S]*?]*>([^<]+)<\/a>/gi)];
const newsTitles = newsMatches.map(m => m[1].trim());
対象サイトのHTML構造を確認する手順:Chrome で対象ページを開く → F12キーで開発者ツール起動 → 「Elements」タブで取りたい情報のHTMLを確認 → 周辺のタグやクラス名を正規表現に組み込む、という流れです。
STEP 4:タイマートリガーで毎日自動実行する
手動実行で動作確認ができたら、タイマートリガーを設定して完全自動化します。
- GASエディタ左側の時計アイコン(トリガー)をクリック
- 右下の「トリガーを追加」をクリック
- 実行する関数:
scrapeCompetitorInfo - イベントのソース:「時間主導型」
- 時間ベースのトリガーのタイプ:「日付ベースのタイマー」
- 時刻:「午前8時〜9時」(毎朝出社前に収集完了するよう設定)
- 「保存」をクリック
これで毎朝8時台に自動でスクレイピングが実行され、スプレッドシートに最新情報が蓄積されていきます。
STEP 5:動作確認とトラブルシュート
エディタ上部の「実行」ボタンをクリックして動作を確認します。初回実行時はGoogleアカウントへのアクセス許可を求めるダイアログが表示されるので「許可」をクリックしてください。
トラブルシュートチェックリスト
- 「Exception: Address unavailable」エラー → 対象URLが存在するか・GASからアクセス可能なURLかを確認。一部の企業サイトはBot判定でブロックすることがある
- スプレッドシートに何も記録されない →
SPREADSHEET_IDが正しいか、シート名が「競合情報」と一致しているかを確認 - 文字化けする →
getContentText("UTF-8")の文字コードをサイトに合わせて変更(”Shift_JIS”など) - 価格や情報が「取得不可」になる → 開発者ツールでHTMLを再確認し、正規表現のパターンを修正する
- 「Exception: Quota exceeded」→ GASの1日の実行回数上限(無料版:90分/日)に達している。取得頻度を下げるか、実行間隔を広げる
応用:さらに便利にする拡張アイデア
- 差分検知アラート:前回取得データと比較して変化があった場合のみGmailやSlackで通知する(価格変動・新着記事の検知に最適)
- 複数サイト一括管理:TARGET_URLSに対象URLを追加するだけで複数サイトを横断収集。スプレッドシートに「サイト名」列を追加して一元管理する
- GeminiAPIで要約・分析:収集したテキストをGemini APIに渡して「競合の最新動向まとめ」を自動生成し、毎朝メールで受け取る仕組みに発展させる
- グラフ自動生成:価格データを蓄積してスプレッドシートのグラフ機能で推移グラフを自動更新し、競合価格戦略の分析に活用する
まとめ
GASのUrlFetchAppと正規表現を組み合わせることで、競合サイトの情報収集を完全自動化できます。毎日30分かかっていた情報収集作業がゼロになり、その時間を分析・戦略立案に充てられます。
- UrlFetchAppでHTTPリクエストを送り、サイトのHTMLを取得する
- 正規表現でタイトル・価格・日付などの必要情報を抽出し、スプレッドシートに記録する
- タイマートリガーで毎日自動実行し、人手ゼロで情報収集を継続する
- 差分検知・AI要約と組み合わせることで「競合監視ダッシュボード」へと発展させられる
スクレイピングの対象サイト選定、正規表現のカスタマイズ、Slack通知との連携など、さらに突っ込んだ自動化の仕組み構築についてはお気軽にご相談ください。


コメントを残す