Пример Бота для записи на услугу на Google App Script от iMakeBots.ru
t.meНе мог не попробовать потестировать Google App Script в паре с Google Calendar. Было интересно также поработать в JavaScript с объектами класса Date
. Есть конечно нюансы, к которым привыкаешь быстро, но в начале вообще не мог понять откуда выпадают исключения? Почему не работает? ...
На самом деле все просто, нужно читать мануалы - там все расписано.
Получился бот для записи на услугу.
При старте пользователю выводиться информация в текстовом формате, можно прикрепить картинку. Кнопки Записаться и Мои записи.
Что было интересного в этом проекте:
Ну конечно же это форма записи, которая состоит из 5 шагов:
- Выбор даты
- Выбор времени
- Телефон
- ФИО
- Выбор типа оплаты
При выводе шага выбора даты, нужно выводить дни месяца в формате календаря
Необходимо было обязательно учесть некоторые моменты:
- По каждому дню проверить наличие времени для записи
- Учесть на какое максимальное количество дней возможна запись, в моем примере это 90 дней вперед
- Учесть текущее время при проверке, чтобы не показывать текущий день если в нем например уже нет времени для записи
Режим работы
workHours: ["09:00", "17:00"],
serviceDurationInMinutes: 30,
afterToday: 90
где:
- workHours - это режим работы
- serviceDurationInMinutes - длительность услуги в минутах
- afterToday - на сколько дней вперед от текущей даты можно записаться
Выходные и обеденный перерыв можно указать в самом Google календаре (используйте возможности повтора события), при выводе формы в боте это будет учтено.
Установка бота
Из новых настроек, которых нет в предыдущих примерах (в других статьях) появился только идентификатор календаря calendar: ""
, который по умолчанию равен логину учетной записи Google, если вы создадите новый календарь в учетной записи Google, искать нужно в настройках календаря в разделе Интеграция календаря
/ Идентификатор календаря
В остальном также как и в установке примера Бот-магазин - в статье есть видео-инструкция.
Откройте по ссылке или QR бот @iMakeBot, нажмите кнопку Старт/Start.
Следуйте инструкциям бота.
Доброго времени суток, для чего нужен файл BotAppointment с настройками роутера, куда его?
При первой отладке initApp выводит
Invalid argument: id
Добрый вечер, благодарю Вас за инструкцию, все успешно развернулось, но при старте бота выдает сообщение: "Раздел не наполнен", и к сожалению молчит... все необходимые поля заполнены, идентификатор календаря, в виде логина на почту Жмеил присутствует, подскажите пожалуйста, куда копать ?
Направьте боту команду:
/admin
Благодарю Вас, все запустилось, но появилась новая проблема, когда стартую бота на альтернативной учетной записи, не отображается календарь, для записи. Но с учетки админа, все ок, имеется возможность просмотра, кто и когда записался на услугу. Подскажите, как быть при данной ситуации ?
Добрый день, при нажатии "Записаться" ничего не происходит. В логах пишет
{"update_id":361837277,"message":{"message_id":91,"from":{"id":*********,"is_bot":false,"first_name":"Аlexander","username":"******","language_code":"ru"},"chat":{"id"::*********,"first_name":"Аlexander","username":"******","type":"private"},"date":1680448884,"text":"Записаться"}}
Cannot read properties of null (reading 'getEvents')
В чем может быть проблема? Заранее спасибо.
Возможно календарь не привязали, не может получить события
Добрый день. Отличный материал. Подскажите, пожалуйста в чем может быть ошибка. При старте бота выдает сообщение: "Раздел не наполнен". Направляю боту команду: /admin, но пишет, что доступ запрещен. Понимаю, что admin_uid не воспринимает. Беру его с листа Users созданной таблицы из колонки uid. Вроде бы все верно, но упорно не хочет воспринимать меня администратором. Что не так делаю? В календаре вносит записи и на уровне пользователя всё отрабатывает, а права администратора не хочет предоставлять?!
После изменения настроек - пересобрали приложение?
Да. Уже развертываю раз 30
Покажите как у вас записана настройка admin_uid
admin_uid: 9044617**,
Последние цифры предполагаю у Вас есть.
Уже и пытался по другому администратора определить. В файле config в строке admin_uid: "myname" записывал, а в файле BotAppointment менял проверку в строке return config.admin_uid === this.user.uid; на return config.admin_uid === this.user.name; записывал. Не помогает.
Попробуйте залогировать вызов метода isAdmin
Сделал. Развернул приложение. Также на команду /admin пишет, что доступ запрещен
Проверил у себя на уже развернутом боте - все норм работает.
Что могло сломаться?
А Вы используете BotAppointment.min или BotAppointment?
Разобрался. Последовательность такая если делаем новое развертывание:
1. Проводим Новое развёртывание
2. Записываем новый webhook
3. Сохраняем
4. Выполняем SetWebHook
5. Делаем благодарность автору за титанические труды!
Спасибо Вам огромное.
Спасибо))
Странно - получается теперь меняется url приложения при развертывании?
Да. Нужно в пункте Новое развертывание нажимать Управление развертываниями и далее переходить к редактированию через нажатие кнопки (карандаша) и тогда url не меняется.
Если урл не меняется тогда зачем нужно делать перезапись вебхук?
Тогда дело не в перезаписывании вебхука.
После изменения настроек или правки кода нужно пересобрать приложение. Если это делать через Начать развертывание далее Управление развертываниями и далее переходить к редактированию и далее Начать развертывание, то тогда url не меняется. А вот если делать Новое развертывание и далее Новое развёртывание, то url веб-приложения меняется и вот тогда в этом случае делать в той последовательности, что я написал. Ну как-то так.
Все, понял)))
Вы создавали новое, и там понятно вебхук был на старое приложение настроен
Я всегда редактировал развертывание.
Тогда получется, код рабочий из коробки. Я за это переживал)))
Добрый день! Бот отвечает с задержкой в примерно 5 секунд - это нормально или есть какая-то проблема?
Да, с этой логикой выборки данных из таблицы нормально. Это была попытка применять обычные методы взаимодействия с хранением данных как с СУБД. Но таблицы это немного другое оказалось.
Уже есть пример как это можно ускорить. И если к этому использовать кеширование, то можно добиться еще более лучшего результата.
Спасибо за оперативную связь, буду пробовать:)