Гугл календарь: забираем мероприятия скриптом

Недавно на работе столкнулся со следующей задачей: не у всех сотрудниках на филиалах есть учетная запись гугл, доступ к рабочему календарю и, как следствие, не все получают рассылку о предстоящих встречах. Так же осложняло задачу, то, что календарь формируют разные люди и не всегда получается включить всех необходимых участников.

Решить эту проблему можно при помощи получения всех событий из календаря и, к примеру отправки их по почте или внедрения их в webapp, к которому есть доступ по ссылке.

Ниже я рассмотрю базовый сценарий получения данных из календаря в массив.

К примеру, есть следующий «тестовый» гугл календарь:

google calendar with events
Календарь с тремя мероприятиями

Доступ к календарю

Первое что нужно получить, это идентификатор календаря. Он указан в настройках:

google calendar id
Id календаря

Получаю доступ к нему в скрипте:

function getCalEventForWeek() {
  const calID = 'АйДи календаря выше'
  const myCal = CalendarApp.getCalendarById(calID);
  
  const myCalName = myCal.getName();
  Logger.log(myCalName)

  const myCalTimeZone = myCal.getTimeZone()
  Logger.log(myCalTimeZone)

Со следующим результатом в логгере:

Почему я вытащил myCal.getTimeZone() ? Дело в том, что он может быть отличным от вашего текущего часового пояса и тогда возможны нюансы. У меня был такой случай и его можно исправить несколькими способами, но самый верный следующий.

В настройках скрипта включить «Показывать файл манифеста appsscript.json в редакторе»

и в появившимся json исправить timeZone c

на Europe/Moscow

Получение данных за ближайшую неделю

Ближайшая неделя будет выглядеть следующим образом:

  const today = new Date();
  const sevenDaysAfter = new Date();
  sevenDaysAfter.setDate(sevenDaysAfter.getDate() + 7);

где const today = new Date(); это сегодня, а sevenDaysAfter.setDate(sevenDaysAfter.getDate() + 7); это сегодня плюс семь дней вперед. Далее, получаю все события в этом интервале:

  const calEvents = myCal.getEvents(today, sevenDaysAfter)
  const eventsArr = [];
 if(calEvents.length !== 0){
    for(let i = 0; i < calEvents.length; i++){
      Logger.log(`Дата: ${calEvents[i].getStartTime()}, Название: ${calEvents[i].getTitle()}, Описание: ${calEvents[i].getDescription()}`)
      eventsArr.push([calEvents[i].getStartTime(), calEvents[i].getTitle(), calEvents[i].getDescription()])
    }
  }

в консоли получаю следующее:

console log calendar

calEvents[i].getStartTime() — начало мероприятия

calEvents[i].getTitle() — название мероприятия

calEvents[i].getDescription() — описание мероприятия

Как видно по последней строке консоли, в массив eventsArr были добавлены все указанные события из календаря.

В свою очередь массив eventsArr — обычный, «классический» массив, с которым можно делать все базовые операции, в том числе отправлять по почте или телеграм боту.

Добавить комментарий