HTTP サービスのステータスをチェックするために、スプレッドシートを通過するスクリプトを作成しました。URL のリストについては、それらがアップかダウンかをチェックします。スクリプトは 5 分ごとに時間駆動されます。
UrlFetchApp.fetch(url) から断続的な「予期しないエラー」エラーがまれに発生し、数秒後にリクエストを繰り返すと、DNS エラーとタイムアウト エラーが時々発生します。
誰かが助けてくれるなら、いくつかの実際の質問はありません: Utilities.sleep(5000) を使用して 5 秒間一時停止しましたが、それで問題ありませんか、それとも数秒後に待機して再度フェッチするより良い方法がありますか?
5 秒後にリクエストを繰り返しても「予期しないエラー」が発生するのはなぜですか?
以下のコードを改善するにはどうすればよいですか?
実際のスクリプト:
/*
Periodically check status of web sites :-)
Google Apps for Busines UrlFetch daily limit is 100.000 requests,
Algorithm
read site and old status from sheet
check site and set new status
if status changed send email (+sms in future by using twilio)
update status in spreadsheet
"Site, Status code, Time of last change, Last error description"
*/
function main() {
var sheet = SpreadsheetApp.getActiveSheet() ;
var currentRow, oldStatusCode, newStatusCode ;
var url, response, err, subject, message ;
var today = new Date() ;
currentRow = 2
while ((url = sheet.getRange(currentRow, 1).getValue()) != "") {
oldStatusCode = sheet.getRange(currentRow, 2).getValue() ;
newStatusCode = "Ok"
subject = "mCheck: " + url + " Up Status Change!" ;
message = url + " Up Status Change!" + "\n Time: " + today.toUTCString() ;
var tries = 3 ; // Check at least three times that status changed and it is not a one time glitch
do {
try {
response = UrlFetchApp.fetch(url) ;
} catch (err) {
newStatusCode = "Down"
sheet.getRange(currentRow, 4).setValue(err.message) ;
subject = "mCheck: " + url + " Down Status Change!" ;
message = url + " Down Status Change!" + "\n Error message: " + err.message + "\n Time: " + today.toUTCString() ;
if (err.message.indexOf("Unexpected") > -1) { // If UrlFetch failed on Google side just ignore this iteration...
newStatusCode = oldStatusCode ;
}
}
if (oldStatusCode != newStatusCode) { // In case of status change wait 5 seconds before trying again
Utilities.sleep(5000) ;
}
--tries ;
} while ((oldStatusCode != newStatusCode) && tries >= 0)
if (oldStatusCode != newStatusCode) {
sheet.getRange(currentRow, 2).setValue(newStatusCode) ;
sheet.getRange(currentRow, 3).setValue(today.toUTCString()) ;
if (oldStatusCode != "") {
MailApp.sendEmail(email_to, subject, message) ;
}
}
++currentRow;
}
}