// Библиотека: Airtable // Команда CLI: Airtable // 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:IncorrectLineBreak-off // Раскомментировать, если выполняется OneScript #Использовать "../../tools" #Область ПрограммныйИнтерфейс #Область РаботаСБазами // Получить список баз // Получает список доступных баз // // Параметры: // Токен - Строка - Токен - token // Отступ - Строка - Идентификатор следующей страницы списка баз из перыдудщего запроса - offser // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция ПолучитьСписокБаз(Знач Токен, Знач Отступ = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Отступ); URL = "https://api.airtable.com/v0/meta/bases"; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Получить таблицы базы // Получает схему таблиц базы // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы - base // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция ПолучитьТаблицыБазы(Знач Токен, Знач База) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables"; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Ответ = OPI_Инструменты.Get(URL, , Заголовки); Возврат Ответ; КонецФункции // Создать базу // Создает новую базу данных // // Параметры: // Токен - Строка - Токен - token // РабочееПространство - Строка - Идентификатор рабочего пространства - ws // Наименование - Строка - Наименование новой базы - title // КоллекцияТаблиц - Соответствие Из КлючИЗначение - Описание таблиц: Ключ > имя, Значение > массив полей - tablesdata // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция СоздатьБазу(Знач Токен, Знач РабочееПространство, Знач Наименование, Знач КоллекцияТаблиц) Экспорт OPI_ПреобразованиеТипов.ПолучитьКоллекцию(КоллекцияТаблиц); Если Не ТипЗнч(КоллекцияТаблиц) = Тип("Структура") И Не ТипЗнч(КоллекцияТаблиц) = Тип("Соответствие") Тогда ВызватьИсключение "Ошибка в данных коллекции таблиц"; КонецЕсли; URL = "https://api.airtable.com/v0/meta/bases"; Заголовки = ПолучитьЗаголовокАвторизации(Токен); МассивТаблиц = Новый Массив; Для Каждого Таблица Из КоллекцияТаблиц Цикл Описание = СформироватьОписаниеТаблицы(Таблица.Ключ, Таблица.Значение); МассивТаблиц.Добавить(Описание); КонецЦикла; Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("name" , Наименование , "Строка", Параметры); OPI_Инструменты.ДобавитьПоле("tables" , МассивТаблиц , "Массив", Параметры); OPI_Инструменты.ДобавитьПоле("workspaceId", РабочееПространство, "Строка", Параметры); Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции #КонецОбласти #Область РаботаСТаблицами // Создать таблицу // Создает новую таблицу в базе // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы - base // Наименование - Строка - Наименование новой таблицы - title // МассивПолей - Массив Из Структура - Массив описаний полей - fieldsdata // Описание - Строка - Описание таблицы - description // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция СоздатьТаблицу(Знач Токен, Знач База, Знач Наименование, Знач МассивПолей, Знач Описание = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables"; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Параметры = СформироватьОписаниеТаблицы(Наименование, МассивПолей, Описание); Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Изменить таблицу // Изменяет наименование и|или описание базы // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы - base // Таблица - Строка - Идентификатор таблицы - table // Наименование - Строка - Новое наименование - title // Описание - Строка - Новое описание - description // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция ИзменитьТаблицу(Знач Токен, Знач База, Знач Таблица, Знач Наименование = "", Знач Описание = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Параметры = Новый Структура; OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры); OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры); Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции #КонецОбласти #Область РаботаСПолями // Создать поле // Создет новое поле в таблице // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы - base // Таблица - Строка - Идентификатор таблицы - table // СтруктураПоля - Структура Из КлючИЗначение - Описание нового поля - fielddata // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция СоздатьПоле(Знач Токен, Знач База, Знач Таблица, Знач СтруктураПоля) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СтруктураПоля); Если Не ТипЗнч(СтруктураПоля) = Тип("Структура") И Не ТипЗнч(СтруктураПоля) = Тип("Соответствие") Тогда ВызватьИсключение "Ошибка в данных описания поля"; КонецЕсли; URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица + "/fields"; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Ответ = OPI_Инструменты.Post(URL, СтруктураПоля, Заголовки); Возврат Ответ; КонецФункции // Изменить поле // Изменяет имя и|или описание существующего поля таблицы // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы База - base // Таблица - Строка - Идентификатор таблицы - table // Поле - Строка - Идентификатор поля - field // Наименование - Строка - Новое наименование - title // Описание - Строка - Новое описание - description // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция ИзменитьПоле(Знач Токен, Знач База, Знач Таблица, Знач Поле, Знач Наименование = "", Знач Описание = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле); URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица + "/fields/" + Поле; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Параметры = Новый Структура(); OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры); OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры); Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Получить поле (строковое) // Получает описание поля строкового типа // // Параметры: // Наименование - Строка - Наименование нового поля - title // // Возвращаемое значение: // Структура - Описание поля Функция ПолучитьПолеСтроковое(Знач Наименование) Экспорт Возврат ОписаниеПримитивногоПоля(Наименование, "richText"); КонецФункции // Получить поле (числовое) // Получает описание поля числового типа // // Параметры: // Наименование - Строка - Наименование нового поля - title // Точность - Число,Строка - Число знаков после запятой - precision // // Возвращаемое значение: // Структура - Описание поля Функция ПолучитьПолеНомера(Знач Наименование, Знач Точность = 0) Экспорт OPI_ПреобразованиеТипов.ПолучитьЧисло(Точность); СтруктураОпций = Новый Структура("precision", Точность); Возврат ОписаниеПримитивногоПоля(Наименование, "number", СтруктураОпций); КонецФункции // Получить поле (файл) // Получает описание поля файлового типа // // Параметры: // Наименование - Строка - Наименование поля - title // // Возвращаемое значение: // Структура - Описание поля Функция ПолучитьПолеВложения(Знач Наименование) Экспорт Возврат ОписаниеПримитивногоПоля(Наименование, "multipleAttachments"); КонецФункции // Получить поле (флажок) // Получает описание поля типа булево // // Параметры: // Наименование - Строка - Наименование поля - title // // Возвращаемое значение: // Структура - Описание поля Функция ПолучитьПолеФлажка(Знач Наименование) Экспорт СтруктураОпций = Новый Структура("icon,color", "check", "yellowBright"); Возврат ОписаниеПримитивногоПоля(Наименование, "checkbox", СтруктураОпций); КонецФункции // Получить поле (дата) // Получает описание поля типа дата // // Параметры: // Наименование - Строка - Наименование поля - title // // Возвращаемое значение: // Структура - Описание поля Функция ПолучитьПолеДаты(Знач Наименование) Экспорт СтруктураФормата = Новый Структура("format,name", "YYYY-MM-DD", "iso"); СтруктураОпций = Новый Структура("dateFormat", СтруктураФормата); Возврат ОписаниеПримитивногоПоля(Наименование, "date", СтруктураОпций); КонецФункции // Получить поле (email) // Получает описание поля с электронной почтой // // Параметры: // Наименование - Строка - Наименование поля - title // // Возвращаемое значение: // Структура - Описание поля Функция ПолучитьПолеПочты(Знач Наименование) Экспорт Возврат ОписаниеПримитивногоПоля(Наименование, "email"); КонецФункции // Получить поле (телефон) // Получает описание поля с номером телефона // // Параметры: // Наименование - Строка - Наименование поля - title // // Возвращаемое значение: // Структура - Описание поля Функция ПолучитьПолеТелефона(Знач Наименование) Экспорт Возврат ОписаниеПримитивногоПоля(Наименование, "phoneNumber"); КонецФункции // Получить поле (url) // Получает описание поля с URL // // Параметры: // Наименование - Строка - Наименование поля - title // // Возвращаемое значение: // Структура - Описание поля Функция ПолучитьПолеСсылки(Знач Наименование) Экспорт Возврат ОписаниеПримитивногоПоля(Наименование, "url"); КонецФункции #КонецОбласти #Область РаботаСЗаписями // Получить список записей // Получает список записей выбранной таблицы // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы данных - base // Таблица - Строка - Идентификатор таблицы - table // Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция ПолучитьСписокЗаписей(Знач Токен, Знач База, Знач Таблица, Знач Отступ = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); URL = "https://api.airtable.com/v0/" + База + "/" + Таблица; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Параметры = Новый Структура(); OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Получить запись // Получает данные строки таблицы по идентификатору // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы данных - base // Таблица - Строка - Идентификатор таблицы - table // Запись - Строка - Идентификатор записи в таблице - record // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция ПолучитьЗапись(Знач Токен, Знач База, Знач Таблица, Знач Запись) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Ответ = OPI_Инструменты.Get(URL, , Заголовки); Возврат Ответ; КонецФункции // Создать записи // Создает одну или массив записей по описанию или массиву описаний значений полей // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы данных - base // Таблица - Строка - Идентификатор таблицы - table // Данные - Структура, Массив из Структура - Набор или массив наборов пар Ключ : Значение > Поле : Показатель - data // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция СоздатьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Данные) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); Параметры = Новый Структура(); ДобавитьОписаниеДанных(Данные, Параметры); URL = "https://api.airtable.com/v0/" + База + "/" + Таблица; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Удалить записи // Удаляет одну или массив записей по идентификаторам // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы данных - base // Таблица - Строка - Идентификатор таблицы - table // Записи - Строка, Массив из Строка - Идентификатор или массив индентификаторов записей - records // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция УдалитьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Записи) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); OPI_ПреобразованиеТипов.ПолучитьМассив(Записи); СтрокаЗаписей = ""; Для Каждого Запись Из Записи Цикл СтрокаЗаписей = СтрокаЗаписей + ?(ЗначениеЗаполнено(СтрокаЗаписей), "&", "?") + "records[]=" + OPI_Инструменты.ЧислоВСтроку(Запись); КонецЦикла; URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + СтрокаЗаписей; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Ответ = OPI_Инструменты.Delete(URL, , Заголовки); Возврат Ответ; КонецФункции #КонецОбласти #Область РаботаСКомментариями // Получить комментарии // Получает список комментариев к записи в таблице // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы данных - base // Таблица - Строка - Идентификатор таблицы - table // Запись - Строка - Идентификатор записи в таблице - record // Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция ПолучитьКомментарии(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Отступ = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments"; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Параметры = Новый Структура(); OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Создать комментарий // Создает комментарий к записи в таблице // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы данных - base // Таблица - Строка - Идентификатор таблицы - table // Запись - Строка - Идентификатор записи в таблице - record // Текст - Строка - Текст комментария - text // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция СоздатьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Текст) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments"; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Параметры = Новый Структура(); OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры); Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Изменить комментарий // Изменяет текст существующего комментария // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы данных - base // Таблица - Строка - Идентификатор таблицы - table // Запись - Строка - Идентификатор записи в таблице - record // Комментарий - Строка - Идентификатор комментария - comment // Текст - Строка - Новый текст комментария - text // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция ИзменитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий, Знач Текст) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Параметры = Новый Структура(); OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры); Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Удалить комментарий // Удаляет комментарий к записи таблицы // // Параметры: // Токен - Строка - Токен - token // База - Строка - Идентификатор базы данных - base // Таблица - Строка - Идентификатор таблицы - table // Запись - Строка - Идентификатор записи в таблице - record // Комментарий - Строка - Идентификатор комментария - comment // // Возвращаемое значение: // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable Функция УдалитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(База); OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий; Заголовки = ПолучитьЗаголовокАвторизации(Токен); Ответ = OPI_Инструменты.Delete(URL, , Заголовки); Возврат Ответ; КонецФункции #КонецОбласти #КонецОбласти #Область СлужебныеПроцедурыИФункции Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); Заголовки = Новый Соответствие; Заголовки.Вставить("Authorization", "Bearer " + Токен); Возврат Заголовки; КонецФункции Функция СформироватьОписаниеТаблицы(Знач Наименование, Знач МассивПолей, Знач Описание = "") OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПолей); ОписаниеТаблицы = Новый Структура("name,fields", Наименование, МассивПолей); OPI_Инструменты.ДобавитьПоле("description", Описание, "Строка", ОписаниеТаблицы); Возврат ОписаниеТаблицы; КонецФункции Функция ОписаниеПримитивногоПоля(Знач Наименование, Знач Тип, Знач Опции = "") СтруктураПоля = Новый Структура(); OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка" , СтруктураПоля); OPI_Инструменты.ДобавитьПоле("type" , Тип , "Строка" , СтруктураПоля); OPI_Инструменты.ДобавитьПоле("options", Опции , "Коллекция", СтруктураПоля); Возврат СтруктураПоля; КонецФункции Процедура ДобавитьОписаниеДанных(Знач Данные, Параметры) Если ТипЗнч(Данные) = Тип("Массив") Тогда МассивОтправки = Новый Массив; Для Каждого ОписаниеЗаписи Из Данные Цикл МассивОтправки.Добавить(Новый Структура("fields", ОписаниеЗаписи)); КонецЦикла; OPI_Инструменты.ДобавитьПоле("records", МассивОтправки, "Массив", Параметры); Иначе OPI_Инструменты.ДобавитьПоле("fields", Данные, "Коллекция", Параметры); КонецЕсли; КонецПроцедуры #КонецОбласти