Google Sheets Apps Script联动Discord嵌入消息报错排查求助
问题排查与解决方案
错误1: Message is empty or contains 'undefined'. No request sent.
- 原因:当前编辑的工作表不是
Sheet2,触发了else分支的日志输出;或者H/I/J列对应行存在空值,模板字符串拼接后出现undefined。 - 解决:
- 确认编辑操作发生在
Sheet2,若需监听其他工作表,修改sheetName === "Sheet2"的判断条件。 - 处理空值:拼接字段名时添加兜底逻辑,比如
data[i][column1] || "无数据",避免出现undefined。
- 确认编辑操作发生在
错误2: TypeError: Cannot read properties of undefined (reading 'getSheet')
- 原因:
- 手动直接运行
onEdit函数,未传入事件对象e,导致e.range为undefined; - 触发器类型错误(比如用了时间驱动触发器而非可安装的变更触发器),事件对象缺失。
- 手动直接运行
- 解决:
- 禁止手动运行
onEdit,需通过表格编辑触发;测试时可构造事件对象:function testOnEdit() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); const range = sheet.getRange("H4"); onEdit({range: range}); } - 替换简单触发为可安装的 onChange 触发器:打开脚本编辑器→「编辑」→「当前项目的触发器」→添加触发器,选择函数为
onEdit,事件源选「从电子表格」,事件类型选「更改」。
- 禁止手动运行
错误3: Exception: You are not allowed to call UrlFetchApp.fetch...
- 原因:简单触发
onEdit处于受限环境,无法调用需要外部权限的UrlFetchApp.fetch;生产表格权限控制更严格。 - 解决:
- 必须使用可安装触发器替代简单触发,可安装触发器拥有完整权限,支持调用
UrlFetchApp。 - 在脚本编辑器中点击「运行」→授权脚本,确保授予
https://www.googleapis.com/auth/script.external_request权限。
- 必须使用可安装触发器替代简单触发,可安装触发器拥有完整权限,支持调用
优化后的完整代码
function onEdit(e) { // 拦截空事件对象,避免手动运行报错 if (!e || !e.range) { Logger.log("请通过表格编辑触发,或使用testOnEdit测试"); return; } const discordUrl = "MYWEBHOOK_URL"; const range = e.range; const sheet = range.getSheet(); const sheetName = sheet.getName(); // 仅处理Sheet2的编辑 if (sheetName !== "Sheet2") { Logger.log("当前工作表非目标表,跳过发送"); return; } // 直接获取H/I/J列的数组索引,避免重复调用getRange const columnH = 7; // H列是第8列,数组索引减1 const columnI = 8; const columnJ = 9; const data = sheet.getDataRange().getValues(); const arrmessage = []; // 从第4行开始遍历(对应数组索引i=3) for (let i = 3; i < data.length; i++) { const hVal = data[i][columnH] || "无数据"; const iVal = data[i][columnI] || "无数据"; const jVal = data[i][columnJ] || "无数据"; // 仅当I或J列有有效内容时添加字段 if (iVal !== "无数据" || jVal !== "无数据") { arrmessage.push( { name: hVal, value: "", inline: true }, { name: iVal, value: "", inline: true }, { name: jVal, value: "", inline: true } ); } } // 空消息拦截 if (arrmessage.length === 0) { Logger.log("无有效内容,跳过发送"); return; } const options = { method: "post", contentType: "application/json", muteHttpExceptions: true, payload: JSON.stringify({ content: "Here it is", embeds: [ { color: 16711680, title: "Best player", fields: arrmessage, footer: { text: "TRN CLNX" } } ] }) }; try { const response = UrlFetchApp.fetch(discordUrl, options); Logger.log(`发送成功,响应状态:${response.getResponseCode()}`); } catch (error) { Logger.log(`发送失败:${error.toString()}`); } } // 测试用函数 function testOnEdit() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); const range = sheet.getRange("H4"); // 模拟编辑H4单元格 onEdit({ range: range }); }
内容的提问来源于stack exchange,提问作者LeCras
相关产品推荐
相关产品推荐

