// 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" #Область ПрограммныйИнтерфейс #Область РаботаСМетаданнымиКалендарей // Создать календарь. // // Параметры: // Токен - Строка - Токен // Наименование - Строка - Наименование создаваемого календаря // // Возвращаемое значение: // Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars"; Параметры = Новый Структура; Параметры.Вставить("summary" , Наименование); Параметры.Вставить("timeZone", "Europe/Moscow"); Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Получить календарь. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // // Возвращаемое значение: // Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; Ответ = OPI_Инструменты.Get(URL, , Заголовки); Возврат Ответ; КонецФункции // Изменить календарь. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // Наименование - Строка - Новое наименование // Описание - Строка - Новое описание календаря // // Возвращаемое значение: // Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google Функция ИзменитьМетаданныеКалендаря(Знач Токен , Знач Календарь , Знач Наименование = "" , Знач Описание = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; Параметры = Новый Структура; Если ЗначениеЗаполнено(Наименование) Тогда Параметры.Вставить("summary", Наименование); КонецЕсли; Если ЗначениеЗаполнено(Описание) Тогда Параметры.Вставить("description", Описание); КонецЕсли; Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); Возврат Ответ; КонецФункции // Очистить основной календарь. // // Параметры: // Токен - Строка - Токен // // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/primary/clear"; Ответ = OPI_Инструменты.Post(URL, , Заголовки, Ложь); Возврат Ответ; КонецФункции // Удалить календарь. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // // Возвращаемое значение: // Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; Ответ = OPI_Инструменты.Delete(URL, , Заголовки); Возврат Ответ; КонецФункции #КонецОбласти #Область РаботаСоСпискомКалендарей // Получить список календарей. // // Параметры: // Токен - Строка - Токен // // Возвращаемое значение: // Соответствие Из КлючИЗначение - Массив соответствий данных календарей Функция ПолучитьСписокКалендарей(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); МассивКалендарей = Новый Массив; ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей); Возврат МассивКалендарей; КонецФункции // Добавить календарь в список. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // // Возвращаемое значение: // Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - ответ сервера Google Функция ДобавитьКалендарьВСписок(Знач Токен, Знач Календарь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList"; Параметры = Новый Структура; Параметры.Вставить("id", Календарь); Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Получить календарь списка. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; Ответ = OPI_Инструменты.Get(URL, , Заголовки); Возврат Ответ; КонецФункции // Удалить календарь из списка. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; Ответ = OPI_Инструменты.Delete(URL, , Заголовки); Возврат Ответ; КонецФункции // Изменить календарь списка. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // ОсновнойЦвет - Строка - HEX основного цвета (#ffffff) // ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff) // Скрытый - Булево - Скрытый календарь // // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера 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, Параметры, Заголовки); Возврат Ответ; КонецФункции #КонецОбласти #Область РаботаССобытиями // Получить описание события. // // Возвращаемое значение: // Соответствие Из КлючИЗначение - Пустой макет события Функция ПолучитьОписаниеСобытия() Экспорт ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); Час = 3600; Событие = Новый Соответствие; Событие.Вставить("Описание" , ""); // Описание события Событие.Вставить("Заголовок" , "Новое событие"); // Заголовок события Событие.Вставить("МестоПроведения" , ""); // Строка описание места проведения Событие.Вставить("ДатаНачала" , ТекущаяДата); // Дата начала события Событие.Вставить("ДатаОкончания" , ТекущаяДата + Час); // Дата окончания события Событие.Вставить("МассивURLФайловВложений", Новый Соответствие); // Ключ - название, Значение - URL к файлу Событие.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам Возврат Событие; КонецФункции // Получить список событий. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // // Возвращаемое значение: // Соответствие Из КлючИЗначение - Массив соответствий событий Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); МассивСобытий = Новый Массив; ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий); Возврат МассивСобытий; КонецФункции // Получить событие. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // Событие - Строка - ID события // // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events/" + Событие; Ответ = OPI_Инструменты.Get(URL, , Заголовки); Возврат Ответ; КонецФункции // Создать событие. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события. См. ПолучитьОписаниеСобытия // // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия); КонецФункции // Переместить событие. // // Параметры: // Токен - Строка - Токен // КалендарьИсточник - Строка - ID календаря источника // КалендарьПриемник - Строка - ID календаря приемника // Событие - Строка - ID события календаря источника // // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьИсточник); OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьПриемник); OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); URL = "https://www.googleapis.com/calendar/v3/calendars/" + КалендарьИсточник + "/events/" + Событие + "/move?destination=" + КалендарьПриемник; Ответ = OPI_Инструменты.Post(URL, , Заголовки); Возврат Ответ; КонецФункции // Изменить событие. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // ОписаниеСобытия - Строка - Новое описание события // Событие - Строка - ID события // // Возвращаемое значение: // HTTPОтвет - Изменить событие Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие); КонецФункции // Удалить событие. // // Параметры: // Токен - Строка - Токен // Календарь - Строка - ID календаря // Событие - Строка - ID события // // Возвращаемое значение: // Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера 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 И ЗначениеЗаполнено(Страница) Тогда ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница); КонецЕсли; КонецПроцедуры #КонецОбласти