GMail插件:过期的访问令牌

时间:2019-05-10 14:49:59

标签: google-apps-script gmail-addons

我的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...

问题是我必须不使用附件的开头,而是使用导出卡上的附件,才能将其发布到某些外部api。但是我无法直接使用attachments发送setOnClickAction数组,因为它由带有方法的复杂对象组成。

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

如果客户立即去出口卡,这一切正常。但是,如果他浏览其他卡片几分钟,然后导出,则对GmailApp.getMessageById(messageMetadata.messageId)的呼叫将返回错误Access Denied:: Expired access token

如何避免这种情况?

1 个答案:

答案 0 :(得分:1)

每个动作仅接收一个参数,即参数“ e”事件。

然后,如果我们检查“ e”,我们将找到一个带有属性参数的JSON对象,这是通过Action的setParameters()方法发送到action函数中的参数。

在变量'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 } 
}

希望这仍然有用。