如何为Google Sheet公式更新设置通知并推送至Discord等平台?
解决Google Sheet公式自动更新的通知问题
一、实现不受编辑类型限制的更新通知
Google Sheets自带通知、Zapier/IFTTT这类工具大多只响应手动编辑,要监控公式自动更新的数值变化,最可靠的方案是用Google Apps Script自定义监控逻辑,具体步骤如下:
- 打开目标Google Sheet,点击「扩展程序」→「Apps Script」进入脚本编辑器
- 替换默认代码为以下脚本,它会存储单元格旧值,对比每次变化(包括公式更新)并触发通知:
// 存储旧值的属性键 const OLD_VALUE_KEY = "sheetOldValues"; // 初始化:存储当前值并创建触发器 function setup() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const range = sheet.getDataRange(); // 可改为指定范围如getRange("A1:Z100")缩小监控范围 const values = range.getValues(); PropertiesService.getScriptProperties().setProperty(OLD_VALUE_KEY, JSON.stringify(values)); // 创建onChange触发器,捕捉表格的各类变化(包括公式更新) ScriptApp.newTrigger("checkForChanges") .forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet()) .onChange() .create(); } // 检查单元格值变化并发送通知 function checkForChanges() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const range = sheet.getDataRange(); const currentValues = range.getValues(); const oldValues = JSON.parse(PropertiesService.getScriptProperties().getProperty(OLD_VALUE_KEY) || "[]"); // 对比新旧值,收集变化记录 let changes = []; for (let i = 0; i < currentValues.length; i++) { for (let j = 0; j < currentValues[i].length; j++) { if (currentValues[i][j] !== oldValues[i]?.[j]) { changes.push({ row: i + 1, col: String.fromCharCode(64 + j + 1), // 转换为列字母(A、B...) oldValue: oldValues[i]?.[j] || "", newValue: currentValues[i][j] }); } } } if (changes.length === 0) return; // 生成通知内容 let message = "Google Sheet更新通知:\n"; changes.forEach(change => { message += `单元格${change.col}${change.row}: 从「${change.oldValue}」变为「${change.newValue}」\n`; }); // 发送到目标平台(根据需求启用对应函数) sendToDiscord(message); sendToTelegram(message); sendToWhatsApp(message); // 更新存储的旧值,用于下次对比 PropertiesService.getScriptProperties().setProperty(OLD_VALUE_KEY, JSON.stringify(currentValues)); }
- 先运行
setup函数,按提示完成权限授权(第一次运行需要允许脚本访问你的表格) - 此后表格内任何单元格值变化(包括公式自动计算更新)都会触发检查和通知
二、推送到Discord、Telegram、WhatsApp的实现
1. 推送到Discord
- 打开Discord服务器设置→「集成」→「Webhook」,新建Webhook并复制其URL
- 在脚本中添加以下函数(替换成你的Webhook URL):
function sendToDiscord(message) { const webhookUrl = "你的Discord Webhook URL"; const payload = { content: message }; UrlFetchApp.fetch(webhookUrl, { method: "post", contentType: "application/json", payload: JSON.stringify(payload) }); }
2. 推送到Telegram
- 给Telegram的@BotFather发送消息创建机器人,获取机器人的API Token
- 给你的机器人发送一条测试消息,通过Telegram API的
getUpdates接口获取你的Chat ID - 在脚本中添加以下函数(替换成你的Token和Chat ID):
function sendToTelegram(message) { const botToken = "你的Telegram机器人API Token"; const chatId = "你的Chat ID"; const url = `https://api.telegram.org/bot${botToken}/sendMessage?chat_id=${chatId}&text=${encodeURIComponent(message)}`; UrlFetchApp.fetch(url); }
3. 推送到WhatsApp
- 注册Twilio账号,获取账号SID、Auth Token,并绑定一个WhatsApp号码作为发送方
- 在脚本中添加以下函数(替换成你的Twilio信息和接收方号码):
function sendToWhatsApp(message) { const accountSid = "你的Twilio账号SID"; const authToken = "你的Twilio Auth Token"; const fromNumber = "whatsapp:+你的Twilio绑定号码"; const toNumber = "whatsapp:+接收者手机号码"; const url = `https://api.twilio.com/2010-04-01/Accounts/${accountSid}/Messages.json`; const payload = { From: fromNumber, To: toNumber, Body: message }; UrlFetchApp.fetch(url, { method: "post", headers: { Authorization: "Basic " + Utilities.base64Encode(accountSid + ":" + authToken) }, payload: payload }); }
注意事项
- 若表格数据量较大,建议将
getDataRange()改为指定监控范围(如getRange("A1:Z100")),避免脚本执行超时 - 各个平台的API需确保权限正确:Discord Webhook要允许发送消息,Telegram机器人需加入目标聊天,Twilio需完成WhatsApp号码验证
- 如果
onChange触发器无法覆盖部分实时公式更新场景,可添加时间驱动触发器(如每分钟检查一次)补充监控
内容的提问来源于stack exchange,提问作者Wilbert
相关产品推荐
相关产品推荐

