面倒なデータ収集を自動化する方法
毎日のようにWebサイトをチェックして、最新の価格やランキング、ニュース情報をスプレッドシートに転記していませんか?
手作業では膨大な時間がかかり、入力ミスも避けられません。
そんな手間を劇的に減らす方法が、Google Apps Script(GAS)によるWebスクレイピング自動化です。
GASを使えば、Webサイト上のデータを定期的に取得し、Googleスプレッドシートに自動反映できます。
プログラミング経験がなくても導入でき、Googleアカウントさえあれば無料で実行できるのも大きな魅力です。
Webスクレイピングとは?わかりやすく解説
Webスクレイピングとは、Webページ上のデータを自動で取得・抽出する技術です。
例えば、以下のような作業を自動化できます。
| 作業内容 | 手動作業 | スクレイピング後 |
|---|---|---|
| 商品価格のリサーチ | ECサイトを毎回手入力 | GASが定期的に自動取得 |
| ニュースタイトル一覧 | 毎朝コピペ | RSSやHTMLから自動取得 |
| 株価・為替データ | 証券サイトを手打ち | JSON APIやHTML解析で自動更新 |
つまり、スクレイピングを導入すれば「人が見る→コピペする」作業をAI的に自動化できるのです。
GAS(Google Apps Script)を使う理由
PythonやNode.jsでもスクレイピングは可能ですが、GASは次の3つの点で圧倒的に導入しやすいです。
1. Googleスプレッドシートと連携が簡単
データを取得したら、すぐにシートへ書き込み可能。
データベースやAPI連携を意識せずに扱えます。
sheet.getRange(row, col).setValue(data);
この1行で自動記録ができるのが、GASの大きな強みです。
2. 無料でクラウド実行できる
GASはGoogleのサーバー上で動作します。
そのためローカル環境構築やサーバー費用が不要です。
PCを閉じていてもスケジュール実行できるため、完全自動化が可能です。
3. 定期実行(トリガー)機能がある
GASには「時間主導トリガー(cron相当)」が標準装備されています。
これにより、「毎朝9時にWebデータを取得→スプレッドシート更新」といった運用が簡単に実現します。
どんなサイトをスクレイピングできる?
スクレイピングで取得できる情報は主に次の3種類です。
| 形式 | 内容例 | 備考 |
|---|---|---|
| HTML | 通常のWebページ(ニュースサイト・ECサイトなど) | UrlFetchAppで取得可能 |
| JSON | API提供サイト(為替・天気・株価など) | JSON.parse()で解析 |
| RSS/XML | ニュース・ブログ更新情報 | XmlServiceで解析可能 |
ただし、サイトによっては利用規約でスクレイピングを禁止している場合があります。
実装前に「robots.txt」や規約を確認し、取得してよい範囲を守りましょう。
GASでスクレイピングを実現する基本構成
GASによるスクレイピングは、次のような流れで設計します。
① ターゲットURLを指定
↓
② HTMLまたはJSONを取得
↓
③ 必要な情報を抽出
↓
④ スプレッドシートに書き込み
↓
⑤ トリガーで定期実行
この流れをスクリプト化すれば、一度作っておくだけで自動更新が続く仕組みになります。
Webページの情報を取得する基本コード
GASでは、UrlFetchApp.fetch()という関数を使ってWebページを取得します。
たとえば次のようなコードで、任意サイトのHTMLを取得可能です。
function fetchWebData() {
const url = 'https://example.com';
const response = UrlFetchApp.fetch(url);
const html = response.getContentText('UTF-8');
Logger.log(html);
}
ここまでで、Webページの中身を文字列として取得できました。
あとはこのHTMLから、必要なデータを**抽出(パース)**します。
HTMLから特定の要素を抜き出す
たとえば、ニュースサイトのタイトル部分だけを取得したい場合、
HTML内のタグ構造を確認して抽出します。
例)
<h2 class="news-title">経済ニュース:円高が進行</h2>
このようなデータを取り出すには、正規表現を使うのが簡単です。
function getTitles() {
const url = 'https://example.com/news';
const html = UrlFetchApp.fetch(url).getContentText('UTF-8');
const pattern = /<h2 class="news-title">([\s\S]*?)<\/h2>/g;
let match;
const titles = [];
while ((match = pattern.exec(html)) !== null) {
titles.push(match[1]);
}
Logger.log(titles);
}
titlesには、サイト上のニュースタイトルが配列として格納されます。
このデータをスプレッドシートへ自動書き込みすれば、リアルタイム更新のニュースリストが完成します。
スプレッドシートへの自動書き込み
次のように、取得した配列をスプレッドシートに反映します。
function writeToSheet(dataArray) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('ニュース一覧');
sheet.getRange(2, 1, dataArray.length, 1).setValues(dataArray.map(item => [item]));
}
この関数をgetTitles()の最後に組み合わせることで、
ニュースが自動的にスプレッドシートのA列に書き込まれます。
JSONデータを扱う場合(API型サイト)
APIでデータを提供しているサイト(例:Yahoo!ファイナンス・OpenWeatherなど)は、
JSON形式で取得する方が正確で効率的です。
function getJsonData() {
const url = 'https://api.exchangerate-api.com/v4/latest/USD';
const response = UrlFetchApp.fetch(url);
const json = JSON.parse(response.getContentText());
const rate = json.rates.JPY;
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('為替');
sheet.getRange('B2').setValue(rate);
}
このように、為替レートや気温などのAPI情報も1行で取得・書き込みできます。
定期実行で自動更新を実現する
データ取得を自動化するには、時間主導トリガーを設定します。
手順(GASエディタ上で設定)
- メニューから「トリガー」→「トリガーを追加」
- 対象関数:
getTitlesまたはgetJsonData - イベントの種類:「時間主導型」→「毎時」または「毎日」
- 保存
これでスクリプトが定期的に実行され、スプレッドシートが自動更新されます。
環境構築なしで始められる自動スクレイピング
GASの強みは、すべてブラウザ上だけで完結することです。
| 作業項目 | Pythonなどの通常環境 | GAS利用時 |
|---|---|---|
| 環境構築 | ライブラリ・API設定が必要 | 不要(ブラウザのみ) |
| データ保存先 | CSV・DB設定が必要 | スプレッドシートに即書き込み |
| 実行管理 | cron設定が必要 | トリガーで自動化可能 |
クラウド上で管理できるため、チーム共有やバックアップも容易。
特に小規模業務や個人利用では、コスパ最強の自動化手段といえます。
実践:複数サイトからデータを自動取得するサンプルコード
ひとつのサイトだけでなく、複数のサイトを対象にスクレイピングを行いたい場合は、
URLを配列として管理し、ループ処理で順番に取得していくのが効率的です。
以下の例は、複数のニュースサイトからタイトルを収集してスプレッドシートに書き込むコードです。
function scrapeMultiSite() {
const urls = [
'https://example-news.com/economy',
'https://example-news.com/it',
'https://example-news.com/international'
];
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ニュースまとめ');
sheet.clearContents(); // 前回データをクリア
let row = 1;
for (let i = 0; i < urls.length; i++) {
const response = UrlFetchApp.fetch(urls[i]);
const html = response.getContentText();
const pattern = /<h2 class="news-title">([\s\S]*?)<\/h2>/g;
let match;
while ((match = pattern.exec(html)) !== null) {
sheet.getRange(row, 1).setValue(urls[i]);
sheet.getRange(row, 2).setValue(match[1]);
row++;
}
}
}
このスクリプトをトリガー設定すれば、3つのニュースサイトの最新見出しが毎朝自動更新されます。
スクレイピングで注意すべき法律・マナー・技術的制約
Webスクレイピングは非常に便利ですが、全てのサイトで自由に行えるわけではありません。
法的・倫理的な側面にも注意が必要です。
1. 利用規約・robots.txtを確認
- 「データ取得禁止」や「自動アクセス禁止」が明記されているサイトではスクレイピング禁止。
- 公開APIがある場合は、そちらを利用するのが原則。
2. アクセス頻度の制御
サーバーに負荷をかけるような連続アクセスはNGです。
数秒の待機を入れることで、トラフィック負荷を回避できます。
Utilities.sleep(2000); // 2秒の間隔をあけて次のリクエスト
3. 商用利用や再配布の制限
取得したデータを自社サイトやアプリで再配布する場合、
著作権・利用権の問題が発生する可能性があります。
利用範囲が「個人・社内利用」に留まるようにしましょう。
トラブルが起きたときの対処法
スクリプトが途中で止まる
Google Apps Scriptには実行時間の制限(6分)があるため、
長時間実行する場合はURLを分割して複数のスクリプトに分けるのが効果的です。
if (i % 10 === 0) Utilities.sleep(3000); // 10サイトごとに3秒休止
データが途中で空欄になる
Webページの構造(HTMLタグ)が変化した場合、正規表現が合わなくなることがあります。
この場合は、Chromeの**「検証ツール」→「要素をコピー」**でタグを再確認して修正しましょう。
自動更新が止まった
トリガーが無効化されている可能性があります。
GASの管理画面で「トリガー」タブを確認し、エラー内容をチェックしてください。
エラー原因をログに出力しておくのも有効です。
try {
// main process
} catch(e) {
Logger.log('Error: ' + e.message);
MailApp.sendEmail('youraddress@example.com', 'GASスクレイピングエラー', e.message);
}
上記のようにメール通知を設定しておけば、
エラー時にすぐ対応できる体制を作れます。
GASスクレイピングの応用:ChatGPT・Slack連携で業務自動化
GASは単体でも強力ですが、他のツールと組み合わせることでさらに便利になります。
1. ChatGPTとの連携(データ要約や要点抽出)
ニュースの本文を取得したあと、ChatGPT APIを呼び出して要約を生成し、
スプレッドシートに「タイトル+要約」を自動書き込みすることも可能です。
function summarizeWithChatGPT(text) {
const apiKey = 'YOUR_API_KEY';
const url = 'https://api.openai.com/v1/chat/completions';
const payload = {
model: 'gpt-4',
messages: [{ role: 'user', content: `次のニュースを3行で要約してください: ${text}` }]
};
const options = {
method: 'post',
headers: { Authorization: 'Bearer ' + apiKey },
contentType: 'application/json',
payload: JSON.stringify(payload)
};
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response.getContentText());
return json.choices[0].message.content;
}
→ ニュース監視・市場レポート作成・SNS投稿文生成など、
「スクレイピング+生成AI」で業務自動化の幅が一気に広がります。
2. Slack通知でチーム共有
取得データをSlackに自動通知することで、
チームメンバーがスプレッドシートを開かなくても新着情報を確認できます。
function notifySlack(message) {
const webhookUrl = 'YOUR_WEBHOOK_URL';
UrlFetchApp.fetch(webhookUrl, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify({ text: message })
});
}
→ 「朝9時に最新ニュースをSlackへ投稿」という運用もワンクリック設定で実現します。
GASと他言語(Python等)の比較
| 比較項目 | GAS | Python |
|---|---|---|
| コスト | 無料(Google環境) | 無料だが環境構築必要 |
| 実行環境 | クラウド(Google) | ローカルまたはクラウド |
| 自動化トリガー | 標準装備 | cron設定が必要 |
| スプレッドシート連携 | ネイティブ統合 | APIライブラリが必要 |
| 実行制限 | 約6分/回 | 制限なし(環境次第) |
→ 小規模・日常業務の自動化にはGAS、大量処理にはPythonが適しています。
今すぐ始められる行動ステップ
- 取得したいサイトをリストアップ
ニュース・株価・商品価格など、日々更新されるページを整理。 - HTML構造を調べて抽出ポイントを確認
「class名」「タグ名」「属性」などをメモ。 - GASで基本スクリプトを作成し、実行テスト
UrlFetchApp.fetch()でデータを取得できるか確認。 - スプレッドシートと接続
出力列やフォーマットを整えて保存先を指定。 - 時間トリガーを設定
自動更新スケジュール(毎時・毎日など)を設定。 - エラーログ・通知を整備
停止時に気づけるようメールやSlack通知を設定。
まとめ:Webスクレイピング×GASは「誰でもできる自動化」
- コード数十行で実現できる:HTMLやAPIを自動取得し、手動更新をゼロに。
- Google環境で完結:ブラウザ上で開発・実行・共有可能。
- トリガー設定で完全自動化:毎朝の情報更新を放置運用。
- AI・Slack連携で応用無限大:業務の“情報収集フェーズ”を丸ごと自動化。
手作業でのデータ収集を卒業し、
「情報が自動で集まる仕組み」を構築して、業務効率を次のレベルへ進めましょう。

