Пример бота для записи на услугу в Google Календарь

Использование Google Calendar в качестве ведения записи на оказываемую услугу. Учет режима работы, продолжительности услуги.

Не мог не попробовать потестировать Google App Script в паре с Google Calendar. Было интересно также поработать в JavaScript с объектами класса Date. Есть конечно нюансы, к которым привыкаешь быстро, но в начале вообще не мог понять откуда выпадают исключения? Почему не работает? ...

На самом деле все просто, нужно читать мануалы - там все расписано.

Получился бот для записи на услугу.

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

Что было интересного в этом проекте:

Ну конечно же это форма записи, которая состоит из 5 шагов:

  1. Выбор даты
  2. Выбор времени
  3. Телефон
  4. ФИО
  5. Выбор типа оплаты

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

Необходимо было обязательно учесть некоторые моменты:

  1. По каждому дню проверить наличие времени для записи
  2. Учесть на какое максимальное количество дней возможна запись, в моем примере это 90 дней вперед
  3. Учесть текущее время при проверке, чтобы не показывать текущий день если в нем например уже нет времени для записи

Режим работы

workHours: ["09:00", "17:00"],
serviceDurationInMinutes: 30,
afterToday: 90

где:

  1. workHours - это режим работы
  2. serviceDurationInMinutes - длительность услуги в минутах
  3. afterToday - на сколько дней вперед от текущей даты можно записаться

Выходные и обеденный перерыв можно указать в самом Google календаре (используйте возможности повтора события), при выводе формы в боте это будет учтено. 

Расписывать код примера здесь не буду, практически все кто заглядывает на этот сайт ищут готовые решения, и только некоторым интересен сам процесс создания бота. Им предлагаю скачать файлы бота и посмотреть исходный код - все прокомментировано в лучших традициях. Если возникнут вопросы - welcome to forum!

Установка бота

Из новых настроек, которых нет в предыдущих примерах (в других статьях) появился только идентификатор календаря calendar: "" , который по умолчанию равен логину учетной записи Google, если вы создадите новый календарь в учетной записи Google, искать нужно в настройках календаря в разделе Интеграция календаря / Идентификатор календаря

В остальном также как и в установке примера Бот-магазин - в статье есть видео-инструкция.

Исходники BotAppointment.zip
36.2
26 комментариев
Авторизуйтесь через Telegram, чтобы оставить комментарий.
Откройте по ссылке или QR бот @iMakeBot, нажмите кнопку Старт/Start.
Следуйте инструкциям бота.

  • Mikhail Belousov [1 год назад]

    Доброго времени суток, для чего нужен файл BotAppointment с настройками роутера, куда его? 

  • Mikhail Belousov [1 год назад]

    При первой отладке initApp выводит
    Invalid argument: id

  • Eu V [1 год назад]

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

  • iMakeBots [1 год назад → Eu V]

    Направьте боту команду: /admin

  • Eu V [1 год назад → iMakeBots]

    Благодарю Вас, все запустилось, но появилась новая проблема, когда стартую бота на альтернативной учетной записи, не отображается календарь, для записи. Но с учетки админа, все ок, имеется возможность просмотра, кто и когда записался на услугу. Подскажите, как быть при данной ситуации ?

  • Аlexander [1 год назад]

    Добрый день, при нажатии "Записаться" ничего не происходит. В логах пишет

    {"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')

    В чем может быть проблема? Заранее спасибо.

  • iMakeBots [1 год назад → Аlexander]

    Возможно календарь не привязали, не может получить события

  • Next [1 год назад]

    Добрый день. Отличный материал. Подскажите, пожалуйста в чем может быть ошибка.  При старте бота выдает сообщение: "Раздел не наполнен". Направляю боту команду: /admin, но пишет, что доступ запрещен. Понимаю, что admin_uid не воспринимает. Беру его с листа Users созданной таблицы из колонки uid. Вроде бы все верно, но упорно не хочет воспринимать меня администратором. Что не так делаю? В календаре вносит записи и на уровне пользователя всё отрабатывает, а права администратора не хочет предоставлять?!

  • iMakeBots [1 год назад → Next]

    После изменения настроек - пересобрали приложение?

  • Next [1 год назад → iMakeBots]

    Да. Уже развертываю раз 30

  • iMakeBots [1 год назад → Next]

    Покажите как у вас записана настройка admin_uid

    // ...
    admin_uid: 0,
    // ...
  • Next [1 год назад → iMakeBots]

    admin_uid: 9044617**,

    Последние цифры предполагаю у Вас есть.

  • Next [1 год назад]

    Уже и пытался по другому администратора определить. В файле config в строке admin_uid: "myname" записывал, а в файле BotAppointment менял проверку в строке return config.admin_uid === this.user.uid; на return config.admin_uid === this.user.name; записывал. Не помогает.

  • iMakeBots [1 год назад → Next]

    Попробуйте залогировать вызов метода isAdmin

  • Next [1 год назад → iMakeBots]

    Сделал. Развернул приложение. Также на команду /admin пишет, что доступ запрещен

  • iMakeBots [1 год назад → Next]

    Проверил у себя на уже развернутом боте - все норм работает.

    Что могло сломаться?

  • Next [1 год назад → iMakeBots]

    А Вы используете BotAppointment.min или BotAppointment?

  • Next [1 год назад]

    Разобрался. Последовательность такая если делаем новое развертывание:

    1. Проводим Новое развёртывание

    2. Записываем новый webhook

    3. Сохраняем

    4. Выполняем SetWebHook

    5. Делаем благодарность автору за титанические труды!

    Спасибо Вам огромное.

  • iMakeBots [1 год назад → Next]

    Спасибо))

    Странно - получается теперь меняется url приложения при развертывании? 

  • Next [1 год назад → iMakeBots]

    Да. Нужно в пункте Новое развертывание нажимать Управление развертываниями и далее переходить к редактированию через нажатие кнопки (карандаша) и тогда url  не меняется.

  • iMakeBots [1 год назад → Next]

    Если урл не меняется тогда зачем нужно делать перезапись вебхук?

    Тогда дело не в перезаписывании вебхука.

  • Next [1 год назад → iMakeBots]

    После изменения настроек или правки кода нужно пересобрать приложение. Если это делать через Начать развертывание далее Управление развертываниями и далее переходить к редактированию и далее Начать развертывание, то тогда url не меняется. А вот если делать Новое развертывание и далее Новое развёртывание, то url веб-приложения меняется и вот тогда в этом случае делать в той последовательности, что я написал. Ну как-то так.

  • iMakeBots [1 год назад → Next]

    Все, понял)))

    Вы создавали новое, и там понятно вебхук был на старое приложение настроен

    Я всегда редактировал развертывание.

    Тогда получется, код рабочий из коробки. Я за это переживал))) 

  • 👀 [1 год назад]

    Добрый день! Бот отвечает с задержкой в примерно 5 секунд - это нормально или есть какая-то проблема?

  • iMakeBots [1 год назад → 👀]

    Да, с этой логикой выборки данных из таблицы нормально. Это была попытка применять обычные методы взаимодействия с хранением данных как с СУБД. Но таблицы это немного другое оказалось.

    Уже есть пример как это можно ускорить. И если к этому использовать кеширование, то можно добиться еще более лучшего результата.

  • 👀 [1 год назад → iMakeBots]

    Спасибо за оперативную связь, буду пробовать:)