网站状态检查
电子表格设置
您的网站目前正常运行吗?如果您的网站出现故障,能收到通知岂不妙哉?让我们使用 Google Apps 脚本和 Google 表格,创建一个程序,每天检查您的网站列表,并在任何网站出现故障时向您发送电子邮件。
电子表格设置
- 创建一个新的电子表格。
- 将名为 Sheet1 的工作表重命名为Websites。
- 创建四列:
- 姓名
- 网址
- 地位
- 最后检查
- 定义您要检查的每个网站的名称和网址。脚本运行完成后,将填充“状态”和“上次检查”列。
脚本编辑器
让我们开始编写一些代码吧!Google 表格提供了一个方便的脚本编辑器。
注意:现在可以在扩展 > 应用脚本下找到脚本编辑器。
- 导航至工具 > 脚本编辑器。
- 脚本编辑器将包含一个启动函数。您可以删除所有代码。
- 导航至“文件”>“保存”。为脚本项目命名,然后选择“确定”。
检查网站状态
创建一个名为checkStatus的函数。该函数将从 Websites 工作表获取数据,并向每个网站发出请求,检查其状态。
function checkStatus() {
}
让我们继续向函数添加代码。创建一个名为sheet的变量。这将获取名为 Websites 的工作表并返回一个Sheet对象,该对象将提供我们需要的其他功能。
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Websites');
创建一个名为rows的变量。这是来自 Websites 工作表的数据行和列的数组。
var rows = sheet.getDataRange().getValues();
创建一个名为issues的变量。这将跟踪发现的问题数量。
var issues = 0;
行列数组中的第一个条目是列标题行。列标题并非真正需要。让我们使用shift函数将它们从数组中删除,该函数会删除数组中的第一个条目。
rows.shift();
每次运行 checkStatus 函数时,都应清除“状态”和“上次检查”列中的先前值和格式。创建一个从 C 列第 2 行开始到 D 列结束的范围,也就是说,直到 D 列有数据为止。使用clear函数清除所有内容。
sheet.getRange('C2:D').clear();
现在让我们循环遍历数据行。
for (var i = 0; i < rows.length; i++) {
}
为循环的每次迭代创建一个名为row的变量。row 实际上是列数组。第一列从 0 开始,因此 row[0] 将是名为 Name 的列,即网站的名称。
创建一个名为name的变量来存储该值。创建一个名为url的变量来存储网站的 URL,即 row[1]。
创建一个名为status的变量,其值为字符串 OK。创建一个名为color的变量,其值为十六进制颜色值 #bfb。如果状态为 OK,这将成为单元格的背景颜色。
创建一个名为timestamp的变量。这将提供检查运行的日期和时间。
var row = rows[i];
var name = row[0];
var url = row[1];
var status = 'OK';
var color = '#bfb';
var timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'M/d/Y h:m a');
如果单元格中存在某个url,则向该url发出请求,并保存响应代码。
如果响应代码不是 200(表示 OK),则将状态值从 OK 更改为 ISSUE。将颜色值从 #bfb 更改为 #faa(红色)。问题数量加 1。
使用状态和时间戳值更新状态和上次检查列,并设置背景颜色。
使用UrlFetchApp类的 fetch 函数时,存在速率限制。Google 不希望它在短时间内被过于频繁地调用。Google 建议添加 1 秒的延迟,以避免该限制。
if (url) {
var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
var responseCode = response.getResponseCode();
// There's an issue if the response code is greater than 200.
if (responseCode > 200) {
status = 'ISSUE';
color = '#faa';
issues++;
}
// Update Status and Last Check columns with results.
sheet.getRange(i + 2, 3, 1, 2).setValues([[status, timestamp]]).setBackground(color);
// There are rate limits when using UrlFetch so it's recommended to add a delay in between each request.
Utilities.sleep(1000);
}
发送电子邮件通知
我们不需要一直检查电子表格,而是创建一个名为“通知”的函数,它会发送一封电子邮件提醒我们发现了问题。
如果邮件客户端支持 HTML 格式邮件,则“电子表格”一词将作为返回电子表格的链接。如果邮件客户端不支持 HTML 格式邮件,则只会显示纯文本。
每天可发送的电子邮件数量是有限制的。
function notify() {
var recipient = Session.getEffectiveUser().getEmail();
var subject = 'Website Status Check: Issues Found';
var body = 'Check spreadsheet for issues found.';
var spreadsheetUrl = SpreadsheetApp.getActiveSpreadsheet().getUrl();
var html = '<p>Check <a target="_blank" href="' + spreadsheetUrl + '">spreadsheet</a> for issues found.';
var options = { htmlBody: html };
if (MailApp.getRemainingDailyQuota() > 0) {
MailApp.sendEmail(recipient, subject, body, options);
}
}
当循环完成后,我们检查问题数量是否大于0,如果有问题,则调用通知函数发送电子邮件。
if (issues > 0) {
notify();
}
自定义菜单
我们不要从脚本编辑器运行 checkStatus 函数,而是创建一个自定义菜单,以便我们可以从电子表格的菜单工具栏运行它!
创建自定义菜单的最佳时机是电子表格首次打开时。请使用onOpen触发器,该触发器会在电子表格首次打开时执行。
在电子表格中添加一个名为“管理”的自定义菜单。选择“管理”菜单将显示一个名为“检查状态”的菜单选项。选择“检查状态”将运行名为 checkStatus! 的函数。
function onOpen() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var menuOptions = [{
name: 'Check Status',
functionName: 'checkStatus'
}];
spreadsheet.addMenu('Manage', menuOptions);
}
基于时间的触发器
拥有一个运行脚本的自定义菜单固然不错,但这是一个手动过程。为了自动化这个过程,我们可以让脚本在基于时间的触发器上运行!
- 在脚本编辑器中,导航至编辑>当前项目的触发器。
- 选择添加触发器。
- 在“选择要运行的功能”字段中,选择 checkStatus。
- 在“选择事件源”字段中,选择时间驱动。
- 在“选择基于时间的触发器类型”字段中,选择日计时器。
- 在“选择一天中的时间”字段中,选择您想要运行脚本的时间范围。
- 在“失败通知设置”字段中,选择脚本运行失败时通知的频率。
最终代码
// Create custom menu when spreadsheet opens.
function onOpen() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var menuOptions = [{
name: 'Check Status',
functionName: 'checkStatus'
}];
spreadsheet.addMenu('Manage', menuOptions);
}
// Check status of each website in Websites sheet.
function checkStatus() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Websites');
var rows = sheet.getDataRange().getValues();
var issues = 0;
// Remove column headings row.
rows.shift();
// Clear Status and Last Check columns.
sheet.getRange('C2:D').clear();
// Loop through rows in sheet and make a request to website url.
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
var name = row[0];
var url = row[1];
var status = 'OK';
var color = '#bfb';
var timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'M/d/Y h:m a');
if (url) {
var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
var responseCode = response.getResponseCode();
// There's an issue if the response code is greater than 200.
if (responseCode > 200) {
status = 'ISSUE';
color = '#faa';
issues++;
}
// Update Status and Last Check columns with results.
sheet.getRange(i + 2, 3, 1, 2).setValues([[status, timestamp]]).setBackground(color);
// There are rate limits when using UrlFetch so it's recommended to add a delay in between each request.
Utilities.sleep(1000);
}
}
// Notify me if there are issues.
if (issues > 0) {
notify();
}
}
// Send email notification.
function notify() {
var recipient = Session.getEffectiveUser().getEmail();
var subject = 'Website Status Check: Issues Found';
var body = 'Check spreadsheet for issues found.';
var spreadsheetUrl = SpreadsheetApp.getActiveSpreadsheet().getUrl();
var html = '<p>Check <a target="_blank" href="' + spreadsheetUrl + '">spreadsheet</a> for issues found.';
var options = { htmlBody: html };
if (MailApp.getRemainingDailyQuota() > 0) {
MailApp.sendEmail(recipient, subject, body, options);
}
}
访问我们的网站https://nightwolf.dev并在Facebook和Twitter上关注我们!
鏂囩珷鏉ユ簮锛�https://dev.to/nightwolfdev/website-status-check-df