如何让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); }
配置步骤
- 替换Webhook地址:将代码中的
YOUR_DISCORD_WEBHOOK_URL替换为你的Discord频道Webhook URL。 - 创建History表:首次运行
checkLColumnChanges函数时,脚本会自动创建并隐藏名为"History"的工作表,用于存储L列的历史值。 - 设置时间驱动触发器:
- 打开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
相关产品推荐
相关产品推荐

