Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script Gmail加载项OnTigger功能在每次电子邮件中仅运行一次,即使再次打开电子邮件_Google Apps Script_Gmail_Gmail Addons - Fatal编程技术网

Google apps script Gmail加载项OnTigger功能在每次电子邮件中仅运行一次,即使再次打开电子邮件

Google apps script Gmail加载项OnTigger功能在每次电子邮件中仅运行一次,即使再次打开电子邮件,google-apps-script,gmail,gmail-addons,Google Apps Script,Gmail,Gmail Addons,我们正在构建一个插件,但是我们希望在调用插件的onTriggerFunction时根据一些业务逻辑显示不同的卡。这在电子邮件打开时首次运行该功能时效果良好 我们有条件逻辑,但Gmail似乎会缓存返回第一张卡的初始调用的结果。转到另一封电子邮件并返回原始邮件,不会再次调用ontrigger函数,因此不会运行条件逻辑来更改呈现的初始卡片 是否可以让OnTigger函数在每次打开电子邮件时运行,而不仅仅是在第一次打开电子邮件时运行 下面是一个示例插件,它带有一个触发器函数,返回一张显示当前时间的卡:

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

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

是否可以让OnTigger函数在每次打开电子邮件时运行,而不仅仅是在第一次打开电子邮件时运行


下面是一个示例插件,它带有一个触发器函数,返回一张显示当前时间的卡:

Code.js

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

  return [card.build()];
}
appsscript.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"
  }
}
导航到较旧的对话时,将显示微调器,后跟当前时间。但是,当导航回以前显示的对话时,会立即显示旧的时间值,表明正在进行某些缓存:


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

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

有几种方法可以重新加载卡的UI。这两种情况都必须在行动响应中发生

第一种情况是,如果由于用户操作导致某些状态更改,您希望重新加载当前卡:

function buildCounterCard() {
  const card = CardService.newCardBuilder().setName('Counter');

  const count = CountApi.get(); // Or however you get this data

  const countWidget = CardService.newKeyValue().setTopLabel('Current Count').setContent(`${count}`);

  const incrementAction = CardService.newAction().setFunctionName('handleIncrement');
  const incrementButton = CardService.newTextButton().setText('Increment').setOnClickAction(incrementAction);

  const section = CardService.newCardSection().addWidget(countWidget).addWidget(incrementButton);

  card.addSection(section);

  return card.build();
}

function handleIncrement() {
  const actionResponse = CardService.newActionResponseBuilder();

  CountApi.update(); // Or however you update the data

  const nav = CardService.newNavigation().updateCard(buildCounterCard());
  actionResponse.setNavigation(nav);

  return actionResponse.build();
}
到目前为止,我发现的唯一其他方法是更新导航堆栈中的前一张卡。想象一下以下场景:

  • 用户填写表单并单击“保存”
  • 脚本将数据发布到API,成功后将“成功”卡推送到堆栈上
  • 用户看到“成功”卡时,会显示一条消息,告知数据已保存,并显示一个“返回”或“主页”按钮
  • 该按钮的操作处理程序可能如下所示:

    function handleBackClick(event) {
      const actionResponse = CardService.newActionResponseBuilder();
    
      clearPreviousCardState() // Otherwise the user sees the same data they filled out previously when they go back to the form
    
      const nav = CardService.newNavigation()
        .popCard()
        .updateCard(buildPreviousCard(event))
        .popToRoot();
      actionResponse.setNavigation(nav);
    
      return actionResponse.build();
    }
    
    无论出于何种原因,这都是可行的,但通过链接导航步骤以及
    updateCard()
    来更新多张卡却行不通


    看起来这些是目前唯一的选择。我发现有一个线性优化服务,但没有一种重新加载UI的方式,这是非常疯狂的。一位评论员提到了
    ActionResponseBuilder.setStateChanged(true)
    ,这听起来像是基于文档我们想要的,但根据我的经验,它完全没有任何作用。

    请发布您正在使用的代码。不幸的是,我无法将确切的代码发布为其公司代码,但问题将针对任何代码,因为定义为“OnTiggerFunction”的函数在第一次发送电子邮件后不会被调用,除非您刷新Gmail并再次导航到该电子邮件。@TomBell不会发布您的公司代码,而是显示您正在尝试执行的操作。如果没有任何代码,我们就不可能完全理解您在做什么,或者我们可以提供帮助。我会在假期后回到工作岗位后整理一些东西作为示例。只是提到这一点,这样我就不会忘记这一点。使用
    setStateChanged
    解决这个问题吗?似乎如果你不说状态发生了变化,那么谷歌就可以自由地缓存一些东西来改进用户体验。根据我的经验,
    setStateChanged(true)
    完全不起任何作用。调用此插件后,当我导航到插件中的所有卡时,它们仍处于缓存状态。我找到的唯一方法是在下面的回答中解释的。