Получение и обработка действий пользователей

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

Чтобы создать интерактивный интерфейс для приложения Chat, используйте следующие компоненты:

  • Триггеры. Способы, которыми пользователи Google Chat могут вызвать приложение Chat, например добавить его в чат-группу или отправить ему сообщение.
  • Объекты событий – данные, которые приложения Chat получают от триггеров или взаимодействий с интерфейсом.
  • Действия. Способы, которыми приложения Chat могут реагировать на взаимодействия, например отправлять сообщения или возвращать пользовательский интерфейс на основе карточек.
Приложение Chat получает объект события от триггера "Добавлено в чат-группу"
Рисунок 1. Когда пользователь добавляет приложение Chat в чат-группу, срабатывает триггер Добавлено в чат-группу и отправляет объект события. Чтобы ответить сообщением, приложение Chat обрабатывает объект события и возвращает действие, которое создает сообщение.

Приложения Chat могут создавать и показывать интерфейсы следующими способами:

Требования

Как работают взаимодействия пользователей

Когда пользователь взаимодействует с приложением Chat, Google Chat вызывает настроенный триггер и отправляет объект события конечной точке или функции приложения Chat. Приложение Chat обрабатывает объект события и может либо вернуть действие синхронно в течение 30 секунд, либо ответить асинхронно с помощью Chat API.

На следующей схеме показано, как приложения Google Chat обрабатывают взаимодействия с пользователями и отвечают на них:

Архитектура обработки взаимодействий пользователей приложениями Google Chat.

Триггеры

Триггеры – это определенные способы, с помощью которых пользователи вызывают приложение Chat, используя интерфейс Chat, например @упоминания или команды приложения.

В таблице ниже приведены триггеры Chat, их описание и типичные ответы приложений Chat.

Триггер Описание Типичный ответ
Добавлено в чат-группу

Пользователь добавляет приложение Chat в чат-группу, или администратор Google Workspace устанавливает приложение Chat в чаты для прямой переписки для пользователей в своей организации. Чтобы узнать о приложениях Chat, установленных администраторами, ознакомьтесь со статьей Как установить приложения из каталога Marketplace в своем домене в Справочном центре для администраторов Google Workspace.

Приложение Chat отправляет приветственное сообщение, в котором объясняется, что оно делает и как пользователи в чат-группе могут с ним взаимодействовать.
Сообщение

Пользователь взаимодействует с приложением Chat в сообщении одним из следующих способов:

  • Отправляет сообщение в прямую переписку с приложением Chat.
  • упоминает приложение Chat в чат-группе любого типа;
  • Отправляет сообщение, содержащее ссылку, которая соответствует шаблону URL для предварительного просмотра ссылок.
  • Вводит текст в меню множественного выбора виджета selectionInput.
Приложение Chat отвечает на основе содержимого сообщения. Например, приложение Chat отвечает сообщением, прикрепляет карточку предварительного просмотра ссылки или предлагает элементы в меню с множественным выбором.
Удаление из чат-группы

Пользователь удаляет приложение Chat из чат-группы, или администратор Google Workspace удаляет приложение Chat для пользователя в своей организации.

Пользователи не могут удалять приложения Chat, установленные администратором. Если пользователь ранее установил приложение Chat, оно останется установленным независимо от того, попытается ли администратор Google Workspace удалить его.

Приложение Chat удаляет все входящие уведомления, настроенные для чат-группы (например, удаляет вебхук), и очищает внутреннее хранилище. Приложения Chat не могут отвечать на этот триггер, так как они больше не являются участниками чат-группы.
Команда приложения

Пользователь вызывает команду приложения Chat (например, слеш-команду, быструю команду или действие с сообщением).

Приложение Chat ответит на команду. Например, оно может отправить сообщение или открыть диалоговое окно.
Главный экран приложения

Пользователь открывает вкладку Главная в чат-группе для прямой переписки с приложением Chat или взаимодействует с виджетом на карточке главной страницы.

Приложение Chat возвращает объект RenderActions, который отправляет карточку главной страницы (pushCard) или обновляет отображаемую карточку главной страницы (updateCard).

Конечные точки или функции обратного вызова для этих триггеров настраиваются в консоли Google Cloud на странице Configuration (Конфигурация) Chat API. Пошаговые инструкции приведены в статье Как настроить Google Chat API.

Как настроить варианты запросов

Варианты запросов помогают пользователям узнать о функциях приложения Chat, когда они открывают пустую прямую переписку с ним. Вы можете настроить до трех вариантов запросов.

Чтобы добавить и настроить варианты запросов:

  1. В консоли Google Cloud перейдите на страницу Configuration (Конфигурация) Chat API.

    Перейти на страницу конфигурации Chat API

  2. В разделе Интерактивные функции найдите Варианты запросов и нажмите Добавить запрос.

  3. В поле Ранг (1–3) введите число от 1 до 3, чтобы указать порядок показа.

  4. В разделе Выбор типа укажите, как будет работать запрос:

    • Текстовый запрос. Когда пользователь нажимает на чип запроса, в поле чата появляется заданный текст.
    • Командная строка. При нажатии запускает зарегистрированную слеш-команду или быструю команду. Команды, требующие дополнительных аргументов, выбрать нельзя.
  5. Настройте запрос в зависимости от выбранного типа:

    • Если вы выбрали "Текстовый запрос":

      1. В поле Заголовок введите заголовок запроса, который будет показываться на чипе (не более 30 символов).
      2. В поле Текст запроса введите текст, который будет появляться в поле чата (не более 60 символов).
      3. При необходимости добавьте локализованные названия и текст для пользователей, говорящих на других языках:
      4. В разделе Локализованные подсказки нажмите Добавить язык.
      5. В разделе Язык выберите поддерживаемый язык из раскрывающегося списка.
      6. В поле Локализованное название введите название на нужном языке (не более 30 символов).
      7. В поле Локализованный текст подсказки введите текст подсказки на нужном языке (не более 60 символов).
      8. Повторите это действие необходимое число раз.
    • Если вы выбрали командную строку:

      1. В разделе Слеш-команда/Быстрая команда выберите команду из раскрывающегося списка.
  6. Нажмите Готово, а затем Сохранить внизу страницы.

Обработка повторных HTTP-вызовов к вашему сервису

Если HTTPS-запрос к вашему сервису не удался (например, из-за тайм-аута, временного сбоя сети или кода статуса HTTPS, отличного от 2xx), Google Chat может повторить попытку доставки несколько раз в течение нескольких минут (но это не гарантируется). В результате в некоторых ситуациях приложение Chat может получить одно и то же событие несколько раз. Если запрос выполнен успешно, но возвращает недопустимые полезные данные ответа, Google Chat не повторяет запрос.

Объекты событий

Приложения Chat получают объекты событий, когда срабатывает триггер Chat или когда пользователи Chat взаимодействуют с интерфейсом приложения Chat (например, нажимают кнопку или отправляют диалоговое окно). Объект события позволяет использовать данные о взаимодействии, чтобы ответить или обновить пользовательский интерфейс.

В 2025 году в приложениях Google Chat была добавлена поддержка событий дополнений, и с июля 2025 года это стало настройкой по умолчанию для новых приложений Chat. В документации Chat события дополнений – это стандартный тип событий, показанный в руководствах и примерах кода. Документация по событиям Chat (для приложений Chat, которые не являются дополнениями Google Workspace) разделена на свернутые разделы (например, Приложения Chat, которые не являются дополнениями: получение событий взаимодействия и ответ на них).

Определите типы событий и ответов

Когда приложение Chat получает объект события, структура полезной нагрузки и способ ответа зависят от того, настроено ли приложение Chat как дополнение Google Workspace.

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

Тип приложения Получает события дополнений
(по умолчанию для новых приложений, созданных после июля 2025 г.)
Получает события Chat
(предыдущее значение по умолчанию, до июля 2025 г.)
Приложения Apps Script
Проверьте файл манифеста (appsscript.json).
Объект chat настраивается внутри addOns:
{
  "addOns": {
    "chat": {}
  }
}
Объект chat настраивается в корне манифеста:
{
  "chat": {}
}
Другие приложения
Проверьте страницу Google Chat API Configuration (Конфигурация).
Флажок "Создать это приложение Chat как дополнение Google Workspace" установлен. Флажок "Создать это приложение Chat как дополнение Google Workspace" не установлен.
Где найти документацию В руководствах и примерах кода.

Справочная документация по событиям: объекты событий дополнений.
Свернутые разделы (например, Приложения Chat, не являющиеся дополнениями: получение событий взаимодействия и ответ на них)

Справочная документация по событиям: События взаимодействия Chat API
Как отвечать Возвращает действие, например DataActions или RenderActions.
Как ответить действием
Возвращает ресурс Message.
Как ответить сообщением

Полезная нагрузка объекта события

Каждый объект события дополнения включает в себя commonEventObject с информацией о хосте и платформе (hostApp: "CHAT", clientPlatform, userLocale, userTimezone, parameters и formInputs) и объект chat, содержащий контекст, относящийся к Chat:

  • Для триггера Главная страница приложения (когда пользователь открывает вкладку Главная в прямой переписке с приложением Chat) объект chat содержит chat.user и chat.eventTime без поля объединения payload. Когда пользователь нажимает кнопку на карточке главной страницы, объект события включает chat.buttonClickedPayload вместе с commonEventObject.parameters (и commonEventObject.formInputs, если карточка содержит входные данные формы).
  • Для взаимодействий с чат-группами и сообщениями (Добавление в чат-группу, Сообщение, Удаление из чат-группы, Команда приложения или взаимодействия с кнопками и виджетами) объект chat включает chat.user, chat.space, chat.eventTime и соответствующую полезную нагрузку взаимодействия:
    • messagePayload – содержит space, message и configCompleteRedirectUri, когда пользователь отправляет сообщение.
    • addedToSpacePayload – содержит space, interactionAdd и configCompleteRedirectUri, когда приложение Chat добавляется в чат-группу.
    • removedFromSpacePayload – содержит space, когда приложение Chat удаляется из чат-группы.
    • buttonClickedPayload содержит space, message, isDialogEvent и dialogEventType, когда пользователь нажимает кнопку на карточке или в диалоговом окне.
    • widgetUpdatedPayload – содержит space, когда пользователь взаимодействует с виджетом, например вводит текст в меню множественного выбора с внешним источником данных.
    • appCommandPayload – содержит space, message, appCommandMetadata, isDialogEvent, dialogEventType и configCompleteRedirectUri, когда пользователь вызывает команду приложения.

Подробнее об объектах событий дополнений в Chat и других приложениях Google Workspace…

Ответить

В этом разделе объясняется, как приложения Chat используют действия, чтобы синхронно отвечать на действия пользователей.

Чтобы ответить действием, приложение Chat должно ответить в течение 30 секунд, и ответ должен быть применим к чат-группе, в которой произошло взаимодействие. Для синхронных ответов не требуется аутентификация. Если приложению для Chat требуется больше 30 секунд или ему нужно выполнить действие за пределами чат-группы, настройте аутентификацию и асинхронный ответ с помощью Google Chat API.

Чтобы синхронно отвечать на действия пользователей, приложение Chat обрабатывает объект входящего события и возвращает один из следующих объектов JSON:

  • DataActions создает или обновляет сообщения чата (CreateMessageAction, UpdateMessageAction) или прикрепляет предварительный просмотр ссылок (UpdateInlinePreviewAction) с помощью chatDataActionMarkup.
  • RenderActions: создает, обновляет или закрывает главную страницу или диалоговое окно (pushCard, updateCard, endNavigation: "CLOSE_DIALOG") или предоставляет динамические варианты ввода для меню с множественным выбором (modifyCard).
  • AuthorizationError – показывает пользователям карточку базовой авторизации (basic_authorization_prompt) для входа или аутентификации во внешнем сервисе.

В таблице ниже показано, как приложения Chat могут отвечать действиями. Приложения Chat могут возвращать объекты JSON напрямую или создавать ответ с помощью AddOnResponseService и CardService в Apps Script.

Ответ приложения Chat Необходимое действие, которое нужно вернуть (JSON) Необходимое действие для возврата (Apps Script)
Отправьте сообщение или обновите его. DataActions (createMessageAction или updateMessageAction) DataActionsResponse
Предварительный просмотр ссылок в сообщениях, которые пользователи Chat отправляют в чат-группе. DataActions (updateInlinePreviewAction) DataActionsResponse
Отрисовка или обновление главной страницы на вкладке Главная в прямой переписке. RenderActions (pushCard или updateCard) ActionResponse
открывать, обновлять и закрывать диалоговые окна; RenderActions (pushCard, updateCard или endNavigation: "CLOSE_DIALOG") ActionResponse
Чтобы собирать информацию из карточки или диалогового окна, предлагайте варианты на основе того, что пользователи вводят в меню множественного выбора. RenderActions (modifyCard) ActionResponse
Запросите настройку или авторизацию для внешнего сервиса. AuthorizationError (basic_authorization_prompt) AuthorizationException

Отправить в ответ сообщение

Приложения Chat могут отвечать сообщением на любой из следующих триггеров или взаимодействий:

  • Триггеры сообщений, например когда пользователи упоминают приложение Chat через @или отправляют ему прямое сообщение.
  • Добавление в чат-группу, например когда пользователи устанавливают приложение Chat из Google Workspace Marketplace или добавляют его в чат-группу.
  • Триггеры команд приложения, например когда пользователи вызывают слеш-команду или быструю команду.
  • нажатия кнопок на карточках в сообщениях или диалоговых окнах; Например, когда пользователи вводят информацию и нажимают «Отправить».

Приложения Chat могут включать в сообщение:

  • Текст, содержащий гиперссылки, @упоминания и эмодзи. Подробнее о том, как форматировать текст письма…
  • Одна или несколько карточек, которые могут появляться в сообщении или открываться в новом окне в виде диалогового окна. Подробнее о создании карточек для приложений Google Chat…
  • Один или несколько дополнительных виджетов, которые представляют собой кнопки, появляющиеся после текста или карточек в сообщении.

Чтобы отправить ответное сообщение, верните DataActions с объектом CreateMessageAction:

{
  "hostAppDataAction": {
    "chatDataAction": {
      "createMessageAction": {
        "message": <var>MESSAGE</var>
      }
    }
  }
}

Замените MESSAGE ресурсом Message из Chat API.

В примере ниже приложение Chat создает и отправляет приветственное текстовое сообщение, когда его добавляют в чат-группу, отвечая на триггер Добавление в чат-группу с помощью DataActions:

Node.js

/**
 * Sends an onboarding message when the Chat app is added to a space.
 *
 * @param {Object} req The request object from Google Chat.
 * @param {Object} res The response object from the Chat app.
 */
exports.cymbalApp = function cymbalApp(req, res) {
  const chatEvent = req.body.chat;
  // Send an onboarding message when added to a Chat space
  if (chatEvent.addedToSpacePayload) {
    res.json({ hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
      text: 'Hi, Cymbal at your service. I help you manage your calendar ' +
        'from Google Chat. Take a look at your schedule today by typing ' +
        '`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. ' +
        'To learn what else I can do, type `/help`.'
    }}}}});
  }
};

Python

from flask import Flask, request, json
app = Flask(__name__)

@app.route('/', methods=['POST'])
def cymbal_app():
  """Sends an onboarding message when the Chat app is added to a space.

  Returns:
    Mapping[str, Any]: The response object from the Chat app.
  """
  chat_event = request.get_json()["chat"]
  if "addedToSpacePayload" in chat_event:
    return json.jsonify({ "hostAppDataAction": { "chatDataAction": {
      "createMessageAction": { "message": {
        "text": 'Hi, Cymbal at your service. I help you manage your calendar ' +
        'from Google Chat. Take a look at your schedule today by typing ' +
        '`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. ' +
        'To learn what else I can do, type `/help`.'
      }}
    }}})

Java

@SpringBootApplication
@RestController
public class App {
  public static void main(String[] args) {
    SpringApplication.run(App.class, args);
  }

  /*
   * Sends an onboarding message when the Chat app is added to a space.
   *
   * @return The response object from the Chat app.
   */
  @PostMapping("/")
  @ResponseBody
  public GenericJson onEvent(@RequestBody JsonNode event) throws Exception {
    JsonNode chatEvent = event.at("/chat");
    if (!chatEvent.at("/addedToSpacePayload").isEmpty()) {
      return new GenericJson() { {
        put("hostAppDataAction", new GenericJson() { {
          put("chatDataAction", new GenericJson() { {
            put("createMessageAction", new GenericJson() { {
              put("message", new Message().setText(
                "Hi, Cymbal at your service. I help you manage your calendar " +
                "from Google Chat. Take a look at your schedule today by typing " +
                "`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. " +
                "To learn what else I can do, type `/help`."
              ));
            } });
          } });
        } });
      } };
    }
    return new GenericJson();
  }
}

Apps Script

/**
 * Sends an onboarding message when the Chat app is added to a space.
 *
 * @param {Object} event The event object from Google Chat.
 * @return {Object} Response from the Chat app.
 */
function onAddedToSpace(event) {
  return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
    text: 'Hi, Cymbal at your service. I help you manage your calendar ' +
          'from Google Chat. Take a look at your schedule today by typing ' +
          '`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. ' +
          'To learn what else I can do, type `/help`.'
  }}}}};
}

Пример кода возвращает следующее текстовое сообщение:

Пример сообщения о первом знакомстве.

Как изменить сообщение

Приложения Chat также могут обновлять отправленные ими сообщения. Например, приложение Chat может обновить сообщение после того, как пользователь отправит диалоговое окно или нажмет кнопку на карточке в сообщении.

Чтобы обновить сообщение приложения Chat в ответ на взаимодействие, верните DataActions с UpdateMessageAction:

{
  "hostAppDataAction": {
    "chatDataAction": {
      "updateMessageAction": {
        "message": <var>MESSAGE</var>
      }
    }
  }
}

Замените MESSAGE ресурсом Message из Chat API.

Приложения Chat также могут обновлять отправленные пользователями сообщения, чтобы прикреплять к ним карточки предварительного просмотра ссылок с помощью updateInlinePreviewAction. Подробнее о предварительном просмотре ссылок…

Как отвечать асинхронно с помощью Google Chat API

Вместо синхронного возврата действия приложениям Chat может потребоваться вызвать Google Chat API, чтобы ответить на взаимодействие или отправить упреждающие сообщения. Например, приложения Chat должны вызывать Google Chat API, чтобы:

  • Отвечать на взаимодействие через 30 секунд (например, после выполнения длительной задачи).
  • Отправлять сообщения по расписанию или уведомления об изменениях внешних ресурсов.
  • выполнять задачи за пределами чат-группы, в которой происходило взаимодействие.
  • Выполнять в Chat задачи, которые недоступны в качестве синхронных действий, например показывать список чат-групп или добавлять участников в чат-группу.
  • Выполнять задачи от имени пользователя Chat (требуется аутентификация пользователя).

Если вы отвечаете на взаимодействие по истечении 30 секунд, то, чтобы избежать появления пользовательского сообщения об ошибке, в котором говорится, что ваше приложение Chat не отвечает, вы должны подтвердить получение объекта события в течение 30 секунд, вернув пустой ответ:

Node.js

async function onEvent(req, res) {
  // Trigger asynchronous job that will respond using the Google Chat API.
  ...

  // Respond with an empty response to the Google Chat platform.
  return res.send({});
};

Python

def on_event(event) -> dict:
  # Trigger asynchronous job that will respond using the Google Chat API.
  ...

  // Respond with an empty response to the Google Chat platform.
  return {}

Java

public String onEvent(JsonNode event) {
  // Trigger asynchronous job that will respond using the Google Chat API.
  ...

  // Respond with an empty response to the Google Chat platform.
  return "{}";
}

Apps Script

function onEvent(event) {
  // Trigger asynchronous job that will respond using the Google Chat API.
  ...

  // Respond with an empty response to the Google Chat platform.
  return null;
}

Чтобы отправить сообщение с помощью Chat API, настройте аутентификацию и вызовите метод spaces.messages.create. Подробнее о том, как отправить сообщение… Инструкции по использованию дополнительных методов Chat API можно найти в обзоре Chat API.

Приложения Chat, не являющиеся дополнениями: получение взаимодействий пользователей и ответы на них

Приложения Chat, которые не являются дополнениями Google Workspace, получают события взаимодействия Chat API (Event) вместо объектов событий дополнений Google Workspace (EventObject), и отвечают, возвращая ресурс Message вместо действия.

Чтобы преобразовать приложение Chat, которое не является дополнением, в дополнение Google Workspace, ознакомьтесь со статьей Как преобразовать приложение Google Chat в дополнение Google Workspace.

Типы событий-взаимодействий

Для каждого типа взаимодействия с пользователем Google Chat отправляет приложению Chat, которое не является дополнением, объект Event, тип которого представлен полем eventType:

Взаимодействие с пользователем eventType Типичный ответ от приложения Chat, которое не является дополнением
Пользователь отправляет сообщение приложению Chat, например упоминает его с помощью символа @ или использует слеш-команду. MESSAGE Приложение Chat отвечает на основе содержимого сообщения. Например, в ответ на слеш-команду /about приложение Chat отправляет сообщение с описанием задач, которые оно может выполнять.
Пользователь добавляет приложение Chat в чат-группу. ADDED_TO_SPACE Приложение Chat отправляет приветственное сообщение, в котором объясняется, что оно делает и как пользователи в чат-группе могут с ним взаимодействовать.
Пользователь удаляет приложение Chat из чат-группы. REMOVED_FROM_SPACE Приложение Chat удаляет все входящие уведомления, настроенные для чат-группы (например, удаляет вебхук), и очищает внутреннее хранилище.
Пользователь нажимает кнопку на карточке в сообщении, диалоговом окне или на главной странице приложения Chat. CARD_CLICKED Приложение Chat обрабатывает и сохраняет данные, отправленные пользователем, или возвращает другую карточку.
Пользователь открывает главную страницу приложения Chat, нажав на вкладку Главная в переписке 1:1. APP_HOME Приложение Chat возвращает статическую или интерактивную карточку с главной страницы.
Пользователь отправляет форму с главной страницы приложения Chat. SUBMIT_FORM Приложение Chat обрабатывает и сохраняет данные, отправленные пользователем, или возвращает другую карточку.
Пользователь вызывает команду с помощью быстрой команды. APP_COMMAND Приложение Chat отвечает на основе вызванной команды. Например, в ответ на команду About приложение Chat отправляет сообщение с описанием задач, которые оно может выполнять.

Чтобы посмотреть все поддерживаемые события взаимодействия и примеры полезной нагрузки JSON, ознакомьтесь со статьей Типы событий взаимодействия с приложением Chat и справочной документацией по EventType.

События взаимодействия из диалоговых окон

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

  • В поле isDialogEvent задано значение true.
  • DialogEventType (REQUEST_DIALOG, SUBMIT_DIALOG или CANCEL_DIALOG) уточняет, открывает ли взаимодействие диалоговое окно, отправляет ли информацию из него или закрывает его.

Как настроить приложение Chat, которое не является дополнением, для получения событий взаимодействия

  1. В консоли Google Cloud перейдите на страницу Configuration (Конфигурация) Chat API.

    Перейти на страницу конфигурации Chat API

  2. В разделе Интерактивные функции снимите флажок Создать это приложение Chat как дополнение Google Workspace и настройте Функциональность, одну конечную точку Настройки подключения (URL конечной точки HTTP, Apps Script, название темы Cloud Pub/Sub или Dialogflow), Команды, Варианты запросов, Предварительный просмотр ссылок и Видимость.

  3. Нажмите Сохранить.

Как ответить сообщением в приложении Chat, которое не является дополнением

Чтобы ответить синхронно в приложении Chat, которое не является дополнением, верните объект Message напрямую. В примере ниже показано, как ответить на событие взаимодействия ADDED_TO_SPACE текстовым сообщением.

Node.js

/**
 * Sends an onboarding message when the Chat app is added to a space.
 *
 * @param {Object} req The event object from Chat API.
 * @param {Object} res The response object from the Chat app.
 */
exports.cymbalApp = function cymbalApp(req, res) {
  // Send an onboarding message when added to a Chat space
  if (req.body.type === 'ADDED_TO_SPACE') {
    res.json({
      'text': 'Hi, Cymbal at your service. I help you manage your calendar ' +
        'from Google Chat. Take a look at your schedule today by typing ' +
        '`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. To ' +
        'learn what else I can do, type `/help`.'
    });
  }
};

Python

from flask import Flask, request, json
app = Flask(__name__)

@app.route('/', methods=['POST'])
def cymbal_app():
  """Sends an onboarding message when the Chat app is added to a space.

  Returns:
    Mapping[str, Any]: The response object from the Chat app.
  """
  event = request.get_json()
  if event['type'] == 'ADDED_TO_SPACE':
    return json.jsonify({
      'text': 'Hi, Cymbal at your service. I help you manage your calendar ' +
      'from Google Chat. Take a look at your schedule today by typing ' +
      '`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. To ' +
      'learn what else I can do, type `/help`.'
    })
  return json.jsonify({})

Java

@SpringBootApplication
@RestController
public class App {
  public static void main(String[] args) {
    SpringApplication.run(App.class, args);
  }

  /*
   * Sends an onboarding message when the Chat app is added to a space.
   *
   * @return The response object from the Chat app.
   */
  @PostMapping("/")
  @ResponseBody
  public Message onEvent(@RequestBody JsonNode event) {
    switch (event.get("type").asText()) {
      case "ADDED_TO_SPACE":
        return new Message().setText(
          "Hi, Cymbal at your service. I help you manage your calendar " +
          "from Google Chat. Take a look at your schedule today by typing " +
          "`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. " +
          "To learn what else I can do, type `/help`.");
      default:
        return new Message();
    }
  }
}

Apps Script

/**
 * Sends an onboarding message when the Chat app is added to a space.
 *
 * @param {Object} event The event object from Chat API.
 * @return {Object} Response from the Chat app.
 */
function onAddToSpace(event) {
  return {
    'text': 'Hi, Cymbal at your service. I help you manage your calendar ' +
      'from Google Chat. Take a look at your schedule today by typing ' +
      '`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. To learn ' +
      'what else I can do, type `/help`.'
  };
}