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

Google Sheets Apps Script中onEdit无法调用postToDiscord函数求助

问题原因与解决方案

核心问题

onEdit是Google Apps Script的简单触发器,运行时无用户授权,无法调用UrlFetchApp这类需要权限的服务;同时你的Discord Webhook请求格式不符合要求,没有指定JSON类型的请求体,这两个问题共同导致触发时postToDiscord无响应。


分步解决

1. 替换为可安装触发器

简单触发器的权限限制无法绕过,必须创建可安装的编辑触发器:

  • 打开Google Sheets的脚本编辑器,点击左侧时钟形状的「触发器」图标。
  • 点击「添加触发器」,配置以下选项:
    • 选择运行函数:onEdit
    • 部署来源:从电子表格
    • 事件类型:编辑时
    • 保存并完成授权流程。

2. 修正代码逻辑与请求格式

修改后的完整代码如下:

function onEdit(e) {
  const range = e.range;
  const col = range.getColumn();
  const row = range.getRow();
  const sheet = range.getSheet();
  
  // 仅处理D列复选框勾选事件
  if (col !== 4 || e.value !== "TRUE") return;

  const draftContent = sheet.getRange(`C${row}`).getValue().trim();

  if (!draftContent) {
    Browser.msgBox("Empty draft!");
    return;
  }

  postToDiscord(draftContent);
  Browser.msgBox("审核请求已发送至Discord!");
}

function postToDiscord(draftContent) {
  const webhookUrl = "https://discord.com/api/webhooks/[你的完整Webhook URL]";
  
  // 构造符合Discord要求的消息体
  const message = {
    content: `新的帖子草稿需要审核:\n\n${draftContent}`
  };

  const options = {
    method: "post",
    contentType: "application/json", // 指定请求体为JSON格式
    payload: JSON.stringify(message)  // 将对象转为JSON字符串
  };

  try {
    UrlFetchApp.fetch(webhookUrl, options);
  } catch (error) {
    console.error("Discord发送失败:", error.message);
    Browser.msgBox(`发送失败:${error.message}`);
  }
}

3. 关键修改说明

  • 权限适配:可安装触发器使用你的账户权限运行,能正常调用UrlFetchApp。
  • 请求格式修正:添加contentType并将消息转为JSON字符串,匹配Discord Webhook的要求。
  • 错误捕获:新增try-catch块捕获请求异常,方便排查问题。
  • 逻辑优化:直接传递草稿内容到postToDiscord,让通知内容更实用。

测试验证

  1. 保存代码并确认可安装触发器已创建。
  2. 在D列勾选复选框:若C列为空,弹出"Empty draft!";若有内容,弹出发送成功提示,同时Discord频道会收到审核通知。
  3. 若发送失败,可通过脚本编辑器的「查看→日志」获取错误信息排查。

内容的提问来源于stack exchange,提问作者Thibaud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:48:10