前回の記事では、Google Apps Script(GAS)を使って、各URL先のページから「タイトル」と「メタディスクリプション(説明)」を取得する方法を紹介しました。
今回は、その応用として、より実用的な例を紹介します。
練習用のスクレイピングサイトBooks to Scrapeから「商品名」「価格」「在庫状況」などの情報を取得し、Googleスプレッドシートに自動で書き込むスクリプトを作成する方法をご紹介します。
サンプルプロジェクトの準備
今回のサンプルでは、スプレッドシートのA列に入力されたURLをもとに、各ページの「商品名」「価格」「在庫状況」を取得するようにしていきます。
そこで、まずサンプル用のGoogle スプレッドシートを作成し、A1:D4セルに下記を入力しておきます。
今回、A列に入力するURLはBooks to Scrape内の任意のページを選んでいます。必要に応じて適宜変更してください。
実際に、以下のようにスプレッドシートにデータを入力します。

続いて、Google Apps Scriptのスクリプトエディタを開いておきます。
Googleスプレッドシートのメニューバーの「拡張機能」を左クリックし、「Apps Script」を選択します。
「Apps Script」を選択すると、スクリプトエディタが新しいタブで開きます。


基本スクリプト作成
サンプルコード
以下のコードを、Google Apps Scriptのスクリプトエディタに貼り付けて、保存してください。
function scrapeBooksInfo() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var urls = sheet.getRange("A2:A").getValues().flat().filter(String);
urls.forEach((url, index) => {
var row = index + 2;
try {
var response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
var html = response.getContentText();
var productName = html.match(/<h1>(.*?)<\/h1>/i)?.[1] || "取得失敗";
var price = html.match(/<p class="price_color">(.*?)<\/p>/i)?.[1] || "取得失敗";
var availability = html.match(/<p class="instock availability">\s*<i.*?><\/i>\s*(.*?)\s*<\/p>/i)?.[1] || "取得失敗";
sheet.getRange(row, 2).setValue(productName);
sheet.getRange(row, 3).setValue(price);
sheet.getRange(row, 4).setValue(availability);
} catch (e) {
sheet.getRange(row, 2, 1, 3).setValue("取得エラー");
}
});
}
コードの解説
- スプレッドシートのデータ取得
var urls = sheet.getRange("A2:A").getValues().flat().filter(String);
A列のURLリストを取得し、配列に格納します。
- 各URLのページを取得
UrlFetchApp.fetch(url)
を使用して、対象ページのHTMLを取得します。
- 正規表現でデータを抽出
match()
メソッドを使用して、<h1>
(商品名)、<p class="price_color">
(価格)、<p class="instock availability">
(在庫状況)を取得。
- スプレッドシートに書き込む
sheet.getRange(row, 2).setValue(productName);
sheet.getRange(row, 3).setValue(price);
sheet.getRange(row, 4).setValue(availability);
各データを該当のセル(B列〜D列)に書き込みます。
- エラーハンドリング
- データが取得できなかった場合、
catch (e)
でエラーメッセージを記録します。
- データが取得できなかった場合、
正規表現について詳しく知りたい方は、こちらをご覧ください!
スクリプトの実行結果
それでは、スクリプトを実行していきます。
スクリプトエディターのメニューバーで「scrapeBooksInfo」が選択されていることを確認し、「実行」ボタンを左クリックします。

初めて実行する際には、スクリプトに対する権限の承認が求められる場合がありますので、承認してください。
「このアプリは Google で確認されていません」と表示された場合は左下の詳細をクリックすると、「無題のプロジェクト(安全ではないページ)に移動」というリンクが表示されます。
このリンクをクリックすると次のページへ遷移できます。

続いて、スクリプトの実行結果を確認します。
スクリプトが正常に実行されると、B列~D列に「商品名」「価格」「在庫状況」が入力されます。

定期実行スクリプトの作成
前項の応用編として、スクリプトを定期的に実行し、その実行日時と取得結果を毎回記録する方法をご紹介します。
サンプルコード
まずは、取得データに 「実行日時」 を追加し、別シートに毎回データを記録するようにコードを修正します。
function scrapeBooksInfo() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
var urls = sheet.getRange("A2:A").getValues().flat().filter(String);
var logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ログ");
if (!logSheet) {
logSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("ログ");
logSheet.appendRow(["実行日時", "URL", "商品名", "価格", "在庫状況"]);
}
var now = new Date();
var timestamp = Utilities.formatDate(now, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss");
urls.forEach((url, index) => {
var row = index + 2;
try {
var response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
var html = response.getContentText();
var productName = html.match(/<h1>(.*?)<\/h1>/i)?.[1] || "取得失敗";
var price = html.match(/<p class=\"price_color\">(.*?)<\/p>/i)?.[1] || "取得失敗";
var availability = html.match(/<p class=\"instock availability\">\\s*<i.*?><\/i>\\s*(.*?)\\s*<\/p>/i)?.[1] || "取得失敗";
// スプレッドシートに記録
sheet.getRange(row, 2).setValue(productName);
sheet.getRange(row, 3).setValue(price);
sheet.getRange(row, 4).setValue(availability);
// ログに記録
logSheet.appendRow([timestamp, url, productName, price, availability]);
} catch (e) {
sheet.getRange(row, 2, 1, 3).setValue("取得エラー");
logSheet.appendRow([timestamp, url, "取得エラー", "取得エラー", "取得エラー"]);
}
});
}
コードの解説
- 「ログ」シートの作成
var logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ログ");
「ログ」という名前のシートを取得します。- 「ログ」シートが存在しない場合は、
if (!logSheet){}
で「ログ」シートを新規作成します。
- 実行日時のフォーマット
Utilities.formatDate(now, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss")
で実行日時を整形します。
- スプレッドシートに書き込む
logSheet.appendRow([timestamp, url, productName, price, availability]);
「ログ」シートに行を追加し、取得した各データを書き込みます。
- エラーハンドリング
- 「ログ」シートに書き込むデータが取得できなかった場合、
logSheet.appendRow([timestamp, url, "取得エラー", "取得エラー", "取得エラー"]);
でエラーを記録します。
- 「ログ」シートに書き込むデータが取得できなかった場合、
スクリプト定期実行設定
Google Apps Scriptではトリガーを設定することで、スクリプトを自動実行させることができます。
この設定を入れることで、定期的にスクレイピングを実行し、「ログ」シートに新たな情報を追加していくことができます。
トリガー設定方法を詳しく知りたい方はこちらをご覧ください。
WEBスクレイピングの注意点
- 今回ご紹介したサンプルコードのURLや正規表現を変更することで、他のサイトのスクレイピングにも対応することが可能です。
他のサイトをスクレイピングする際には、サイトの利用規約を確認し、スクレイピングが許可されていることを確認してください。 - 過剰なリクエストを送らないように、適切な実行間隔に調整してください
まとめ
今回は、Google Apps Script(GAS)を使って、GoogleスプレッドシートにBooks to Scrapeの商品情報を自動取得する方法をご紹介しました。
正規表現を活用すれば、さまざまなWebページの情報をスクレイピングし、スプレッドシートに整理できます。
ぜひご自身のスプレッドシートでも試してみてください!
コメント