Skip to content

Instantly share code, notes, and snippets.

@y16ra
Last active January 19, 2016 04:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save y16ra/0e677cf42754788fd021 to your computer and use it in GitHub Desktop.
Save y16ra/0e677cf42754788fd021 to your computer and use it in GitHub Desktop.
URL Monitoring using Google AppsScript
/**
* スプレッドシートに記載したURLの外形監視を実行する。
* 指定されたURLに接続してステータスコードが200以外の場合メールで通知する。
* また、前回の実行時に200以外のステータスコードだった場合で、
* ステータスが200になった場合は復旧メールを送信する。
* スプレッドシートの項目は、サービス名, 監視対象URL, ステータス, emails(10個まで) とする。
*/
function monitoring() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var current_sheet = spreadsheet.getActiveSheet();
for (var i = 2; i <= current_sheet.getLastRow(); i++) {
var url = current_sheet.getRange(i, 2).getValue();
var status_code = check_server(url);
if(status_code != 200) {
var subject = '[ERROR] URL監視アラート : ' + current_sheet.getRange(i, 1).getValue();
var mail_body = 'サーバでエラーコードが検知されました。サーバの状況を確認してください。\n'
+ '[' + status_code + ']' + url;
send_mail(i, subject, mail_body);
current_sheet.getRange(i, 3).setValue(status_code);
} else {
var pre_status = current_sheet.getRange(i, 3).getValue();
if (pre_status != 200) {
var subject = '[OK] URL監視アラート : ' + current_sheet.getRange(i, 1).getValue();
var mail_body = '復旧しました。\n' + url + ' [' + pre_status + '] -> [200]';
send_mail(i, subject, mail_body);
}
current_sheet.getRange(i, 3).setValue(status_code);
}
}
}
/**
* メールを送信する。
*
* @param {int} index スプレッドシートの行
* @param {string} subject メールの件名
* @param {string} body メールの本文
*/
function send_mail(index, subject, body) {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var current_sheet = spreadsheet.getActiveSheet();
var emails = current_sheet.getSheetValues(index, 4, 1, 10);
var to = '';
for (var j=0; j<emails[0].length; j++) {
if (emails[0][j] != '') {
to += emails[0][j] + ',';
}
}
MailApp.sendEmail(to, subject, body);
}
/**
* URLに接続してステータスコードを取得する。
* @param {string} 接続先のURL
* @return {int} HTTPステータスコード。接続に失敗した場合は999を返す。
*/
function check_server(url) {
try {
var res = UrlFetchApp.fetch(url);
return res.getResponseCode();
} catch(e) {
return 999;
}
}
function onOpen() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "監視を実行する",
functionName : "monitoring"
}];
spreadsheet.addMenu("Monitoring", entries);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment