GASでWeb情報を定期取得してシートに記録する方法

GASでWeb情報を定期取得してシートに記録する方法

自社サイトの更新情報ページ、仕入れ先の在庫ページ、官公庁が公開している統計ページ。

毎朝ブラウザで開いて数値や見出しを確認し、変化があればスプレッドシートに手で転記する作業を続けていないでしょうか。

対象のページさえ決まっていれば、この巡回と転記はスクリプトに任せられます。

いわゆるスクレイピングと呼ばれる処理ですが、業務で使う場合は「取得していい相手か」を先に確認する手順とセットで扱うのが前提です。

この記事では、Google Apps ScriptでWebページの情報を定期的に取得してスプレッドシートへ記録する仕組みを、取得前に確認すべき注意点とあわせて整理しています。

Web情報の定期取得を無料で相談する

できることとやってはいけないこと

このスクリプトで実現できるのは、決まった構造を持つWebページから特定の文字列を取り出し、日時とあわせてシートに記録する処理です。

公開されている更新情報の見出し、価格、在庫状況の表示など、ページ内の一部分をピンポイントで抜き出す用途に向いています。

一方で、取得先を選ぶ前に確認しておくべきことがあります。

  • 取得先の利用規約にクローリングやスクレイピングを禁止する条項がないか
  • 対象サイトのドメイン直下にある/robots.txtで、機械的なアクセスが許可されている範囲か(Disallowに指定されたパスは対象から外す)

規約とrobots.txtの両方を確認し、問題がない範囲に取得対象を絞ってください。

規約上問題がない場合でも、短時間に大量アクセスを繰り返すとサーバーに負荷をかけます。

取得は1日数回程度の低頻度にとどめ、相手のサーバーが対応できる範囲を超えないようにしてください。

こうした理由から、以降は自社が権利を持つページ、または官公庁や自治体が公開しているオープンデータを取得先の例として扱います。

向いている取得先

避けるべき取得先

自社サイトの更新情報ページ

利用規約でクローリングを禁止しているサイト

官公庁・自治体が公開するオープンデータ

ログインが必要な会員限定ページ

robots.txtで許可されている静的ページ

短時間に何度もアクセスする必要がある対象

手順

Step1. 取得対象と取得頻度を決める

対象ページのURLを確定してそのページの利用規約とrobots.txtを確認し、問題がなければどの程度の頻度で取得するかを決めます。

更新頻度が1日1回程度のページであれば、取得も1日1〜2回で十分です。

Step2. コードを貼り付ける(コード全文)

対象のスプレッドシートで「拡張機能」から「Apps Script」を開き、以下のコードを全文貼り付けます。

TARGET_URLには取得対象のページ、EXTRACT_PATTERNには抜き出したい部分に合わせた正規表現を入力してください。

function fetchAndRecordWebInfo() {
  const TARGET_URL = "https://example.com/notice"; // 自社サイトの更新情報ページ
  const TARGET_SHEET_NAME = "取得記録";
  const EXTRACT_PATTERN = /<h2 class="notice-title">(.*?)<\/h2>/;

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(TARGET_SHEET_NAME);
  if (!sheet) {
    throw new Error(`シート「${TARGET_SHEET_NAME}」が見つかりません`);
  }

  const response = UrlFetchApp.fetch(TARGET_URL, { muteHttpExceptions: true });
  if (response.getResponseCode() !== 200) {
    throw new Error(`取得に失敗しました(ステータス: ${response.getResponseCode()})`);
  }

  const html = response.getContentText();
  const matched = html.match(EXTRACT_PATTERN);
  const extractedText = matched ? matched[1] : "抽出失敗";

  const now = new Date();
  sheet.appendRow([now, extractedText]);
}

fetchAndRecordWebInfoはページを取得し、EXTRACT_PATTERNに一致した部分だけを取り出して、取得日時とあわせて新しい行に追記する作りです。

一致しなかった場合は「抽出失敗」と記録されるため、後から目視で気づけます。

Step3. 抽出パターンを対象ページに合わせて調整する

match()が正しく動くかどうかは、EXTRACT_PATTERNが対象ページのHTML構造に合っているかで決まります。

対象ページのソースを表示し、抜き出したい文字列の前後にあるタグやクラス名を確認したうえで正規表現を組み立ててください。

取得した文章を要約したり定型文に整形したりしたい場合は、抽出結果をさらにChatGPT APIへ渡す方法もあります。

Step4. 少数回テストしてから時間トリガーを設定する

まずは手動で数回実行し、シートに記録される値が想定どおりかを確認します。

初回実行時には外部サイトへのアクセス許可を求める承認画面が表示されるため、内容を確認して許可してください。

問題がなければ、時計アイコンの「トリガー」からfetchAndRecordWebInfoを時間主導型トリガーに登録し、Step1で決めた頻度で自動実行させます。

GASでWeb情報を定期取得する設定手順の4ステップ。取得対象を決定→コードを貼り付け→抽出パターンを調整→テストして設定

取得先の構造変更への備え

Webページの見た目やコードは、運営側の都合で予告なく変わるものです。

EXTRACT_PATTERNが対象にしていたタグやクラス名が変更されると、match()は一致しなくなり、シートには「抽出失敗」が記録され続けます。

この状態に早く気づくための工夫として、抽出結果が一定回数連続で「抽出失敗」になった場合にメールで通知する処理を追加しておく方法があります。

appendRowの後に連続失敗回数を判定する条件を加え、MailApp.sendEmailで自分宛てに通知すれば、正規表現の見直しが必要になったタイミングを取りこぼしません。

構造変更への対応は正規表現を直すだけで済むことが多く、取得の仕組み自体を作り直す必要はほとんどありません。

そもそもどこから自動化に着手すべきか整理したい場合は、こちらが参考になります。


Webサイトの情報取得の自動化について相談してみませんか?

「対象サイトの利用規約を確認する余裕がない」「正規表現の書き方がわからない」「取得した情報をどう活用すればいいかまで決めきれていない」

少しでもお心当たりがあれば、お気軽にご相談ください。

現在、業務自動化に関するお悩みをお伺いする 無料の個別相談 を実施しています。

よくある質問

Q. robots.txtにDisallowの記載がない場合は自由に取得してよいですか?

robots.txtに記載がなくても、利用規約でクローリングやスクレイピングを制限している場合があります。

robots.txtと利用規約の両方を確認したうえで判断してください。

Q. 取得したデータをそのまま社外に公開してもよいですか?

取得元のコンテンツには著作権が発生している場合があります。

社外への公開や再配布を行う前に、取得元の利用規約や著作権表示を確認してください。

Q. 対象ページがログインを必要とする場合はどうすればよいですか?

この記事のコードは公開ページを前提としており、ログインが必要なページには対応していません。

ログインが必要な情報を扱う場合は、対象サービスが公式に提供しているAPIの利用を先に検討してください。