Параметры передачи дополнения Gmail для функции, вызванной действием карты - PullRequest
0 голосов
/ 06 февраля 2020

Я создаю надстройку Gmail, которая создает карточку всего одной кнопкой формы. После нажатия я хочу, чтобы кнопка активировала функцию, которая будет отправлять содержимое открытого электронного письма на внешний API.

Пока у меня есть что-то вроде этого:

function createCard(event) {
  var currentMessage = getCurrentMessage(event).getBody();
  var section = CardService.newCardSection();

  var submitForm = CardService.newAction()
    .setFunctionName('callAPI');

  var submitButton = CardService.newTextButton()
    .setText('Submit')
    .setOnClickAction(submitForm);

  section.addWidget(CardService.newButtonSet()
    .addButton(submitButton));

  var card = CardService.newCardBuilder()
    .setHeader(CardService.newCardHeader()
    .setTitle('Click this button'))
    .addSection(section)
    .build();

  return [card];
}

function callAPI(event) {
  var payload = { "msg": msg }; // msg is the parameter I need to get from the function call
  var options = {
        "method"  : "POST",
        "contentType": "application/json",
        "payload" : JSON.stringify(payload),
        "followRedirects" : true,
        "muteHttpExceptions": true
  };

  return UrlFetchApp.fetch('https://www.someAPI.com/api/endpoint', options);
}

Как я могу передать переменную currentMessage в функцию callAPI? Согласно документации, единственный параметр, который мы можем получить из функции действия, это event, который имеет только данные полей формы. Если нет способа передать другие параметры, есть ли способ для этой функции получить контекстные данные сообщения непосредственно внутри функции ??

Спасибо!

1 Ответ

0 голосов
/ 06 февраля 2020

Вы можете использовать Свойства службы , которая позволяет хранить строки в виде пар ключ-значение. Идея состояла бы в том, чтобы сохранить значение currentMessage в свойстве в функции createCard, а затем использовать его в callAPI.

  • Сначала, чтобы сохранить переменную, вы можете добавить следующие строки createCard после объявления currentMessage:
var userProperties = PropertiesService.getUserProperties();
userProperties.setProperty("currentMessage", currentMessage);
  • Во-вторых, чтобы извлечь эту переменную, добавьте следующие строки в callAPI:
var userProperties = PropertiesService.getUserProperties();
var msg = userProperties.getProperty("currentMessage");

Обновление:

Чтобы избежать ограничения количества символов для одного свойства, вы также можете разбить ваше сообщение на столько свойств, сколько необходимо.

  • Сначала необходимо разбить сообщение на массив с помощью substring и сохранить каждый элемент массива в отдельном свойстве. Вы должны добавить это к createCard, после объявления currentMessage:
var messageArray = [];
var i = 0;
var k = 5000; // Character limit for one property (change accordingly)
while (i < currentMessage.length) {
  var part = currentMessage.substring(i, i += k);
  messageArray.push(part); // Splitting string into an array of strings
}
var userProperties = PropertiesService.getUserProperties();
userProperties.deleteAllProperties(); // Delete old properties
for (var j = 0; j < messageArray.length; j++) { // Set a different property for each element in the array
  userProperties.setProperty('messagePart' + j, messageArray[j]);
}
  • Затем, чтобы получить тело сообщения, вы можете сначала получить все свойства, соответствующие сообщение, а затем объедините все значения в одну строку с помощью concat . Добавьте следующие строки в callAPI:
var userProperties = PropertiesService.getUserProperties();
var keys = userProperties.getKeys(); // Get all property keys
var j = 0;
var currentMessage = "";
do {
  var part = userProperties.getProperty('messagePart' + j);
  currentMessage = currentMessage.concat(part); // Concat each property value to a single string.
  j++;    
} while (keys.indexOf('messagePart' + j) !== -1); // Check if property key exists

Ссылка:

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...