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

Google表格脚本无法通过<@UserID>获取Discord全局用户名求助

问题排查与修复方案

核心问题分析

你的代码存在几个关键逻辑错误和环境限制,导致功能失效:

  1. 工作表判断逻辑颠倒:当前代码仅在非Feuille1/Feuille2的工作表中执行,但你大概率是想在这两个表内处理输入。
  2. 遍历所有工作表的无效操作:编辑事件仅发生在单个工作表,遍历所有表会导致在无关工作表的同一行写入内容,属于错误逻辑。
  3. UserID解析条件错误:代码中用了转义字符&lt;@和&gt;匹配,但谷歌表格中输入的是原始的<@和>,导致无法正确提取UserID。
  4. Discord API兼容性问题:新的Discord用户不再有discriminator(标签号),需兼容global_name字段。
  5. 简单触发器权限限制: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);
  }
}

后续配置步骤

  1. 替换令牌:将MY TOKEN替换为你的Discord机器人令牌。
  2. 创建可安装触发器:
    • 打开谷歌表格的脚本编辑器,点击左侧「触发器」图标。
    • 点击「添加触发器」,选择函数handleSheetEdit,事件类型选「从电子表格提交」→「编辑」,保存并完成授权。
  3. 验证机器人权限:确保你的Discord机器人已启用「服务器成员意图」和「特权服务器成员意图」(在Discord开发者平台的机器人设置中开启)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:05:02