首页 > 解决方案 > Gmail 附加组件 onTriggerFunction 仅在每封电子邮件中运行一次,即使再次打开电子邮件也是如此

问题描述

我们正在构建一个GmailonTriggerFunction插件,但是我们希望在调用插件时根据某些业务逻辑显示不同的卡片。当电子邮件打开时,该功能第一次运行时效果很好。

我们有条件逻辑,但 Gmail 似乎缓存了返回第一张卡片的初始调用的结果。转到另一封电子邮件并返回原始电子邮件,onTriggerFunction不会再次调用,因此不会运行条件逻辑来更改呈现的初始卡片。

无论如何要让 onTriggerFunction 在每次打开电子邮件时运行,而不仅仅是第一次打开电子邮件?


这是一个带有触发函数的示例插件,该函数返回显示当前时间的单张卡片:

代码.js

function buildAddOn(e) {
  var card = CardService.newCardBuilder();
  card.setHeader(CardService.newCardHeader().setTitle(new Date().toLocaleTimeString()));  

  return [card.build()];
}

应用脚本.json

{
  "timeZone": "GMT",
  "dependencies": {
  },
  "oauthScopes": ["https://www.googleapis.com/auth/gmail.addons.execute"],
  "gmail": {
    "name": "Minimal example",
    "logoUrl": "https://www.gstatic.com/images/icons/material/system/2x/bookmark_black_24dp.png",
    "contextualTriggers": [{
      "unconditional": {
      },
      "onTriggerFunction": "buildAddOn"
    }],
    "primaryColor": "#4285F4",
    "secondaryColor": "#4285F4",
    "openLinkUrlPrefixes": ["https://mail.google.com/"],
    "version": "TRUSTED_TESTER_V2"
  }
}

导航到较旧的对话时,会显示一个微调器,然后显示当前时间。但是,当导航回以前显示的对话时,时间的旧值会立即显示,这表明正在发生一些缓存:

问题演示

插件内的操作或我们应用程序中的其他活动可能会影响重新打开先前显示的对话时应显示的内容。这意味着重新显示卡片的旧副本会导致用户出现意外行为。

标签: google-apps-scriptgmailgmail-addons

解决方案


不幸的是,目前(2019 年 7 月)无法强制触发器在每次打开电子邮件时运行。您可以将ActionResponseBuilder.setStateChanged(true)其用作对按钮单击的响应,以指示 Gmail 清除缓存,但它不能与正常的卡片响应一起发送。


推荐阅读