Google表格脚本无法通过<@UserID>获取Discord全局用户名求助
问题排查与修复方案
核心问题分析
你的代码存在几个关键逻辑错误和环境限制,导致功能失效:
- 工作表判断逻辑颠倒:当前代码仅在非
Feuille1/Feuille2的工作表中执行,但你大概率是想在这两个表内处理输入。 - 遍历所有工作表的无效操作:编辑事件仅发生在单个工作表,遍历所有表会导致在无关工作表的同一行写入内容,属于错误逻辑。
- UserID解析条件错误:代码中用了转义字符
<@和>匹配,但谷歌表格中输入的是原始的<@和>,导致无法正确提取UserID。 - Discord API兼容性问题:新的Discord用户不再有
discriminator(标签号),需兼容global_name字段。 - 简单触发器权限限制:
onEdit作为简单触发器无法调用UrlFetchApp(需要授权),必须改用可安装触发器。
修复后的完整代码
const DISCORD_BOT_TOKEN = 'MY TOKEN'; function getDiscordUsername(userID) { if (typeof userID !== 'string' || userID.trim() === '') { return 'Invalid UserID'; } // 匹配原始的<@UserID>格式,无需转义 if (userID.startsWith('<@') && userID.endsWith('>')) { userID = userID.slice(2, -1); } else if (userID.startsWith('@')) { userID = userID.slice(1); } const url = `https://discord.com/api/v10/users/${userID}`; const options = { method: 'get', headers: { Authorization: `Bot ${DISCORD_BOT_TOKEN}` } }; try { const response = UrlFetchApp.fetch(url, options); if (response.getResponseCode() === 200) { const json = JSON.parse(response.getContentText()); // 优先返回全局用户名,兼容无标签号的新用户 return json.global_name || `${json.username}${json.discriminator ? '#' + json.discriminator : ''}`; } else { return 'User not found'; } } catch (e) { console.error('请求错误:', e); return 'Error fetching user'; } } function handleSheetEdit(e) { if (!e || !e.range) { console.error('无有效编辑事件或范围'); return; } const activeSheet = e.range.getSheet(); const sheetName = activeSheet.getName(); // 仅在指定工作表内处理 if (sheetName !== 'Feuille1' && sheetName !== 'Feuille2') { return; } // 仅处理第一列的输入(假设UserID输入在A列) if (e.range.getColumn() !== 1) { return; } const userID = e.value; if (userID) { const username = getDiscordUsername(userID); // 在同一行的第二列写入结果 activeSheet.getRange(e.range.getRow(), 2).setValue(username); } }
后续配置步骤
- 替换令牌:将
MY TOKEN替换为你的Discord机器人令牌。 - 创建可安装触发器:
- 打开谷歌表格的脚本编辑器,点击左侧「触发器」图标。
- 点击「添加触发器」,选择函数
handleSheetEdit,事件类型选「从电子表格提交」→「编辑」,保存并完成授权。
- 验证机器人权限:确保你的Discord机器人已启用「服务器成员意图」和「特权服务器成员意图」(在Discord开发者平台的机器人设置中开启)。
内容的提问来源于stack exchange,提问作者LeZavgon
相关产品推荐
相关产品推荐

