Разработка

Создание нового события в Google Calendar с помощью Nodul

Олег Заньков

October 4, 2023

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

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

Для этого воспользуемся Google Sheet Api и через Nodul настроим сценарий который позволит при вызове добавлять новое событие в отдельный Google календарь, в который будут добавлены все нужные люди которые будут участвовать в этом событии.

Подготовка

Сперва обязательно получим токен по инструкции в нашей статье, только в списке серверов выбрать "Google Calendar Api v...", а в scope  "www.googleapis.com/auth/calendar ";

Создание

Далее создадим в Calendar новый календарь, можно назвать его например "NodulTest";
Подготовим запрос для нашего rest клиента;

REQ01: Запрос для rest клиента


curl --request POST --url 'https://webhook.nodul.ru/00/dev/some_hash'
--header 'Accept: application/json'
--header 'Content-Type: application/x-www-form-urlencoded'
--data 'token=[Замените квадратные скобки с содержимым на ваш токен]'
--data 'summary=Событие созданное из Nodul'
--data 'location=https://app.nodul.ru'
--data 'description=Добавление события в календарь из Nodul с помощью API'
--data 'startDate=2022-12-21T09:00:00-07:00 Поменяйте на ближайшую дату'
--data 'startTZ=Europe/Moscow'
--data 'endDate=2022-12-22T09:00:00-07:00 Поменяйте на ближайшую дату'
--data 'endTZ=Europe/Moscow'

Подставим полученный из шага в начале наш токен;

Замена токена на актуальный

Поменяем даты начала "startDate" и конца "endDate" на ближайшее, так же можно поменять часовой пояс если он не подходит это startTZ и endTZ;

Замена даты начала и окончания

Создадим узел "Webhook": "+ Добавить узел" => "Http" => "Webhook";

Скопируем адрес Webhook и вставим его в адресную строку rest клиента;

Копируем адреc Webhook узла
Замена адреса в rest клиенте

Далее добавим другой узел "JavaScrtipt": "+ Добавить узел" => "Code" => "JavaScrtipt";

Сохраняем изменения;

Свяжем узлы вместе;

Запустим и вызовем цепочку для передачи данных между узлами;

Скопируем в него содержимое:


  const apiURL = "https://www.googleapis.com/calendar/v3";
  const bToken = "Bearer " + data["{{1.body.token}}"];
  const event = {
    'summary': data["{{1.body.summary}}"],
    'location': data["{{1.body.location}}"],
    'description': data["{{1.body.description}}"],
    'start': {
      'dateTime': data["{{1.body.startDate}}"],
      'timeZone': data["{{1.body.startTZ}}"]
    },
    'end': {
      'dateTime': data["{{1.body.endDate}}"],
      'timeZone': data["{{1.body.endTZ}}"]
    },
    'reminders': {
      'useDefault': false,
      'overrides': [
        {'method': 'email', 'minutes': 24 * 60},
        {'method': 'popup', 'minutes': 10}
      ]
    }
  };
  return {
      apiURL, bToken, event
  }

Проверим во всех конструкциях вида "data["{{1.body.name}}"]" что номер Webhook соответствует от которого получаем данные, если нет заменим на нужные(напомню что 1 это номер узла который написан сразу под узлом над названием типа узла, далее если это запрос то выбирается поле объекта отвечающее за тип переданных/полученных данных - body для форм или query для query параметров);

Проверка подставляемых значений на подходящий узел

Сохраняем;

Создадим узел "HTTP request": "+ Добавить узел" => "Http" => "HTTP request";

Сохраняем изменения;

Свяжем узлы вместе;

Запустим и вызовем цепочку для передачи данных между узлами;

В поле "Url" в начало подставим переменную "apiURL" из "JavaScrtipt" и после неё укажем: /users/me/calendarList ;

Убедимся что метод выбран по умолчанию "Get";

Добавим заголовок "Autorization" и в его значение переменную "bToken" из "JavaScrtipt";

Нажмём "Сохранить";

Подстановка и проверка значений в узел HTTP requst

Создадим ещё один  узел "JavaScrtipt": "+ Добавить узел" => "Code" => "JavaScrtipt";

Сохраняем изменения;

Свяжем узлы вместе;

Запустим и вызовем цепочку для передачи данных между узлами;

Скопируем в него содержимое, для поиска нужного календаря из полученного списка из предыдущего запроса:


  const tempCalendarsList = JSON.parse(data["{{3.body.items}}"]); // Проверьте что информация подставляется из правильного узла от запроса списка календарей
  const targetCalendar = tempCalendarsList.find((calendar) => calendar.summary === "NodulTest"); // Здесь заместо "NodulTest" можете написать название нужного календаря
  return {
    targetCalendar
  }

Проверим данные которые указанны в комментариях к коду;

Cохраняем

Создадим узел "HTTP request": "+ Добавить узел" => "Http" => "HTTP request";

Сохраняем изменения;

Свяжем узлы вместе;

Запустим и вызовем цепочку для передачи данных между узлами;

В поле "Url" в начало подставим переменную "apiURL" из первого "JavaScrtipt" узла, после неё допишем: /calendars/, после подставим ещё переменную "targetCalendar.id" из "JavaScrtipt" с обработкой списка календаря, и в конце: /events;

Меняем метод на метод "Post";

В тело "raw": подставим переменную содержащую объект с новым событием из первого из первого "JavaScrtipt" узла;

Добавим заголовок "Autorization" и в его значение переменную "bToken" из первого узла "JavaScrtipt";

Нажмём "Сохранить";

Настройка узла "HTTP request" для содания события в календаре

Свяжем узлы вместе;

Запустим и вызовем цепочку для передачи данных между узлами;

После этого в календаре должно появиться новое событие;

Добавленное событие в календаре.

В конце вся цепочка в Nodul будет выглядеть так:

Готовая цепочка в Nodul

До встречи в следующих статьях;

Ссылки:


Основные:

Nodul
Google OAuth 2.0 Playground


Информация:
Google Calendar API
Google Calendar API CalendarList: list
Google Calendar API Event: insert

Другие статьи