Где хранить данные для небольшого телеграм бота? Конечно в гугл таблицах.
Если ты заскочил быстренько прочитать какой-то материал и уйти, то скорее всего я тебя разочарую… Ничего не получится. Это цикл статей призванный научить не только разработке телеграм бота, но также и разработке требований к программному обеспечению. Поэтому тебе вначале нужно отставить всю свою торопливость в сторону, сходить за кофе или чаем и перейти к началу изучения материала. Только не мухлюй, вначале все прочитай, а затем возвращайся, иначе этот материал будет непонятен.
Маршрутизатор для регистрации сотрудника и рассылки
В прошлой статье ма разобрали одну маршрутизируемую функцию, которая распределяла потоки информации от команд отправляемых пользователем в боте. Но кроме команд пользователь отправляет еще и обычный текст, поэтому все эти запросы отправляются на функцию setNameInTheStatement(message). Рассмотрим её.
Чтобы понять первое условие данной функции, необходимо напомнить структуру вкладки users, с которой работает данная функция и весь файл с кодом в целом посвящен ей.
Согласно условию мы проверяем столбик E через функцию getValueFromCell(`E${lastRow}). Напоминаю, что когда пользователь отправил команду /start, то в таблицу записывается информация о пользователе: идентификатор чата; уникальное имя пользователя; имя, которое светится в чате. А вот в ведомости нужно полноценное Ф.И.О. Поэтому необходимо пользователю в следующем сообщении после команды написать свое полное имя. Для этого и производится проверка.
Если поле пустое, то в него записывается значение от пользователя, если же там уже есть запись, то пользователю сообщают об этом.
Теперь рассмотрим код каждой функции, которая здесь вызывается. Будем двигаться сверху вниз.
Такие функции комментировать не вижу смысла, они рассматривались в первой статье. Я просто показываю их содержимое, чтобы собрать весь код воедино.
Следующая функция записи данных в ячейку.
Двигаемся дальше и подходим к следующей функции, которая проверяет, является ли пользователь руководителем. Данная функция необходима для того, чтобы позволить руководителю отправлять служебные данные для формирования новой рассылки.
Чтобы определить, пишет ли обычное сообщение в бот: руководитель или просто сотрудник мы вводим в таблицу еще один рабочий столбец, где напротив строки руководителя ставится цифра 1.
Если идентификатор чата пользователя, от которого пришло сообщение совпадает со строкой, в которой в столбце F было значение 1, то это сообщение уходит в следующую функцию, которую мы сейчас будем рассматривать.
Это самая большая функция этого файла, все остальные функции вспомогательные для неё. Описывать её построчно нет смысла, она достаточно подробна описана в названиях переменных и функций. Обсудим её концепцию.
Мы двигаемся строго по тем требованиям, которые описаны в документе о концепциях и границах, а там указано, что должно быть три шага:
- Отправка команды /send;
- Отправка названия вкладки месяца;
- Отправка числа 1, если необходимо отправить за первую часть месяца или 2 за вторую.
Для того, чтобы контролировать все шаги и хранить данные на каждом этапе определим во вкладке таблицы столбцы для служебной информации.
Разберем для чего они нужны:
- Запущена отправка - чтобы запустить процесс рассылки, то руководителю необходимо отправить команду /send, а нам необходимо знать, что процесс рассылки запущен. Для этого в строке руководителя в данном столбце ставится значение 1;
- Шаг - напоминаю, что у нас три шага и нам необходимо понимать, на каком именно шаге сейчас находится руководитель;
- Вкладка - здесь сохраняется название вкладки месяца, которую отправит руководитель во втором запросе;
- Часть месяца - думаю само за себя говорит, здесь будет храниться значение отправляемое руководителем в третьем запросе.
Проверка статуса руководителя осуществляется через эту функцию.
Если ячейка пуста, то мы понимаем, что только что была отправлена команда /send, иначе мы знаем, что переходим ко второму этапу. В таком случае вызываем функцию, которая вносит изменения в служебную информацию.
На втором шаге мы проверяем является ли отправленное название вкладки настоящим.
Покажу сразу две информативные функции, которые позволяют руководителю не оставаться в слепоте происходящих событий. Одна функция отправляет информацию о том, что отправка началась, а вторая оповещает о завершении рассылки.
После того, как началась отправка, то начинается процесс сбора данных, в первую очередь определяется список городов из ведомости.
Здесь есть функция getListOfCitiesInTab, которая возвращает ассоциативных массив из таких пар ключей:
город : {
с какой строки начинается: номер строки,
какой строкой заканчивается: номер строки
}
Но эту функцию мы будем разбирать в следующем файле, а значит в следующей строке. Пока знайте, что оттуда возвращается такая структура.
Раз есть список городов и границы их строк, то можно собирать данные.
Здесь все просто, мы пробегаемся циклом по каждому городу, выделяем границы города в таблице и передаем в функцию, которая возвращает нам соответствующую сборку.
Функция getCurrentLinesByCityForSending используется в другом файле, поэтому её мы разберем в следующей статье.
После того как данные будут собраны, то обновляем служебную информацию в таблице.
После этого осуществляем рассылку.
Пробегаясь по каждому городу мы запускаем второй цикл, который пробегает по количеству сотрудников в городе, затем отправляются данные по шаблону используя функцию sendingDataToTheEmployeeForTheCurrentPartOfTheMonth. Но эта функция также будет рассмотрена в следующей статье.
Заключительная функция обнуляет все служебные данные.
В следующей статье мы рассмотрим заключительный файл, который отвечает за работу со вкладкой месяца.
Подписывайся, чтобы ничего не пропустить.