Google Sheetsでスクレイピング結果を定期的に記録する

Google Docs表計算アプリであるGoogle Sheetsでは、Google Apps Scriptと呼ばれるJavaScriptベースのスクリプト言語でマクロを書くことができる。 また、Google Apps ScriptではTriggerと呼ばれる機能により特定の関数を定期的に実行することができる。

Google Apps Scriptで特定のページをスクレイピングし、その結果をスプレッドシートに新しい行として追記するスクリプトを書くと次のようになる。 ここではスクレイピング対象として、Amazonから商品の新品価格を取得している。

function main() {
  var date = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd');
  var value1 = getDataFromUrl('https://www.amazon.co.jp/dp/B00UJK322O', /新品の出品:\d+<\/a><span class='a-color-price'>¥ ([\d,]+)<\/span>より<\/span>/);
  addNewRow([date, value1]);
}

function addNewRow(values) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var firstEmptyRow = sheet.getLastRow() + 1;
  for (i=0; i<values.length; i++) {
    sheet.getRange(firstEmptyRow, i+1).setValue(values[i]);
  }
}

function getDataFromUrl(url, re) {
  var data = UrlFetchApp.fetch(url);
  var text = data.getContentText();
  Logger.log(text);
  return text.match(re)[1];
}

ここで、getDataFromUrl関数はURLと正規表現オブジェクトを引数に取り、正規表現の一つ目のキャプチャの内容を返す関数になっている。

あとは、Trigger機能でmain関数を定期的に実行するように設定すればよい。