Как настроить работу Телеграм-бота с Google Sheets
Разные команды в REG.RU пользуются чат-ботами в Телеграме. SEO-команда оперативно отслеживает изменения на сайте, руководители клиентских служб мониторят работу своего отдела, а сотрудники техподдержки могут посмотреть график работы на день/неделю без авторизации во внутренних сервисах, что очень удобно, если сотрудник, например, за городом.

Часто подобные боты имеют несложное устройство. Например, они могут загружать для работы из Google-таблиц список товаров с ценами и количеством, имена работников отдела с указанием времени работы/отпуска. Сегодня разберемся, как сделать такого чат-бота.

В продолжение статьи о создании Телеграм-бота расскажем, как настроить совместную работу бота и Google Sheets API v4 вместе со специалистами команды вёрстки REG.RU Анной К. и Виктором Ш.

Попробуем научиться получать данные из нашей Google-таблицы, в которой, например, указаны дни рождения наших друзей. Мы хотим, чтобы бот в ответ на имя друга подсказывал его день рождения. Начнем!
Настройка Google API
После загрузки разместим json-файл в корне проекта по Телеграм-бота и переименуем, например, в credentials.json. Не забудьте указать этот файл в перечне.gitignore!

В настройках доступа Google-таблицы предоставим сервисному аккаунту права на редактирование. Для этого нужно добавить в список пользователей почту сервисного аккаунта.

Теперь напишем код для аутентификации.
Заходим в консоль настройки Google API и создаем проект.
В меню «Учетные данные» нажимаем "Создать учетные данные"‎.
Через сервисный аккаунт мы будем соединять бота и таблицу. Указываем название аккаунта, роли, предоставляем пользователям доступ к сервисному аккаунту, если это необходимо.
Готово!

Заходим на сервисный аккаунт
и выбираем "Создать ключ"‎.
Выбираем нужный нам формат. Мы оставим рекомендуемый json.
Запускаем код
Для запуска используем библиотеку для работы с ботом Telegraf и сделаем так, чтобы при получении текста бот выполнял функцию saysBirthday из файла saysBirthday.js.












В файле saysBirthday.js напишем наш код и проверим:
















Отлично, бот отзывается. Теперь научим его получать из таблицы дни рождения.
Получаем данные из таблицы
Исправим файл saysBirthday.js. Добавим в код библиотеку googleapis и функцию аутентификации Google.



Используя функцию getAuthClient, создадим клиента для работы с API Google Sheets.









Теперь получим лист нашей таблицы с днями рождения друзей.







Используем метод API spreadsheets.get — укажем spreadsheetId (берем из URL таблицы с данными) и остальные необходимые параметры.











Теперь получим эти данные из функции saysBirthday, которую бот выполняет при вводе любого текста. В качестве второго аргумента "range"‎ передаем название листа Google-таблицы "Дни рождения"‎.








Запустим и проверим, какие данные появились в консоли:








Можно проверить, что за массив в rowData. Выведем в консоль значения sheet.data[0].rowData:









Посмотрим, что лежит, например, во втором элементе массива — выведем в консоль sheet.data[0].rowData[1].












Отлично, мы выяснили, что в каждом элементе из массива sheet.data[0].rowData в values лежит информация об имени друга и его дне рождения. Давайте научим бота правильно отвечать на основе этой информации.

Напишем функцию, которая ищет соответствие введенного имени друга строке в таблице.








И используем эту функцию в saysBirthday. Найдем день рождения друга в массиве данных sheet.data[0].rowData, исходя из найденного индекса в функции findRowIndex.













Поправим текст, который бот выдает на старте.





Проверяем работу функции.









Еще немного модернизируем код на случай, если имя друга в таблице не будет найдено.















Отлично! Бот работает так, как мы задумали.

Это простейший пример для начала работы с Google Sheets API v4. Разобравшись, какой формат данных возвращает метод spreadsheets.get, попробуйте получить данные с помощью метода spreadsheets.values.get. Он возвращает данные меньшего объема и меньшей вложенности, но вполне подойдёт, если не нужно считывать и записывать данные о форматировании ячеек. Советуем изучить документацию, с помощью которой можно будет реализовывать более сложную логику, переписывать значения ячеек и форматировать их.


Материал предоставлен нашим партнером HTML Academy.