如何在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(); }
关键逻辑说明
- 设置卡片唯一ID:在
buildCardB中通过setCardId("card_b")给Card B分配唯一标识,这是Google Apps Script识别卡片身份的核心依据。 - 更新时复用ID:构建更新后的Card B'时,同样设置
setCardId("card_b"),确保updateCard能定位到栈中已存在的原Card B,而非创建新卡片。 - 导航顺序:先执行
popCard()移除Card C,此时栈顶为原Card B;再执行updateCard(updatedCardB)将其替换为Card B',最终栈结构变为[Card A, Card B'],完全符合需求。
内容的提问来源于stack exchange,提问作者Sa2Da4728
相关产品推荐
相关产品推荐

