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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:57:43