如何用Google Apps Script实现Google Chat投票机器人消息更新?
Google Chat调查机器人消息更新问题解决方案
不需要额外创建thread_key来更新原消息,问题出在Card Action响应结构和消息更新的API请求方式上,具体修复方案如下:
1. 修正Card Action处理函数的返回结构
你的recordVote函数返回格式不符合Google Chat的消息更新要求,建议改用cardsV2(当前官方推荐的卡片格式),并指定固定cardId确保更新原卡片。同时无需手动指定thread字段,平台会自动从事件上下文关联原消息:
function recordVote(event) { const parameters = event.common?.parameters; const choice = parseInt(parameters['index']); const userId = event.user.name; const state = JSON.parse(parameters['state']); // 更新用户投票记录 state.votes[userId] = choice; const card = buildVoteCard(state); return { actionResponse: { type: 'UPDATE_MESSAGE', }, cardsV2: [ { cardId: 'survey-vote-card', // 固定卡片ID,确保更新原卡片 card: card } ] }; }
注意:buildVoteCard生成的卡片中,投票按钮的state参数必须是更新后的序列化JSON字符串,保证后续点击能获取最新投票状态。
2. 修正消息更新的API请求方式
你的sendPushMessage使用POST请求,这是创建新消息的接口。要更新已有消息,需改用PUT请求,并指定目标消息的唯一ID(格式为spaces/{spaceId}/messages/{messageId}):
function updateChatMessage(message, messageName) { var service = getService(); if (service.hasAccess()) { var url = 'https://chat.googleapis.com/v1/' + messageName; var options = { method: 'PUT', contentType: 'application/json', headers: { Authorization: 'Bearer ' + service.getAccessToken() }, payload: JSON.stringify(message) }; var response = UrlFetchApp.fetch(url, options); Logger.log(response); } else { Logger.log(service.getLastError()); } }
调用时传入原消息的name(可从event.message.name获取),而非空间名称。
3. 关于thread_key的说明
thread_key仅用于创建消息时复用线程(让新消息加入指定线程),更新已有消息时完全不需要。更新消息的核心是指定目标消息的唯一ID,而非线程标识。
内容的提问来源于stack exchange,提问作者H.I. McDunnough
相关产品推荐
相关产品推荐

