Расширение пользовательского интерфейса сообщений

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

НадстройкиGoogle Workspace , расширяющие Gmail, могут предоставлять пользовательский интерфейс, когда пользователь читает сообщения. Это позволяет надстройкамGoogle Workspace автоматизировать задачи, которые реагируют на содержимое сообщения, например отображение, извлечение или отправку дополнительной информации, связанной с сообщением.

Доступ к пользовательскому интерфейсу дополнительных сообщений

Существует два способа просмотра пользовательского интерфейса сообщений надстройки. Первый способ — открыть сообщение, когда надстройка уже открыта (например, при просмотре домашней страницы надстройки в окне входящей почты Gmail). Второй способ — запустить дополнение во время просмотра сообщения.

В любом случае надстройка выполняет соответствующую контекстную триггерную функцию , определенную в манифесте надстройки. Триггер также срабатывает, если пользователь переключается на другое сообщение, когда надстройка все еще открыта. Функция контекстного триггера создает пользовательский интерфейс сообщения для этого сообщения, которое Gmail затем отображает пользователю.

Создание дополнения к сообщению

Вы можете добавить функциональность сообщений в надстройку, выполнив следующие общие шаги:

  1. Добавьте соответствующие поля в манифест проекта сценария надстройки, включая области , необходимые для функциональности сообщений. Обязательно добавьте в манифест поле условного триггера с unconditional значением {} .
  2. Реализуйте функцию контекстного триггера, которая создает пользовательский интерфейс сообщения, когда пользователь выбирает надстройку в сообщении.
  3. Реализуйте связанные функции, необходимые для реагирования на взаимодействие пользователя с пользовательским интерфейсом.

Контекстные триггеры

Чтобы предоставить пользователям помощь при чтении сообщений, надстройкиGoogle Workspace могут определять контекстный триггер в своих манифестах. Когда пользователь открывает сообщение Gmail (с открытым дополнением), которое соответствует критериям триггера * , срабатывает триггер. Активированный триггер выполняет контекстную функцию триггера , которая создает пользовательский интерфейс надстройки и возвращает его для отображения в Gmail. В этот момент пользователь может начать взаимодействовать с ним.

Контекстные триггеры определяются в манифесте проекта надстройки. Определение триггера сообщает Gmail, какая триггерная функция активируется при каких условиях. Например, этот фрагмент манифеста устанавливает безусловный триггер, который вызывает функцию триггера onGmailMessageOpen() при открытии сообщения:

{
  ...
  "addOns": {

    "common": {
      ...
    },
    "gmail": {
      "contextualTriggers": [
        {
          "unconditional": {},
          "onTriggerFunction": "onGmailMessageOpen"
        }
      ],
      ...
    },
    ...
  }
  ...
}

Контекстная триггерная функция

Каждый контекстный триггер должен иметь соответствующую триггерную функцию , которая формирует пользовательский интерфейс надстройки. Вы указываете эту функцию в поле onTriggerFunction вашего манифеста. Вы реализуете эту функцию, чтобы принять аргумент объекта события действия и вернуть либо один объект Card , либо массив объектов Card .

Когда контекстный триггер срабатывает для данного сообщения Gmail, он вызывает эту функцию и передает ей объект события действия . Часто триггерные функции используют идентификатор сообщения, предоставленный этим объектом события, чтобы получить текст сообщения и другие сведения с помощью службы Gmail Apps Script. Например, ваша триггерная функция может извлекать содержимое сообщения с помощью следующих функций:

  // Activate temporary Gmail scopes, in this case to allow
  // the add-on to read message metadata and content.
  var accessToken = e.gmail.accessToken;
  GmailApp.setCurrentMessageAccessToken(accessToken);

  // Read message metadata and content. This requires the Gmail scope
  // https://www.googleapis.com/auth/gmail.addons.current.message.readonly.
  var messageId = e.gmail.messageId;
  var message = GmailApp.getMessageById(messageId);
  var subject = message.getSubject();
  var sender = message.getFrom();
  var body = message.getPlainBody();
  var messageDate = message.getDate();

  // Setting the access token with a gmail.addons.current.message.readonly
  // scope also allows read access to the other messages in the thread.
  var thread = message.getThread();
  var threadMessages = thread.getMessages();

  // Using this link can avoid the need to copy message or thread content
  var threadLink = thread.getPermalink();

Затем триггерная функция может воздействовать на эти данные, извлекая информацию, необходимую для интерфейса. Например, надстройка, которая суммирует данные о продажах, может собирать данные о продажах из тела сообщения и систематизировать их для отображения на карточке .

Триггерная функция должна построить и вернуть массив построенных объектов Card . Например, следующий пример создает надстройку с одной карточкой, в которой просто указана тема и отправитель сообщения:

  function onGmailMessageOpen(e) {
    // Activate temporary Gmail scopes, in this case to allow
    // message metadata to be read.
    var accessToken = e.gmail.accessToken;
    GmailApp.setCurrentMessageAccessToken(accessToken);

    var messageId = e.gmail.messageId;
    var message = GmailApp.getMessageById(messageId);
    var subject = message.getSubject();
    var sender = message.getFrom();

    // Create a card with a single card section and two widgets.
    // Be sure to execute build() to finalize the card construction.
    var exampleCard = CardService.newCardBuilder()
        .setHeader(CardService.newCardHeader()
            .setTitle('Example card'))
        .addSection(CardService.newCardSection()
            .addWidget(CardService.newKeyValue()
                .setTopLabel('Subject')
                .setContent(subject))
            .addWidget(CardService.newKeyValue()
                .setTopLabel('From')
                .setContent(sender)))
        .build();   // Don't forget to build the Card!
    return [exampleCard];
  }