网站状态检查电子表格设置

2025-06-10

网站状态检查

电子表格设置

您的网站目前正常运行吗?如果您的网站出现故障,能收到通知岂不妙哉?让我们使用 Google Apps 脚本和 Google 表格,创建一个程序,每天检查您的网站列表,并在任何网站出现故障时向您发送电子邮件。

电子表格设置

电子表格设置

  1. 创建一个新的电子表格。
  2. 将名为 Sheet1 的工作表重命名为Websites
  3. 创建四列:
    • 姓名
    • 网址
    • 地位
    • 最后检查
  4. 定义您要检查的每个网站的名称和网址。脚本运行完成后,将填充“状态”和“上次检查”列。

脚本编辑器

脚本编辑器

让我们开始编写一些代码吧!Google 表格提供了一个方便的脚本编辑器。

注意:现在可以在扩展 > 应用脚本下找到脚本编辑器。

  1. 导航至工具 > 脚本编辑器。
  2. 脚本编辑器将包含一个启动函数。您可以删除所有代码。
  3. 导航至“文件”>“保存”。为脚本项目命名,然后选择“确定”。

检查网站状态

创建一个名为checkStatus的函数。该函数将从 Websites 工作表获取数据,并向每个网站发出请求,检查其状态。

function checkStatus() {

}
Enter fullscreen mode Exit fullscreen mode

让我们继续向函数添加代码。创建一个名为sheet的变量。这将获取名为 Websites 的工作表并返回一个Sheet对象,该对象将提供我们需要的其他功能。

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Websites');
Enter fullscreen mode Exit fullscreen mode

创建一个名为rows的变量。这是来自 Websites 工作表的数据行和列的数组。

var rows = sheet.getDataRange().getValues();
Enter fullscreen mode Exit fullscreen mode

创建一个名为issues的变量。这将跟踪发现的问题数量。

var issues = 0;
Enter fullscreen mode Exit fullscreen mode

行列数组中的第一个条目是列标题行。列标题并非真正需要。让我们使用shift函数将它们从数组中删除,该函数会删除数组中的第一个条目。

rows.shift();
Enter fullscreen mode Exit fullscreen mode

每次运行 checkStatus 函数时,都应清除“状态”和“上次检查”列中的先前值和格式。创建一个从 C 列第 2 行开始到 D 列结束的范围,也就是说,直到 D 列有数据为止。使用clear函数清除所有内容。

sheet.getRange('C2:D').clear();
Enter fullscreen mode Exit fullscreen mode

现在让我们循环遍历数据行。

for (var i = 0; i < rows.length; i++) {

}
Enter fullscreen mode Exit fullscreen mode

为循环的每次迭代创建一个名为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');
Enter fullscreen mode Exit fullscreen mode

如果单元格中存在某个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);

}
Enter fullscreen mode Exit fullscreen mode

发送电子邮件通知

我们不需要一直检查电子表格,而是创建一个名为“通知”的函数,它会发送一封电子邮件提醒我们发现了问题。

如果邮件客户端支持 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);
  }

}
Enter fullscreen mode Exit fullscreen mode

当循环完成后,我们检查问题数量是否大于0,如果有问题,则调用通知函数发送电子邮件。

if (issues > 0) {
  notify();
}
Enter fullscreen mode Exit fullscreen mode

自定义菜单

我们不要从脚本编辑器运行 checkStatus 函数,而是创建一个自定义菜单,以便我们可以从电子表格的菜单工具栏运行它!

创建自定义菜单的最佳时机是电子表格首次打开时。请使用onOpen触发器,该触发器会在电子表格首次打开时执行。

在电子表格中添加一个名为“管理”的自定义菜单。选择“管理”菜单将显示一个名为“检查状态”的菜单选项。选择“检查状态”将运行名为 checkStatus! 的函数。

function onOpen() {

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  var menuOptions = [{
    name: 'Check Status',
    functionName: 'checkStatus'
  }];

  spreadsheet.addMenu('Manage', menuOptions);

}
Enter fullscreen mode Exit fullscreen mode

基于时间的触发器

基于时间的触发器

拥有一个运行脚本的自定义菜单固然不错,但这是一个手动过程。为了自动化这个过程,我们可以让脚本在基于时间的触发器上运行!

  1. 在脚本编辑器中,导航至编辑>当前项目的触发器。
  2. 选择添加触发器。
  3. 在“选择要运行的功能”字段中,选择 checkStatus。
  4. 在“选择事件源”字段中,选择时间驱动。
  5. 在“选择基于时间的触发器类型”字段中,选择日计时器。
  6. 在“选择一天中的时间”字段中,选择您想要运行脚本的时间范围。
  7. 在“失败通知设置”字段中,选择脚本运行失败时通知的频率。

最终代码

// 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);
  }

}
Enter fullscreen mode Exit fullscreen mode

访问我们的网站https://nightwolf.dev并在FacebookTwitter上关注我们

鏂囩珷鏉ユ簮锛�https://dev.to/nightwolfdev/website-status-check-df
PREV
8 个令人惊叹的即时按钮悬停效果
NEXT
什么是本地存储?如何使用它?