GAS(Google Apps Script)で定期的に値を記録するプログラムを作ってみた


1.はじめに

Googleスプレッドシートで、あるサイトのある特定の値をXPathで抽出しておき、その値をGAS(Google Apps Script)で、定期的(1時間置きに)にGoogleスプレッドシートの別シートに記録していくというプログラムを作ってみます。

※サンプルとして、あるAm〇zonギフト券販売サイトの値を監視するプログラムを書いてますが、アクセスが集中するなどご迷惑をお掛けると良くないので、どこのサイトかという事まではここでは書かないことにしておきます。

2.GoogleスプレッドシートでWEBページの特定の値を表示

・スプレッドシートの「A1」セルに対象のWEBページのURLを記載
・4行目以降に、そのWEBページの中で特定の値がセル上に書かれるようにする。
 -「=IMPORTXML(URLのセルを指定, XPath) 」で取得

3.GASでGoogleスプレッドシートを読んで、別シートに記録する

・Googleスプレッドシートには、記録用の別シート「履歴」を作っておくこと
・GoogleスプレッドシートのURLから、ID部分を記録しておくこと

なお、ID部分というのは、GoogleスプレッドシートのURLの↓の部分になります。
https://docs.google.com/spreadsheets/d/[ID部分]/edit#gid=337972102

code.gs
//取得するスプレッドシートを指定。スプレッドシートのURLのID部分を指定する。
var ssFile = SpreadsheetApp.openById("**GoogleスプレッドシートのIDを指定**");
//値を取得する対象のシートを指定
var baseSheet = ssFile.getSheetByName("取得シート"); 
//記録するシートを指定
var saveSheet = ssFile.getSheetByName("履歴");

//定期的に実行させる関数
function MainFrame() {
  //「取得シート」の4行目1列目から、1行分3列分のセル(つまり4行目の3セル分を取得)
  var array = baseSheet.getRange(4,1,1,3).getValues()[0];
  //今の日時を取得して指定したフォーマットに変換
  var date = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm');
  array.unshift(date);

  //最終行に配列データを追加で記録する
  saveSheet.appendRow(array);
}

4.定期的に記録

『GAS(Google Apps Script)でHelloWorldしてみた(①バッチプログラム編)』の5章」で書いたような感じで、トリガーで「MainFrame」関数を1時間に1回動作するように設定します。

履歴が溜まってくると、こんな感じになります。

※↑のグラフはGoogleスプレッドシートの機能で表示させてるだけです。

5.ところが、一箇所思い通りに行かない点が(※後から追記しました)

運用初めてからしばらく後でわかった事なのですが、「IMPORTXML」関数は、2時間に1回しか更新されない模様Σ(゚д゚lll)ガーン

どうしようかと考えた挙句、↓のようなコードで、毎回、「IMPORTXML」関数を削除してから、再度「IMPORTXML」関数を書き込むことで、そのときに新しく取得してくれることがわかりました。とりあえず、これでいいやっと。

  // 強制的に更新させるための処理
  baseSheet.deleteRows(4,1);
  baseSheet.getRange(4,1).setValue("=IMPORTXML(A1,\"//span[@class='fl bl']/text()\")");
  baseSheet.getRange(4,2).setValue("=IMPORTXML(A1,\"//span[@class='fl og']/text()\")");
  baseSheet.getRange(4,3).setValue("=IMPORTXML(A1,\"//span[@class='fl gr']/text()\")");

6.まとめ

おわかりいただけるように、こんな短いプログラムを書くだけで、便利なツールが出来てしまうのです。GASって超便利ですね!!
実は、個人的にAm〇zonギフト券の値段がいつ頃が安くなり易いのかを分析するために、履歴を見たかったのですが、無かったので、作ってしまったという次第なのです。。