Отправляйтесь в отпуск с приложением Google Chat

1. Введение

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

В этом практическом занятии вы научитесь создавать чат-приложение — «Приложение для учета посещаемости в чате» — которое добавляет ответственных за уведомления об отпуске в Gmail и планирует встречи в Google Календаре. Создав приложение для учета посещаемости в чате на основе Google Apps Script , вы сможете легко получить доступ к другим сервисам Google, таким как Drive, Gmail, Calendar, Docs, Sheets и многим другим.

Что вы узнаете

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

Что вам понадобится

  • Доступ к интернету и веб-браузеру.
  • Учетная запись Google Workspace с доступом к Google Chat .
  • Базовые навыки работы с JavaScript — Google Apps Script поддерживает только JavaScript.

2. Получите пример кода.

Чтобы посмотреть код для каждого шага в этом примере, вы можете либо скачать ZIP-файл, либо клонировать репозиторий GitHub.

Папки step-NN в каталоге apps-script/attendance-chat-app содержат конечное состояние каждого шага этого практического занятия. Они предназначены для справки.

Скачать код

Чтобы скачать код для этого практического занятия, нажмите следующую кнопку:

Распакуйте загруженный ZIP-файл. В результате будет распакована корневая папка ( google-chat-samples ), содержащая по одной папке для каждого шага этого практического задания в папке apps-script/attendance-chat-app .

Клонируйте репозиторий GitHub.

Чтобы клонировать репозиторий GitHub для этого практического занятия, выполните следующую команду:

git clone https://github.com/googleworkspace/google-chat-samples

3. Создайте обработчики событий для Google Chat.

Создайте проект Apps Script.

Для создания проекта Apps Script выполните следующие действия:

  1. Перейдите в файл script.new .
  2. Нажмите на «Безымянный проект» .
  3. Переименуйте скрипт в приложение «Чат для учета посещаемости» и нажмите «Переименовать» .

События в Google Чате

Большинство взаимодействий Apps Script с чатом основаны на событиях. Взаимодействие между пользователем, приложением чата и самим чатом обычно происходит в следующей последовательности:

  1. Пользователь инициирует действие, например, добавляет приложение чата в пространство, начинает личное сообщение (DM) с помощью приложения чата или удаляет приложение чата из пространства.
  2. Данная акция запускает событие, ориентированное на приложение «Чат» внутри приложения «Чат».
  3. Чат вызывает соответствующий обработчик событий, определенный в скрипте приложения «Чат».

Чат генерирует 4 события, которые может отслеживать ваше приложение:

  • ADDED_TO_SPACE : Это событие происходит, когда пользователь добавляет приложение чата в пространство или отправляет личное сообщение (DM). В Apps Script для обработки этого события определяется функция onAddToSpace() .
  • REMOVED_FROM_SPACE : Это событие происходит, когда пользователь удаляет приложение Chat из пространства или личных сообщений. В ответ на это событие в Chat не отправляется никакая информация. В Apps Script для обработки этого события определяется функция onRemoveFromSpace() .
  • MESSAGE : Это событие происходит, когда пользователь отправляет сообщение в приложение «Чат», либо напрямую в личных сообщениях, либо в виде упоминания (@mention) в пространстве. В Apps Script вы определяете функцию onMessage() для обработки этого события.
  • CARD_CLICKED : Это событие происходит, когда пользователь нажимает кнопку с назначенным ей действием. В Apps Script для реагирования на это событие определяется функция onCardClick() .

Замените содержимое файла Code.gs следующим кодом, определяющим обработчики событий ADDED_TO_SPACE и REMOVE_FROM_SPACE . (Обработчики событий MESSAGE и CARD_CLICKED вы добавите позже в этом практическом занятии.)

Code.gs

/**
 * Responds to an ADDED_TO_SPACE event in Google Chat.
 * @param {object} event the event object from Google Chat
 * @return {object} JSON-formatted response
 * @see https://developers.google.com/workspace/chat/receive-respond-interactions
 */
function onAddToSpace(event) {
  console.info(event);
  var message = 'Thank you for adding me to ';
  if (event.space.type === 'DM') {
    message += 'a DM, ' + event.user.displayName + '!';
  } else {
    message += event.space.displayName;
  }
  return { text: message };
}

/**
 * Responds to a REMOVED_FROM_SPACE event in Google Chat.
 * @param {object} event the event object from Google Chat
 * @see https://developers.google.com/workspace/chat/receive-respond-interactions
 */
function onRemoveFromSpace(event) {
  console.info(event);
  console.log('Chat app removed from ', event.space.name);
}

4. Опубликуйте и протестируйте приложение чата.

Обновите файл манифеста скрипта.

Прежде чем опубликовать приложение в Chat, необходимо обновить манифест скрипта.

  1. Нажмите «Настройки проекта» . outline_settings_black_24dp.png .
  2. Установите флажок «Показать файл манифеста "appsscript.json" в редакторе» .
  3. Редактор кликов outline_code_black_24dp.png .
  4. Щелкните файл appsscript.json .
  5. Добавьте строку "chat": {} в файл манифеста.

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

appsscript.json

{
  "timeZone": "America/Los_Angeles",
  "dependencies": {
  },
  "chat": {}
}

Создайте проект в Google Cloud.

Прежде чем запускать и тестировать приложение «Чат», необходимо создать проект Google Cloud, включить и настроить API чата, а также опубликовать приложение «Чат» в своей организации Google Workspace.

  1. В консоли Google Cloud перейдите в меню. f5fbd278915eb7aa.png > IAM и администрирование > Создать проект .

  2. В поле «Название проекта» введите описательное название.
  3. При появлении запроса выберите Организацию и платежный аккаунт .
  4. Нажмите «Создать» .
  5. После завершения создания проекта в правом верхнем углу страницы появится уведомление. Щелкните по пункту « Создать проект: <Название проекта>» , чтобы открыть проект.
  6. Нажмите «Меню» f5fbd278915eb7aa.png > API и сервисы > Учетные данные .
  7. Нажмите на экран согласия OAuth .
  8. В поле «Название приложения» введите «Приложение для чата по учету посещаемости» .
  9. При появлении запроса введите адрес электронной почты службы поддержки пользователей и контактную информацию разработчика.
  10. Нажмите «Сохранить и продолжить» .
  11. Нажмите «Настройки и утилиты». 50fa7e30ed2d1b1c.png > Настройки проекта .
  12. Скопируйте номер проекта .
  13. Вернитесь в редактор App Script и нажмите «Настройки проекта» . outline_settings_black_24dp.png .
  14. В разделе «Проект Google Cloud Platform (GCP)» нажмите «Изменить проект» .
  15. Нажмите на номер проекта GCP и введите номер проекта.
  16. Нажмите «Установить проект» .

Опубликуйте приложение в чате.

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

  1. В редакторе Apps Script нажмите «Развернуть» > «Новое развертывание» .
  2. Рядом с пунктом «Выберите тип» нажмите «Включить типы развертывания». outline_settings_black_24dp.png .
  3. Выберите «Дополнение» и нажмите «Развернуть» .
  4. Скопируйте идентификатор развертывания и нажмите «Готово» .
  5. В консоли Google Cloud перейдите в меню. f5fbd278915eb7aa.png > API и сервисы > Библиотека .

  6. Найдите Google Chat API . Выберите API из списка результатов.
  7. На странице Google Chat API нажмите «Включить» .
  8. После включения API нажмите «Конфигурация» . Игнорируйте любые сообщения с просьбой создать учетные данные.
  9. На странице «Настройки» выполните следующие действия:
  • Снимите флажок «Создать это приложение чата как надстройку для рабочей области» и нажмите «ОТКЛЮЧИТЬ» для подтверждения.
  • В поле «Название приложения» введите «Приложение для чата по учету посещаемости» .
  • Для указания URL-адреса аватара введите https://goo.gl/kv2ENA .
  • В поле «Описание» введите Apps Script codelab Chat app .
  • В разделе «Функциональность» выберите «Получать сообщения один на один» .
  • В разделе «Настройки подключения» выберите проект Apps Script и вставьте идентификатор развертывания вашего скрипта в текстовое поле.
  • В разделе «Разрешения» выберите «Конкретные люди и группы в вашем домене» . В текстовом поле под раскрывающимся меню введите свой адрес электронной почты, связанный с вашей организацией Google Workspace.
  • Нажмите « Сохранить ».

После сохранения изменений убедитесь, что на странице Google Chat API статус приложения отображается как LIVE — доступно пользователям .

Протестируйте приложение для чата

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

  1. Откройте Google Чат .
  2. Отправьте новое личное сообщение в приложение «Чат», нажав кнопку «Начать чат». round_add_black_24dp.png > Найти приложения .
  3. На странице поиска приложений найдите приложение «Чат для учета посещаемости» .
  4. Рядом с приложением «Чат для учета посещаемости» нажмите «Добавить» > «Чат» .

Когда откроется чат личных сообщений, вы увидите сообщение от приложения «Чат» с благодарностью за добавление сообщения в личные сообщения, как показано на следующем изображении.

22ea6d660d72eeca.png

5. Определите формат ответа в виде карточки.

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

Ответы на карточки

Google Chat поддерживает использование карточек для ответов. Карточки — это визуальные контейнеры, позволяющие группировать наборы элементов пользовательского интерфейса. Карточки могут отображать заголовки, текстовые абзацы, наборы кнопок, изображения и текст в формате ключ/значение. Ваше приложение может определить одну или несколько карточек в своем JSON-ответе на запрос в Google Chat, который затем преобразует ваш ответ в соответствующие элементы пользовательского интерфейса.

На следующем изображении показан ответ в виде карточки, состоящий из трех разделов: заголовка, виджета «ключ/значение», виджета изображения и текстовой кнопки.

b5a194ed8d745ba9.png

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

Code.gs

const DEFAULT_IMAGE_URL = 'https://goo.gl/bMqzYS';
const HEADER = {
  header: {
    title : 'Attendance Chat app',
    subtitle : 'Log your vacation time',
    imageUrl : DEFAULT_IMAGE_URL
  }
};

/**
 * Creates a card-formatted response.
 * @param {object} widgets the UI components to send
 * @return {object} JSON-formatted response
 */
function createCardResponse(widgets) {
  return {
    cards: [HEADER, {
      sections: [{
        widgets: widgets
      }]
    }]
  };
}

/**
 * Responds to a MESSAGE event triggered
 * in Google Chat.
 *
 * @param event the event object from Google Chat
 * @return JSON-formatted response
 */
function onMessage(event) {
  const userMessage = event.message.text;

  const widgets = [{
    "textParagraph": {
      "text": "You said: " + userMessage
    }
  }];

  return createCardResponse(widgets);
}

Функция onMessage() , добавленная на этом шаге, считывает исходное сообщение пользователя и формирует ответ в виде простого виджета TextParagraph . Затем функция onMessage() вызывает createCardResponse() , которая помещает виджет TextParagraph в раздел одной карточки. Приложение чата возвращает объект JavaScript, созданный с помощью ответа на карточку, обратно в Google Chat.

Протестируйте приложение для чата

Чтобы протестировать это приложение, вернитесь в личные сообщения в Google Chat и напишите сообщение (подойдет любое).

e12417d9aa7e177c.png

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

Для получения дополнительной информации о структуре объектов событий, отправляемых Google Chat, см. справочник по форматам событий .

6. Реагируйте на нажатия кнопок в карточках.

На предыдущем шаге ваше приложение «Чат» ответило на сообщение пользователя — событие MESSAGE — простой карточкой, содержащей виджет TextParagragh . На этом шаге вы создаете ответ, включающий кнопки, для каждой из которых определено пользовательское действие.

Интерактивные карты

В ответах в виде карточек могут содержаться кнопки двух типов: текстовые кнопки, отображающие только текстовые кнопки; и кнопки с изображением, отображающие кнопку с простым значком или изображением без текста. Как текстовые кнопки, так и кнопки с изображением поддерживают одно из двух действий onClick (как определено в JSON-ответе, отправленном в Google Chat): openLink или action . Как следует из названия, openLink открывает указанную ссылку в новой вкладке браузера.

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

Указание объекта action для кнопки создает интерактивную карточку . Когда пользователь нажимает кнопку в сообщении, Google Chat генерирует событие CARD_CLICKED и отправляет запрос обратно приложению, отправившему исходное сообщение. Затем приложению необходимо обработать событие, сгенерированное Google Chat, и вернуть ответ в пространство.

Замените функцию onMessage() в Code.gs следующим кодом. Этот код создаст две кнопки: « Установить отпуск в Gmail» и «Заблокировать день в календаре» в карточке, отправленной в чат Google.

Code.gs

const REASON = {
  SICK: 'Out sick',
  OTHER: 'Out of office'
};
/**
 * Responds to a MESSAGE event triggered in Google Chat.
 * @param {object} event the event object from Google Chat
 * @return {object} JSON-formatted response
 */
function onMessage(event) {
  console.info(event);
  const reason = REASON.OTHER;
  const name = event.user.displayName;
  const userMessage = event.message.text;

  // If the user said that they were 'sick', adjust the image in the
  // header sent in response.
  if (userMessage.indexOf('sick') > -1) {
    // Hospital material icon
    HEADER.header.imageUrl = 'https://goo.gl/mnZ37b';
    reason = REASON.SICK;
  } else if (userMessage.indexOf('vacation') > -1) {
    // Spa material icon
    HEADER.header.imageUrl = 'https://goo.gl/EbgHuc';
  }

  const widgets = [{
    textParagraph: {
      text: 'Hello, ' + name + '.<br/>Are you taking time off today?'
    }
  }, {
    buttons: [{
      textButton: {
        text: 'Set vacation in Gmail',
        onClick: {
          action: {
            actionMethodName: 'turnOnAutoResponder',
            parameters: [{
              key: 'reason',
              value: reason
            }]
          }
        }
      }
    }, {
      textButton: {
        text: 'Block out day in Calendar',
        onClick: {
          action: {
            actionMethodName: 'blockOutCalendar',
            parameters: [{
              key: 'reason',
              value: reason
            }]
          }
        }
      }
    }]
  }];
  return createCardResponse(widgets);
}

Для обработки события CARD_CLICKED необходимо добавить функцию onCardClick() в скрипт вашего чат-приложения. Добавьте следующий код, определяющий функцию onCardClick() : Code.gs

Code.gs

/**
 * Responds to a CARD_CLICKED event triggered in Google Chat.
 * @param {object} event the event object from Google Chat
 * @return {object} JSON-formatted response
 * @see https://developers.google.com/workspace/chat/receive-respond-interactions
 */
function onCardClick(event) {
  console.info(event);
  let message = '';
  const reason = event.action.parameters[0].value;
  if (event.action.actionMethodName == 'turnOnAutoResponder') {
    turnOnAutoResponder(reason);
    message = 'Turned on vacation settings.';
  } else if (event.action.actionMethodName == 'blockOutCalendar') {
    blockOutCalendar(reason);
    message = 'Blocked out your calendar for the day.';
  } else {
    message = "I'm sorry; I'm not sure which button you clicked.";
  }
  return { text: message };
}

В ответ на клики пользователя приложение «Чат» теперь выполняет одно из двух действий: устанавливает в Gmail в качестве автоматического ответа на сообщение «нет на рабочем месте» или планирует встречу на весь день в календаре пользователя. Для выполнения этих задач приложение вызывает расширенную службу Gmail и службу календаря .

Добавьте следующий код в свой скрипт, чтобы интегрировать приложение «Чат» с Gmail и Календарем.

Code.gs

const ONE_DAY_MILLIS = 24 * 60 * 60 * 1000;
/**
 * Turns on the user's vacation response for today in Gmail.
 * @param {string} reason the reason for vacation, either REASON.SICK or REASON.OTHER
 */
function turnOnAutoResponder(reason) {
  let currentTime = (new Date()).getTime();
  Gmail.Users.Settings.updateVacation({
    enableAutoReply: true,
    responseSubject: reason,
    responseBodyHtml: "I'm out of the office today; will be back on the next business day.<br><br><i>Created by Attendance Chat app!</i>",
    restrictToContacts: true,
    restrictToDomain: true,
    startTime: currentTime,
    endTime: currentTime + ONE_DAY_MILLIS
  }, 'me');
}

/**
 * Places an all-day meeting on the user's Calendar.
 * @param {string} reason the reason for vacation, either REASON.SICK or REASON.OTHER
 */
function blockOutCalendar(reason) {
  CalendarApp.createAllDayEvent(reason, new Date(), new Date(Date.now() + ONE_DAY_MILLIS));
}

Наконец, необходимо включить расширенную службу Gmail в проекте. Для включения API Gmail выполните следующие действия:

  1. В редакторе Apps Script рядом с пунктом «Службы» нажмите «Добавить службу». round_add_black_24dp.png .
  2. Выберите API Gmail .
  3. Нажмите на кнопку «Панель управления API Google Cloud Platform» ниже, чтобы открыть консоль Google Cloud .
  4. Нажмите «Включить API и сервисы» .
  5. Найдите Gmail API и нажмите на ссылку Gmail API.
  6. На странице API Gmail нажмите «Включить» .

Протестируйте приложение для чата

Чтобы протестировать эту версию вашего приложения для чата, откройте личное сообщение, которое вы создали на предыдущих шагах в Google Chat , и напишите: «Я уезжаю в отпуск» . Приложение должно ответить карточкой, похожей на изображение ниже.

Примечание: Если вас попросят предоставить доступ к приложению, вам, возможно, придётся ввести сообщение ещё раз.

c0e8d9d0b5d0cf8b.png

7. Поздравляем!

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

Что мы рассмотрели

  • Создал и опубликовал приложение Google Chat с помощью Apps Script.
  • Отвечал на сообщения пользователей простым ответом.
  • Взаимодействовал с другими сервисами Google Workspace от имени пользователя через приложение «Чат».

Узнать больше