Google Apps Scripts骰子机器人仅DM响应,房间内无响应如何解决?
Google Chat骰子机器人房间无响应问题排查与解决
我之前也碰到过Google Chat机器人在房间里不响应的情况,结合你的描述和代码场景,咱们从这几个方向排查解决:
一、先检查权限配置是否到位
Google Chat机器人的权限是核心,哪怕你在功能设置里勾选了房间和DM选项,权限范围不对也会出问题:
- 打开你的Apps Script项目,查看
appsscript.json(如果没显示,点击右上角的"设置"图标,勾选"显示appsscript.json清单文件"),确保oauthScopes里包含https://www.googleapis.com/auth/chat.bot——这是机器人接收和发送消息的必备权限。示例配置:
"oauthScopes": [ "https://www.googleapis.com/auth/chat.bot" ]
- 另外,确认Google Cloud Console中关联的项目里,OAuth consent screen已经把这个权限范围添加进去(如果是内部团队使用,直接发布即可;外部用户使用需要提交审核)。
二、验证消息触发函数是否正确
你能收到onAddToSpace()的消息,说明空间添加的触发没问题,但消息处理的触发可能有疏漏:
- 确保你的消息处理函数是
onMessage(e),函数签名要正确,参数e是Chat传递的事件对象。如果你用了自定义函数名,必须在manifest的chat字段里显式指定,比如:
"chat": { "eventTrigger": { "function": "你的自定义消息处理函数名" } }
- 打开Apps Script的"执行记录"页面,看看当你在房间发消息时,有没有
onMessage函数的执行记录。如果没有,说明触发没生效;如果有错误日志,直接根据报错信息修复(比如语法错误、权限不足等)。
三、检查响应格式是否符合Chat要求
Google Chat对机器人的响应格式有严格要求,返回内容不符合规范就会显示"Not Responding":
- 必须返回一个包含
text或cardsV2字段的对象,不能直接返回字符串。比如错误写法:return "掷出了6点";,正确写法:return {text: "掷出了6点"}; - 如果你的代码里有异步操作(比如调用外部API),一定要用同步方式处理,因为Apps Script的触发器是同步执行的,异步回调会导致函数提前返回空值。
四、调整房间消息监听设置
默认情况下,Google Chat机器人在房间里可能需要被@才能触发响应,你可以通过manifest配置取消这个限制:
- 在
appsscript.json的chat字段里添加"inviteOnly": false,这样机器人就能接收房间里的所有消息,不需要被@。完整的chat配置示例:
"chat": { "botWorksInRooms": true, "botWorksInDirectMessages": true, "inviteOnly": false, "addToSpaceFallbackMessage": "骰子机器人已加入房间!输入指令开始掷骰子~" }
五、重新部署机器人
有时候部署缓存会导致配置不生效,建议你重新部署一次:
- 进入Apps Script的"部署"页面,点击"管理部署",创建一个新的版本,选择"Chat bot"类型,设置为"活动"状态,然后重新添加到房间测试。
附:完整代码与manifest示例
给你一个经过验证的简化版骰子机器人代码,你可以参考调整自己的逻辑:
代码部分
/** * 机器人被添加到空间时的响应 * @param {Object} e Chat传递的事件对象 * @return {Object} 响应内容 */ function onAddToSpace(e) { return { text: "骰子机器人已上线!输入 `!roll` 掷1个6面骰,或者 `!roll 2d6` 掷2个6面骰~" }; } /** * 处理房间/私信中的消息 * @param {Object} e Chat传递的事件对象 * @return {Object} 响应内容 */ function onMessage(e) { const messageText = e.message.text.trim().toLowerCase(); let responseText = ""; // 处理掷骰子指令 if (messageText.startsWith("!roll")) { const dicePattern = /!roll (\d+d\d+)/; const match = messageText.match(dicePattern); if (match) { const [num, sides] = match[1].split("d").map(Number); let total = 0; const rolls = []; for (let i = 0; i < num; i++) { const roll = Math.floor(Math.random() * sides) + 1; rolls.push(roll); total += roll; } responseText = `你掷了${num}个${sides}面骰:${rolls.join(", ")},总和是${total}!`; } else { // 默认掷1个6面骰 const roll = Math.floor(Math.random() * 6) + 1; responseText = `你掷出了${roll}点!`; } } else { responseText = "我不知道这个指令哦~ 输入 `!roll` 来掷骰子试试!"; } return { text: responseText }; }
Manifest(appsscript.json)部分
{ "timeZone": "Asia/Shanghai", "dependencies": {}, "oauthScopes": [ "https://www.googleapis.com/auth/chat.bot" ], "chat": { "botWorksInRooms": true, "botWorksInDirectMessages": true, "inviteOnly": false, "addToSpaceFallbackMessage": "骰子机器人已加入房间!输入指令开始掷骰子~" }, "exceptionLogging": "STACKDRIVER" }
内容的提问来源于stack exchange,提问作者JD L
相关产品推荐
相关产品推荐

