// Библиотека: Google Calendar // Команда CLI: gcalendar // MIT License // Copyright (c) 2023 Anton Tsitavets // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // https://github.com/Bayselonarrend/OpenIntegrations // BSLLS:LatinAndCyrillicSymbolInWord-off // BSLLS:IncorrectLineBreak-off // Раскомментировать, если выполняется OneScript #Использовать "../../tools" #Область ПрограммныйИнтерфейс #Область РаботаСМетаданнымиКалендарей // Создать календарь // Создает пустой календарь // // Параметры: // Токен - Строка - Токен - token // Наименование - Строка - Наименование создаваемого календаря - title // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars"; Параметры = Новый Структура; Параметры.Вставить("summary" , Наименование); Параметры.Вставить("timeZone", "Europe/Moscow"); Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Получить календарь // Получает информацию о календаре по ID // // Параметры: // Токен - Строка - Токен - token // Календарь - Строка - ID календаря - calendar // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; Ответ = OPI_Инструменты.Get(URL, , Заголовки); Возврат Ответ; КонецФункции // Изменить календарь // Изменяет свойства существуещего календаря // // Параметры: // Токен - Строка - Токен - token // Календарь - Строка - ID календаря - calendar // Наименование - Строка - Новое наименование - title // Описание - Строка - Новое описание календаря - description // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция ИзменитьМетаданныеКалендаря(Знач Токен , Знач Календарь , Знач Наименование = "" , Знач Описание = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; Параметры = Новый Структура; Если ЗначениеЗаполнено(Наименование) Тогда Параметры.Вставить("summary", Наименование); КонецЕсли; Если ЗначениеЗаполнено(Описание) Тогда Параметры.Вставить("description", Описание); КонецЕсли; Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); Возврат Ответ; КонецФункции // Очистить основной календарь // Очищает список событий основного календаря // // Параметры: // Токен - Строка - Токен - token // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/primary/clear"; Ответ = OPI_Инструменты.Post(URL, , Заголовки, Ложь); Возврат Ответ; КонецФункции // Удалить календарь // Удаляет календарь по ID // // Параметры: // Токен - Строка - Токен - token // Календарь - Строка - ID календаря - calendar // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; Ответ = OPI_Инструменты.Delete(URL, , Заголовки); Возврат Ответ; КонецФункции #КонецОбласти #Область РаботаСоСпискомКалендарей // Получить список календарей // Получает массив календарей аккаунта // // Параметры: // Токен - Строка - Токен - token // // Возвращаемое значение: // Соответствие Из КлючИЗначение - Массив соответствий данных календарей Функция ПолучитьСписокКалендарей(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); МассивКалендарей = Новый Массив; ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей); Возврат МассивКалендарей; КонецФункции // Добавить календарь в список // Добавляет существующий календарь в список пользователя // // Параметры: // Токен - Строка - Токен - token // Календарь - Строка - ID календаря - calendar // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция ДобавитьКалендарьВСписок(Знач Токен, Знач Календарь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList"; Параметры = Новый Структура; Параметры.Вставить("id", Календарь); Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Получить календарь списка // Получает календарь из списка пользователя по ID // // Параметры: // Токен - Строка - Токен - token // Календарь - Строка - ID календаря - calendar // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; Ответ = OPI_Инструменты.Get(URL, , Заголовки); Возврат Ответ; КонецФункции // Удалить календарь из списка // Удаляет календарь из списка пользователя // // Параметры: // Токен - Строка - Токен - token // Календарь - Строка - ID календаря - calendar // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; Ответ = OPI_Инструменты.Delete(URL, , Заголовки); Возврат Ответ; КонецФункции // Изменить календарь списка // Изменяет свойства календаря из списка пользователей // // Параметры: // Токен - Строка - Токен - token // Календарь - Строка - ID календаря - calendar // ОсновнойЦвет - Строка - HEX основного цвета (#ffffff) - primary // ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff) - secondary // Скрытый - Булево - Скрытый календарь - hidden // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция ИзменитьКалендарьСписка(Знач Токен , Знач Календарь , Знач ОсновнойЦвет , Знач ДополнительныйЦвет , Знач Скрытый = Ложь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); OPI_ПреобразованиеТипов.ПолучитьСтроку(ОсновнойЦвет); OPI_ПреобразованиеТипов.ПолучитьСтроку(ДополнительныйЦвет); OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытый); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true"; Параметры = Новый Соответствие; Параметры.Вставить("hidden" , Скрытый); Параметры.Вставить("foregroundColor", ОсновнойЦвет); Параметры.Вставить("backgroundColor", ДополнительныйЦвет); Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции #КонецОбласти #Область РаботаССобытиями // Получить описание события !NOCLI // // Возвращаемое значение: // Соответствие Из КлючИЗначение - Пустой макет события Функция ПолучитьОписаниеСобытия() Экспорт ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); Час = 3600; Событие = Новый Соответствие; Событие.Вставить("Описание" , ""); // Описание события Событие.Вставить("Заголовок" , "Новое событие"); // Заголовок события Событие.Вставить("МестоПроведения" , ""); // Строка описание места проведения Событие.Вставить("ДатаНачала" , ТекущаяДата); // Дата начала события Событие.Вставить("ДатаОкончания" , ТекущаяДата + Час); // Дата окончания события Событие.Вставить("МассивURLФайловВложений", Новый Соответствие); // Ключ - название, Значение - URL к файлу Событие.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам Возврат Событие; КонецФункции // Получить список событий // Получает список всех событий календаря // // Параметры: // Токен - Строка - Токен - token // Календарь - Строка - ID календаря - calendar // // Возвращаемое значение: // Соответствие Из КлючИЗначение - Массив соответствий событий Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); МассивСобытий = Новый Массив; ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий); Возврат МассивСобытий; КонецФункции // Получить событие // Получает событие по ID // // Параметры: // Токен - Строка - Токен - token // Календарь - Строка - ID календаря - calendar // Событие - Строка - ID события - event // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events/" + Событие; Ответ = OPI_Инструменты.Get(URL, , Заголовки); Возврат Ответ; КонецФункции // Создать событие // Создает новое событие // // Параметры: // Токен - Строка - Токен - token // Календарь - Строка - ID календаря - calendar // ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события - props // // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия); КонецФункции // Переместить событие // Перемещает событие в другой календарь // // Параметры: // Токен - Строка - Токен - token // КалендарьИсточник - Строка - ID календаря источника - from // КалендарьПриемник - Строка - ID календаря приемника - to // Событие - Строка - ID события календаря источника - event // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьИсточник); OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьПриемник); OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/" + КалендарьИсточник + "/events/" + Событие + "/move?destination=" + КалендарьПриемник; Ответ = OPI_Инструменты.Post(URL, , Заголовки); Возврат Ответ; КонецФункции // Изменить событие // Изменяет существующее событие // // Параметры: // Токен - Строка - Токен - token // Календарь - Строка - ID календаря - calendar // ОписаниеСобытия - Строка - Новое описание события - props // Событие - Строка - ID события - event // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие); КонецФункции // Удалить событие // Удаляет событие по ID // // Параметры: // Токен - Строка - Токен - token // Календарь - Строка - ID календаря - calendar // Событие - Строка - ID события - event // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events/" + Событие; Ответ = OPI_Инструменты.Delete(URL, , Заголовки); Возврат Ответ; КонецФункции #КонецОбласти #КонецОбласти #Область СлужебныеПроцедурыИФункции Функция ПреобразоватьДату(Знач Дата) OPI_ПреобразованиеТипов.ПолучитьДату(Дата); СтруктураДаты = Новый Структура; Если Не ТипЗнч(Дата) = Тип("Дата") Тогда Возврат Неопределено; КонецЕсли; Если Дата = НачалоДня(Дата) Тогда ФорматДаты = "ДФ=yyyy-MM-dd"; Поле = "date"; Иначе ФорматДаты = "ДФ=yyyy-MM-ddTHH:mm:ssZ"; Поле = "dateTime"; КонецЕсли; Дата = Формат(Дата, ФорматДаты); СтруктураДаты.Вставить(Поле , Дата); СтруктураДаты.Вставить("timeZone", "Europe/Moscow"); Возврат СтруктураДаты; КонецФункции Функция ПреобразоватьВложения(Знач Вложения) OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Вложения); МассивВложений = Новый Массив; Если ТипЗнч(Вложения) = Тип("Соответствие") Или ТипЗнч(Вложения) = Тип("Структура") Тогда Для Каждого Вложение Из Вложения Цикл ТекущеВложение = Новый Структура; ТекущеВложение.Вставить("title" , Вложение.Ключ); ТекущеВложение.Вставить("fileUrl", Вложение.Значение); МассивВложений.Добавить(ТекущеВложение); КонецЦикла; КонецЕсли; Если МассивВложений.Количество() > 0 Тогда Возврат МассивВложений; Иначе Возврат Неопределено; КонецЕсли; КонецФункции Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "") OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеСобытия); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); Существующее = ЗначениеЗаполнено(Событие); URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events" + ?(Существующее, "/" + Событие, ""); Дата0 = ОписаниеСобытия["ДатаНачала"]; Дата1 = ОписаниеСобытия["ДатаОкончания"]; Вложения = ОписаниеСобытия["МассивURLФайловВложений"]; Вложения = ПреобразоватьВложения(Вложения); Уведомления = ?(ОписаниеСобытия["ОтправлятьУведомления"] = Неопределено , Ложь , ОписаниеСобытия["ОтправлятьУведомления"]); Параметры = Новый Структура; Параметры.Вставить("summary" , ОписаниеСобытия["Заголовок"]); Параметры.Вставить("description", ОписаниеСобытия["Описание"]); Параметры.Вставить("location" , ОписаниеСобытия["МестоПроведения"]); Параметры.Вставить("start" , ПреобразоватьДату(Дата0)); Параметры.Вставить("end" , ПреобразоватьДату(Дата1)); Параметры.Вставить("attachments", Вложения); ПараметрыURL = Новый Структура; ПараметрыURL.Вставить("sendUpdates" , ?(Уведомления, "all", "none")); ПараметрыURL.Вставить("supportsAttachments" , ?(ЗначениеЗаполнено(Вложения), "true", "false")); URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры); Если Существующее Тогда Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); Иначе Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки, Истина); КонецЕсли; Возврат Ответ; КонецФункции Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "") Items = "items"; NPT = "nextPageToken"; Параметры = Новый Структура; Если ЗначениеЗаполнено(Страница) Тогда Параметры.Вставить("pageToken", Страница); КонецЕсли; Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList" , Параметры , Заголовки); Календари = Результат[Items]; Страница = Результат[NPT]; Для Каждого Календарь Из Календари Цикл МассивКалендарей.Добавить(Календарь); КонецЦикла; Если Календари.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей, Страница); КонецЕсли; КонецПроцедуры Процедура ПолучитьСписокСобытийРекурсивно(Знач Заголовки, Знач Календарь, МассивСобытий, Страница = "") Items = "items"; NPT = "nextPageToken"; Параметры = Новый Структура; Если ЗначениеЗаполнено(Страница) Тогда Параметры.Вставить("pageToken", Страница); КонецЕсли; Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events" , Параметры , Заголовки); События = Результат[Items]; Страница = Результат[NPT]; Для Каждого Событие Из События Цикл МассивСобытий.Добавить(Событие); КонецЦикла; Если События.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница); КонецЕсли; КонецПроцедуры #КонецОбласти