GMail 插件:过期的访问令牌

GMail Addon: Expired Access Token

我的 gmail 插件包含在几张卡片上。对于卡片导航,我广泛使用 setOnClickAction,例如

CardService.newAction().setFunctionName('openUserCard').setParameters({userJSON: JSON.stringify(user)})

Gmail 插件参考 says setParameters 方法的键和值都必须是字符串。这就是为什么不可能将任何复杂对象从一张卡片发送到另一张卡片的原因。

也不支持全局变量。可以使用 PropertiesService 来存储一些数据,但也仅限于字符串。

我有初始卡和导出卡。在初始卡上,当前的电子邮件数据导入器看起来像这样:

function buildAddon(e) {
  var accessToken = e.messageMetadata.accessToken;
  GmailApp.setCurrentMessageAccessToken(accessToken);
  var message = GmailApp.getMessageById(e.messageMetadata.messageId);
  var attachments = message.getAttachments();
  ... we can do anything with attachments here...

问题是我必须在导出卡上使用附件,而不是在初始卡上,以便 POST 将它们发送到某些外部 api。但是我不能直接使用 setOnClickAction 发送 attachments 数组,因为它包含在具有方法的复杂对象上。

这就是为什么我将初始的e.messageMetadata对象发送到导出卡,然后重复上面的所有操作:setCurrentMessageAccessTokengetMessageByIdgetAttachments,然后对于每个附件,通过 attachment.getBytes() 获取其内容并发送到外部 api.

如果客户立即去出口卡,这一切都有效。但是如果他浏览了几分钟其他卡片,然后去导出,调用 GmailApp.getMessageById(messageMetadata.messageId) returns 一个错误 Access Denied:: Expired access token.

如何避免这种情况?

每个动作只接收一个参数,参数 'e' 事件。

然后如果我们检查 'e',我们会发现一个带有 属性 参数的 JSON 对象,这是我们通过 setParameters() 发送到动作函数的参数动作的方法。

在这个变量 'e' 中,还有一个 属性 名为 messageMetadata 的所有正确值。

var myAction = CardService.newAction().setFunctionName("xpto").setParameters({ name: "banana"} );

function xpto(e) {
    var name = e.parameters.name; 
}

示例 'e' 事件内部包含以下 JSON:

{ 
    formInput = {},
    clientPlatform = web,
    messageMetadata = { 
        messageId= ... ,
        accessToken= ... 
    },
    formInputs = {},
    parameters = { name=Banana } 
}

希望这仍然有用。