基于Google Forms回复在Discord中@指定角色的App Script问题
问题修复方案
问题1:重复发送Discord Embed
你大概率是把Discord消息发送代码放在了遍历表单回答字段的循环里,导致每处理一个字段就发一次消息,每次还追加内容。解决办法是:先在循环里把所有回答内容组装到Embed描述中,循环结束后再一次性发送消息。
问题2:始终@最后一个角色ID
这是因为if-else分支的逻辑有问题——要么变量在循环外被反复覆盖,要么没使用链式判断导致后续条件覆盖了之前的赋值。要确保匹配到对应游戏/团队时,立刻确定目标角色ID,且后续分支不会覆盖这个值。
修复后的完整代码示例
function onFormSubmit(e) { // 获取表单提交的回答数据 const responses = e.response.getItemResponses(); let embedContent = ""; let targetRoleId = ""; const discordWebhook = "你的Discord Webhook地址"; // 替换成实际Webhook URL // 遍历所有回答,组装Embed的描述内容 responses.forEach(item => { const question = item.getItem().getTitle(); const answer = item.getResponse(); embedContent += `**${question}**: ${answer}\n\n`; }); // 根据申请的游戏/团队匹配对应负责人角色ID // 假设表单中有一个名为「申请的游戏/团队」的问题 const selectedTeam = responses.find(res => res.getItem().getTitle() === "申请的游戏/团队").getResponse(); if (selectedTeam === "游戏A") { targetRoleId = "角色ID1"; } else if (selectedTeam === "游戏B") { targetRoleId = "角色ID2"; } else if (selectedTeam === "团队C") { targetRoleId = "角色ID3"; } else { targetRoleId = "默认通知角色ID"; // 未匹配到的 fallback } // 构建Discord Embed消息体 const payload = { content: `<@&${targetRoleId}>`, // 正确@目标角色 embeds: [ { title: "新招募申请通知", description: embedContent, color: 3066993, // 可选:自定义Embed颜色 timestamp: new Date().toISOString() } ] }; // 仅发送一次Discord消息 const requestOptions = { method: "post", contentType: "application/json", payload: JSON.stringify(payload) }; UrlFetchApp.fetch(discordWebhook, requestOptions); }
关键修复点说明
- 解决重复发送Embed:将
UrlFetchApp.fetch()调用移至遍历回答的循环之外,确保所有内容组装完成后只发送一次消息。 - 解决角色@错误:
- 单独提取「申请的游戏/团队」的回答,避免在循环中反复判断导致变量被覆盖。
- 使用
else if链式判断,确保只有第一个匹配的条件会赋值角色ID,不会被后续分支覆盖。 - 拆分内容组装和角色匹配逻辑,避免两者互相干扰。
内容的提问来源于stack exchange,提问作者Luhruk
相关产品推荐
相关产品推荐

