2011年9月30日金曜日

Google Apps ScriptでWeb監視的なサムシング

会社の先輩によるとGoogle Apps Scriptが何やらすごいらしいので、
試しにWeb監視的なサムシングを作ってみました。

Googleスプレッドシートで新規にシートを作って、下記のような表を手打ちで作ります

URL メアド ステータス 更新日時 メールログ
http://xxxxxxx/ xxxx@yyy.com (空欄) (空欄) (空欄)


表ができたらツール→スクリプトエディタでエディタを開いて下記のようなスクリプトを書きます。
function checkUrl() {
  var sheet = SpreadsheetApp.openById("XXXXXXXXXXXXXXXXXXXXX");
  var child = sheet.getSheets()[0];
  var size = child.getMaxRows();
  
  // 1st row is url
  var urlList = child.getRange("A2:A" + size).getValues();
  // 2nd row is mail address to alert
  var mailList = child.getRange("B2:B" + size ).getValues();
  // 3rd row is status
  var statusCells = child.getRange("C2:C" + size );
  // 4th row is status
  var dateCells = child.getRange("D2:D" + size );
  // 5th row is log
  var logCells = child.getRange("G2:G" + size );
  
  var url = null;
  var line = 1;
  var time = new Date();
  while (url = urlList.shift()){
    //trim
    url = url.toString().replace(/^\s+|\s+$/g, "");
    if(url != ""){
      try{
        var response = UrlFetchApp.fetch(url);
        if(response.getResponseCode() == 200){
          statusCells.getCell(line, 1).setValue("OK");
        } else {
          throw (response.getResponseCode());    
        }
      } catch (e){
        statusCells.getCell(line, 1).setValue("Error: " + e.toString().substring(0, 100) + "...");
        errorMail(mailList[line - 1], logCells.getCell(line, 1), url, e);
      } finally {
        dateCells.getCell(line, 1).setValue(time);
      }
    }
    line++;
  }
}

function errorMail(mail, logCell, url, error){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var child = sheet.getSheets()[0];
  var size = child.getMaxRows();
  
  // 5th row is log
  var mailCells = child.getRange("G2:G" + size );
  try {
     MailApp.sendEmail(mail, "Web Check failed " + url, error);
  } catch (e){
     logCell.setValue("Error: " + e);
  } 
}
SpreadsheetApp.openByIdに指定するスプレッドシートのIDは一回下記スクリプトを実行してあげればその場で確認できます。
Browser.msgBox(SpreadsheetApp.getActiveSpreadsheet().getId());
最後にスクリプトエディタのウィンドウでトリガー→現在のスクリプトのトリガーで
[checkUrl] [Time Driven] [Minutes timer] [every 5 minutes]
とかって設定しておけば5分おきに1列目のURLを参照して200OKが帰ってこなかったら
2列目のメアドにアラートメールが送信されるっぽいです。

ものの30分くらいでできましたのでとりいそぎご報告まで

[追記] デバッグ中に何回かスクリプト実行に失敗しているのですが、今その失敗レポートが
「Google Apps スクリプト cloudbeat.js の失敗のまとめ」という件名のメールで
送信されてきました。なんというかスゴすぎですw

[追記 2011/10/18] スクリプトを毎分実行にして監視URLを5つ程度にしてみたところ、APIの呼び過ぎでエラーになりました^ ^; そらそうか…