You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Google Sheet公式单元格更新触发Discord通知?

Google Sheet公式更新触发Discord通知解决方案

问题背景

Google Sheet中公式驱动的单元格更新不会触发默认的编辑类触发器(如onChange、onEdit),Zapier/IFTTT这类工具也无法捕获这类非手动更新。需要实现:当Sheet1的L列值发生变化(无论手动还是公式驱动)时,将变化内容发送至Discord。

解决方案

通过时间驱动触发器+历史值对比实现,核心是定期检查L列值,对比之前存储的历史数据,发现变化则发送通知。

修改后的完整代码

// 主函数:检查L列值变化并发送Discord通知
function checkLColumnChanges() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const targetSheet = ss.getSheetByName("Sheet1");
  const historySheet = ss.getSheetByName("History") || createHistorySheet(ss);

  // 获取Sheet1中L列的有效数据范围(跳过空行)
  const lColumnRange = targetSheet.getRange("L:L").getValues().filter(row => row[0] !== "");
  const currentValues = lColumnRange.map(row => row[0].toString());
  const lastRow = currentValues.length;

  // 获取History表中存储的历史值
  const historyValues = historySheet.getRange(1, 1, lastRow, 1).getValues().map(row => row[0].toString());

  // 对比当前值与历史值,找出变化项
  const changes = [];
  for (let i = 0; i < currentValues.length; i++) {
    if (currentValues[i] !== historyValues[i]) {
      // 记录行号(+1是因为数组索引从0开始,表格行从1开始)
      changes.push(`行${i+1}:旧值=${historyValues[i] || '空'},新值=${currentValues[i]}`);
    }
  }

  // 有变化则发送Discord通知
  if (changes.length > 0) {
    const webhookUrl = "YOUR_DISCORD_WEBHOOK_URL"; // 替换为你的Discord Webhook地址
    const message = `Sheet1的L列有更新:\n${changes.join("\n")}`;
    sendDiscordNotification(webhookUrl, message);

    // 更新History表的历史值
    historySheet.getRange(1, 1, lastRow, 1).setValues(currentValues.map(val => [val]));
    // 清除History表中多余的旧行(如果当前数据行数比之前少)
    const historyLastRow = historySheet.getLastRow();
    if (historyLastRow > lastRow) {
      historySheet.deleteRows(lastRow + 1, historyLastRow - lastRow);
    }
  }
}

// 创建History工作表用于存储历史值
function createHistorySheet(ss) {
  const newSheet = ss.insertSheet("History");
  // 隐藏工作表(可选,避免误编辑)
  newSheet.hideSheet();
  return newSheet;
}

// 发送消息到Discord Webhook
function sendDiscordNotification(webhookUrl, message) {
  const payload = { content: message };
  const options = {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify(payload)
  };
  UrlFetchApp.fetch(webhookUrl, options);
}

配置步骤

  1. 替换Webhook地址:将代码中的YOUR_DISCORD_WEBHOOK_URL替换为你的Discord频道Webhook URL。
  2. 创建History表:首次运行checkLColumnChanges函数时,脚本会自动创建并隐藏名为"History"的工作表,用于存储L列的历史值。
  3. 设置时间驱动触发器:
    • 打开Google Sheet的脚本编辑器(工具->脚本编辑器)
    • 点击左侧菜单的「触发器」图标
    • 点击「添加触发器」,配置如下:
      • 选择要运行的函数:checkLColumnChanges
      • 选择事件源:「时间驱动」
      • 选择时间类型:「分钟计时器」或「小时计时器」,根据需求设置间隔(比如每5分钟检查一次)
      • 保存触发器,授权脚本所需的权限

扩展到WhatsApp/Telegram

如果需要发送到WhatsApp或Telegram,只需修改sendDiscordNotification函数,替换为对应平台的API调用:

  • WhatsApp:使用WhatsApp Business API或第三方服务的Webhook,构造符合要求的payload发送请求。
  • Telegram:调用Telegram Bot API的sendMessage接口,传入Bot Token和聊天ID。

内容的提问来源于stack exchange,提问作者Wilbert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:21:01