Найти в Дзене
КиберMamedov 💻🔥

Регистрация в телеграм боте через гугл-таблицы

Где хранить данные для небольшого телеграм бота? Конечно в гугл таблицах. Если ты заскочил быстренько прочитать какой-то материал и уйти, то скорее всего я тебя разочарую… Ничего не получится. Это цикл статей призванный научить не только разработке телеграм бота, но также и разработке требований к программному обеспечению. Поэтому тебе вначале нужно отставить всю свою торопливость в сторону, сходить за кофе или чаем и перейти к началу изучения материала. Только не мухлюй, вначале все прочитай, а затем возвращайся, иначе этот материал будет непонятен. Маршрутизатор для регистрации сотрудника и рассылки В прошлой статье ма разобрали одну маршрутизируемую функцию, которая распределяла потоки информации от команд отправляемых пользователем в боте. Но кроме команд пользователь отправляет еще и обычный текст, поэтому все эти запросы отправляются на функцию setNameInTheStatement(message). Рассмотрим её. Чтобы понять первое условие данной функции, необходимо напомнить структуру вкладки users,

Где хранить данные для небольшого телеграм бота? Конечно в гугл таблицах.

Регистрация в телеграм боте через гугл таблицы
Регистрация в телеграм боте через гугл таблицы

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

Маршрутизатор для регистрации сотрудника и рассылки

В прошлой статье ма разобрали одну маршрутизируемую функцию, которая распределяла потоки информации от команд отправляемых пользователем в боте. Но кроме команд пользователь отправляет еще и обычный текст, поэтому все эти запросы отправляются на функцию setNameInTheStatement(message). Рассмотрим её.

Код функции setNameInTheStatement
Код функции setNameInTheStatement

Чтобы понять первое условие данной функции, необходимо напомнить структуру вкладки users, с которой работает данная функция и весь файл с кодом в целом посвящен ей.

Структура вкладки users
Структура вкладки users

Согласно условию мы проверяем столбик E через функцию getValueFromCell(`E${lastRow}). Напоминаю, что когда пользователь отправил команду /start, то в таблицу записывается информация о пользователе: идентификатор чата; уникальное имя пользователя; имя, которое светится в чате. А вот в ведомости нужно полноценное Ф.И.О. Поэтому необходимо пользователю в следующем сообщении после команды написать свое полное имя. Для этого и производится проверка.

Если поле пустое, то в него записывается значение от пользователя, если же там уже есть запись, то пользователю сообщают об этом.

Теперь рассмотрим код каждой функции, которая здесь вызывается. Будем двигаться сверху вниз.

Функция для получения значения из указанной ячейки по столбцу и номеру строки, например E4
Функция для получения значения из указанной ячейки по столбцу и номеру строки, например E4

Такие функции комментировать не вижу смысла, они рассматривались в первой статье. Я просто показываю их содержимое, чтобы собрать весь код воедино.

Следующая функция записи данных в ячейку.

Функция записывает данные в ячейку по её адресу передаваемом в аргументе cell
Функция записывает данные в ячейку по её адресу передаваемом в аргументе cell

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

Функция проверки статуса руководителя
Функция проверки статуса руководителя

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

Новый столбец для обозначения руководителя
Новый столбец для обозначения руководителя

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

Функция описывающая шаги
Функция описывающая шаги

Это самая большая функция этого файла, все остальные функции вспомогательные для неё. Описывать её построчно нет смысла, она достаточно подробна описана в названиях переменных и функций. Обсудим её концепцию.

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

  1. Отправка команды /send;
  2. Отправка названия вкладки месяца;
  3. Отправка числа 1, если необходимо отправить за первую часть месяца или 2 за вторую.

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

Новые служебные столбцы для хранения данных
Новые служебные столбцы для хранения данных

Разберем для чего они нужны:

  1. Запущена отправка - чтобы запустить процесс рассылки, то руководителю необходимо отправить команду /send, а нам необходимо знать, что процесс рассылки запущен. Для этого в строке руководителя в данном столбце ставится значение 1;
  2. Шаг - напоминаю, что у нас три шага и нам необходимо понимать, на каком именно шаге сейчас находится руководитель;
  3. Вкладка - здесь сохраняется название вкладки месяца, которую отправит руководитель во втором запросе;
  4. Часть месяца - думаю само за себя говорит, здесь будет храниться значение отправляемое руководителем в третьем запросе.

Проверка статуса руководителя осуществляется через эту функцию.

Проверка статуса руководителя
Проверка статуса руководителя

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

Вносим информацию  о первом шаге
Вносим информацию о первом шаге

На втором шаге мы проверяем является ли отправленное название вкладки настоящим.

Функция проверяет существование месячной вкладки
Функция проверяет существование месячной вкладки

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

Информационные функции
Информационные функции

После того, как началась отправка, то начинается процесс сбора данных, в первую очередь определяется список городов из ведомости.

Получение списка городов
Получение списка городов

Здесь есть функция getListOfCitiesInTab, которая возвращает ассоциативных массив из таких пар ключей:

город : {

с какой строки начинается: номер строки,

какой строкой заканчивается: номер строки

}

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

Раз есть список городов и границы их строк, то можно собирать данные.

Получаем актуальные данные по каждому городу
Получаем актуальные данные по каждому городу

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

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

После того как данные будут собраны, то обновляем служебную информацию в таблице.

Обновляем информацию о шаге и части месяца
Обновляем информацию о шаге и части месяца

После этого осуществляем рассылку.

Функция для рассылки данных сотрудникам об их ЗП
Функция для рассылки данных сотрудникам об их ЗП

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

Заключительная функция обнуляет все служебные данные.

Обнуление всех служебных данных
Обнуление всех служебных данных

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

Подписывайся, чтобы ничего не пропустить.