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

如何在Google Apps Script中实现Gmail插件回退并更新前序卡片?

解决方案:通过卡片ID实现正确的导航与更新

问题的核心是未给卡片设置唯一ID,导致updateCard无法正确识别目标卡片,进而出现重复添加的异常。以下是修正后的代码及逻辑说明:

修正后的完整代码

function buildCardA() {
  var card = CardService.newCardBuilder()
      .setHeader(CardService.newCardHeader().setTitle("Card A"))
      .addSection(
        CardService.newCardSection()
        .addWidget(
          CardService.newTextButton()
          .setText('Go to Card B')
          .setOnClickAction(CardService.newAction()
            .setFunctionName('goToCardB'))
        )
      )
      .build();
  return card;
}

function buildCardB() {
  var card = CardService.newCardBuilder()
      .setCardId("card_b") // 给Card B设置唯一ID
      .setHeader(CardService.newCardHeader().setTitle("Card B"))
      .addSection(
        CardService.newCardSection()
        .addWidget(
          CardService.newTextButton()
          .setText('Go to Card C')
          .setOnClickAction(CardService.newAction()
            .setFunctionName('goToCardC'))
        )
      )
      .build();
  return card;
}

function buildCardC() {
  var card = CardService.newCardBuilder()
      .setHeader(CardService.newCardHeader().setTitle("Card C"))
      .addSection(
        CardService.newCardSection()
        .addWidget(
          CardService.newTextButton()
          .setText('Pop and Update Card B')
          .setOnClickAction(CardService.newAction()
            .setFunctionName('handleCardCButtonClick'))
        )
      )
      .build();
  return card;
}

function goToCardB() {
  var cardB = buildCardB();
  return CardService.newNavigation().pushCard(cardB);
}

function goToCardC() {
  var cardC = buildCardC();
  return CardService.newNavigation().pushCard(cardC);
}

function handleCardCButtonClick(e) {
  var updatedCardB = CardService.newCardBuilder()
      .setCardId("card_b") // 保持与原Card B相同的ID,确保替换而非新增
      .setHeader(CardService.newCardHeader().setTitle("Updated Card B"))
      .addSection(
        CardService.newCardSection()
        .addWidget(
          CardService.newTextParagraph().setText("This is the updated content of Card B.")
        )
      )
      .build();

  return CardService.newNavigation()
      .popCard() // 移除栈顶的Card C,此时栈为[A, Card B]
      .updateCard(updatedCardB); // 替换栈顶的Card B为更新后的版本
}

function onHomepage(e) {
  var cardA = buildCardA();
  return CardService.newActionResponseBuilder()
      .setNavigation(CardService.newNavigation().pushCard(cardA))
      .build();
}

关键逻辑说明

  1. 设置卡片唯一ID:在buildCardB中通过setCardId("card_b")给Card B分配唯一标识,这是Google Apps Script识别卡片身份的核心依据。
  2. 更新时复用ID:构建更新后的Card B'时,同样设置setCardId("card_b"),确保updateCard能定位到栈中已存在的原Card B,而非创建新卡片。
  3. 导航顺序:先执行popCard()移除Card C,此时栈顶为原Card B;再执行updateCard(updatedCardB)将其替换为Card B',最终栈结构变为[Card A, Card B'],完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:44:52