Google Sheets脚本问题:匹配今日日期并发送值班信息至Slack
Google Sheets 自动发送当日值班信息到Slack的问题
我的Google Sheets表格结构如下:
| Data | On Duty | Support |
|---|---|---|
| 15/02/2023 | Name1 | Name4 |
| 16/02/2023 | Name2 | Name5 |
| 17/02/2023 | Name3 | Name6 |
需求:检查Data列中是否存在与今日日期匹配的行,获取对应On Duty和Support列的值并发送到Slack频道。
我尝试了以下代码但无法运行:
function sendSlackMessage() { const onduty = QUERY("SELECT B WHERE todate(A)=date'" & text(today(), "dd/MM/yyyy") &"'"); const support = QUERY("SELECT C WHERE todate(A)=date'" & text(today(), "dd/MM/yyyy") &"'"); const url = "https://hooks.slack.com/services/xxxxxx/xxxxxxx/xxxxxxxxxxxxxxxxxxxxxx"; const params = { method: "post", contentType: "application/json", payload: JSON.stringfy({ "text" : "Analyst on duty today: " + onduty + "\n" + "Support analyst: " + support }) } const sendMsg = UrlFetchApp.fetch(url, params); var respCode = sendMsg.getResponseCode(); Logger.log(sendMsg); Logger.log(respCode); }
问题分析与修正代码
原代码存在几个关键错误:
- 直接在Apps Script中使用
QUERY、today()、text()等工作表函数,这些函数仅能在表格单元格中使用,不能直接在脚本中调用 JSON.stringfy拼写错误,正确写法是JSON.stringify- 未获取工作表对象,无法读取表格数据
修正后的代码如下:
function sendSlackMessage() { // 获取当前活动工作表 const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 获取表格中所有数据(包含表头) const allData = sheet.getDataRange().getValues(); // 将今日日期格式化为与表格一致的dd/MM/yyyy字符串 const todayStr = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd/MM/yyyy"); let onDutyName = "未找到今日值班人员"; let supportName = "未找到今日支持人员"; // 遍历数据行(跳过第一行表头) for (let i = 1; i < allData.length; i++) { const rowDate = Utilities.formatDate(new Date(allData[i][0]), Session.getScriptTimeZone(), "dd/MM/yyyy"); if (rowDate === todayStr) { onDutyName = allData[i][1]; // 取On Duty列的值(第二列,索引1) supportName = allData[i][2]; // 取Support列的值(第三列,索引2) break; // 找到匹配行后终止循环 } } const slackWebhookUrl = "https://hooks.slack.com/services/xxxxxx/xxxxxxx/xxxxxxxxxxxxxxxxxxxxxx"; const requestParams = { method: "POST", contentType: "application/json", payload: JSON.stringify({ text: `今日值班分析师: ${onDutyName}\n支持分析师: ${supportName}` }) }; try { const response = UrlFetchApp.fetch(slackWebhookUrl, requestParams); Logger.log("发送成功,响应内容: " + response.getContentText()); Logger.log("响应码: " + response.getResponseCode()); } catch (error) { Logger.log("发送失败,错误信息: " + error.toString()); } }
修正说明
- 通过
SpreadsheetAppAPI获取工作表和数据,替代无效的工作表函数调用 - 使用
Utilities.formatDate统一日期格式,确保匹配逻辑准确 - 修正
JSON.stringify拼写错误 - 添加循环遍历查找匹配日期,获取对应列的值
- 增加异常处理,捕获发送请求时的错误并记录日志
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

