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

Google Sheets Apps Script联动Discord嵌入消息报错排查求助

问题排查与解决方案

错误1: Message is empty or contains 'undefined'. No request sent.

  • 原因:当前编辑的工作表不是Sheet2,触发了else分支的日志输出;或者H/I/J列对应行存在空值,模板字符串拼接后出现undefined。
  • 解决:
    1. 确认编辑操作发生在Sheet2,若需监听其他工作表,修改sheetName === "Sheet2"的判断条件。
    2. 处理空值:拼接字段名时添加兜底逻辑,比如data[i][column1] || "无数据",避免出现undefined。

错误2: TypeError: Cannot read properties of undefined (reading 'getSheet')

  • 原因:
    • 手动直接运行onEdit函数,未传入事件对象e,导致e.range为undefined;
    • 触发器类型错误(比如用了时间驱动触发器而非可安装的变更触发器),事件对象缺失。
  • 解决:
    1. 禁止手动运行onEdit,需通过表格编辑触发;测试时可构造事件对象:
      function testOnEdit() {
        const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
        const range = sheet.getRange("H4");
        onEdit({range: range});
      }
      
    2. 替换简单触发为可安装的 onChange 触发器:打开脚本编辑器→「编辑」→「当前项目的触发器」→添加触发器,选择函数为onEdit,事件源选「从电子表格」,事件类型选「更改」。

错误3: Exception: You are not allowed to call UrlFetchApp.fetch...

  • 原因:简单触发onEdit处于受限环境,无法调用需要外部权限的UrlFetchApp.fetch;生产表格权限控制更严格。
  • 解决:
    1. 必须使用可安装触发器替代简单触发,可安装触发器拥有完整权限,支持调用UrlFetchApp。
    2. 在脚本编辑器中点击「运行」→授权脚本,确保授予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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:42:24