Мой аддон gmail состоит из нескольких карт.Для навигации по карте я широко использую setOnClickAction, например,
CardService.newAction().setFunctionName('openUserCard').setParameters({userJSON: JSON.stringify(user)})
Ссылка на аддон Gmail говорит, что и ключи, и значения метода 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 их на некоторые внешниеапи.Но я не могу отправить массив attachments
напрямую, используя setOnClickAction
, потому что он состоит из сложных объектов с методами.
Вот почему я отправляю исходный объект e.messageMetadata
на карту экспорта и повторяю все операции, описанные выше: setCurrentMessageAccessToken
, getMessageById
, getAttachments
, а затем для каждого вложения получаем его содержимое с помощьюattachment.getBytes()
и отправьте по внешнему API.
Если клиент сразу же отправляется на экспортную карту, это все работает.Но если он просматривает некоторые другие карты в течение нескольких минут, а затем отправляется на экспорт, вызов GmailApp.getMessageById(messageMetadata.messageId)
возвращает ошибку Access Denied:: Expired access token
.
Как этого избежать?