Частный заказчик вёл рабочий график в Google Таблице и просил напоминания из неё в Telegram.
В таблице лежали даты - продления, оплаты, отчёты, звонки. Всё это держалось в голове.
Календарь он пробовал, но данные всё равно жили в таблице, а дублировать одно и то же в двух местах бросил через неделю.
Одна пропущенная дата стоила денег - слетело продление и сервис отключили в неудачный момент.
Условие поставил такое: таблицу не переделываем, колонки остаются как есть, бот подстраивается под то, что уже ведётся.
Сделал бота на Python и aiogram 3, к таблице подключился через Google Sheets API по сервисному аккаунту - заказчик выдал доступ на его почту.
Колонки не переименовывались, бот читает шапку и сам находит, где дата, где название события, где ответственный.
Опрос таблицы по расписанию через APScheduler, раз в час. Поправил строку - через час бот уже знает новое.
Напоминания за N дней и в день события, N задаётся отдельной колонкой в самой таблице, то-есть у каждой строки свой срок.
Повторяющиеся события - раз в месяц, раз в квартал, раз в год. Следующую дату бот считает сам после отметки.
В сообщении кнопка сделано. Нажатие проставляет дату и отметку обратно в ту же строку, напоминание больше не приходит.
Отложить на день или на неделю тоже кнопкой.
Дубли закрыл отдельно - отправленные напоминания пишутся в локальную базу ключом строка плюс дата, перезапуск бота их повторно не шлёт.
Битая или пустая ячейка с датой бота не роняет, такая строка уходит владельцу в отчёт об ошибках.
Часовой пояс и время утренней сводки задаются в настройках, сводка на день приходит одним сообщением.
График остался в таблице, а держать даты в голове больше не нужно - бот приходит сам и приносит то, что на сегодня.
Отметка о выполнении возвращается в таблицу, то-есть второго места учёта не появилось.
Периодичность и сроки заказчик правит прямо в ячейках, без обращений ко мне.
Продления и оплаты перестали проскакивать, за первые месяцы ни одной пропущенной даты.
Утренняя сводка заменила ручной просмотр таблицы, день начинается с одного сообщения со всеми датами.
Позже докрутил вторую таблицу под личные даты и дублирование напоминания в общий чат, чтобы его видел не один владелец.