Как подключить api к excel
Перейти к содержимому

Как подключить api к excel

  • автор:

Получение JSON из API GET-запросами на Power Query в Excel (Web.Contents)

Получение JSON из API GET-запросами на Power Query в Excel (Web.Contents)

Power Query умеет подключаться не только к web страничкам, но и к API, не требующим авторизации. Если API позволяет анонимным пользователям забирать данные, Power Query подойдёт идеально.

API компании ПИК — данные по квартирам

Подключимся к API застройщика, чтобы отслеживать актуальную стоимость квартиры. Находим нужную квартиру на сайте застройщика: https://beta.pik.ru/flat/801472 .

«https://api.pik.ru/v1/flat?id=» — URL адрес, по которому застройщик предоставляет информацию, а «801472» – идентификатор квартиры.

Информация на сайте показана красиво, но разбросана по разным вкладкам.
Мы же хотим получить лаконичную табличку в Excel:

Адрес
Стоимость
Скидка
Заселение до
Площадь
Комнаты
Этаж
Ссылка
PDF

GET-запрос к API ПИК на Power Query

Для разнообразия воспользуюсь Power Query в Excel. Создаем пустой запрос:

В строке формул пишем:

Json.Document(Web.Contents("https://api.pik.ru/v1/flat?id=801472"))

В результате получаем строку с вложенными составными элементами, которые также могут содержать вложенные элементы:

Называем запрос «getData_oneFlat» и вставляем пустой шаг после шага Источник (чтобы открыть меню — щелкаем правой кнопкой мышки на шаг Источник):

С помощью функции Record.FromList формируем строку с нужными данными, используя шаг Источник. В строке формул пишем:

Record.FromList( , type [ Адрес = text, Стоимость = number, Скидка = number, Заселение до = text, Площадь = number, Комнаты = number, Этаж = number, Ссылка = text, PDF = text])

Давайте разбираться как работает функция Record.FromList:

  1. Первый аргумент функции отвечает за содержимое полей – это список:
  2. Источник[price] – возвращает содержимое поля price
  3. Источник[block][address] – возвращает содержимое поля address из Record вложенной в поле block
  4. Второй аргумент отвечает за названия и тип полей – это строка:
    type [Адрес = text, Стоимость = number]

Результат — строка нужных нам значений:

Преобразуем строку в таблицу:

Выгрузим результат на лист Excel и посмотрим что получилось:

Такой формат нас устроит, теперь мы видим всю информацию по квартире в удобной таблице.

Несколько GET-запросов с помощью функции

Теперь попробуем забрать сразу несколько квартир и разместить их в одной табличке.

Для этого убираем последний шаг и создаём функцию getData от параметра flat (номер квартиры), заменяя сам номер на «flat»:

(flat as text)=> let Источник = Json.Document(Web.Contents("https://api.pik.ru/v1/flat?id image image_resized" style="width:100%;">

Загружаем список квартир в Power Query, выставляем столбцу текстовый тип. Затем добавляем новый столбец с вызовом нашей функции от каждой квартиры в списке, получается такой код:

let Источник = Excel.CurrentWorkbook()[Content], #"Измененный тип" = Table.TransformColumnTypes(Источник,>), #"Вызвана настраиваемая функция" = Table.AddColumn(#"Измененный тип", "getData", each getData([Получаемые квартиры])) in #"Вызвана настраиваемая функция"

Таблица в Power Query выглядит так:

Нажимаем на стрелочки справа от "getData" и разворачиваем нужные столбцы, а затем выгружаем всё на лист Excel. Теперь у нас есть табличка со стоимостью, скидками, площадью и датами заселения для всех интересных нам объектов:

Заключение

Пример вызова API сайта компании ПИК показывает как Power Query может быть полезен в бытовых задачах. Используйте PQ если вам нужно быть в курсе изменений данных, будь то стоимость квартиры или цена товара в интернет-магазине.

Если компания предоставляет данные по открытому API, вы всегда можете использовать магию Power Query и вывести эти данные себе в Excel-файл. Можно сравнить несколько товаров/категорий или вообще написать алгоритм, который будет отображать только самые интересные товары.

Как подключить api к excel

Argument 'Topic id' is null or empty

Сейчас на форуме

© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru

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

ООО "Планета Эксел"
ИНН 7735603520
ОГРН 1147746834949
ИП Павлов Николай Владимирович
ИНН 633015842586
ОГРНИП 310633031600071

Работа с таблицами с использованием API JavaScript для Excel

В этой статье приведены примеры кода, в которых показано, как выполнять стандартные задачи для таблиц с использованием API JavaScript для Excel. Полный список свойств и методов, поддерживаемых объектами и, см. в Table разделах Объект таблицы (API JavaScript для Excel) и Объект TableCollection (API JavaScript для Excel). TableCollection

Создание таблицы

В примере кода ниже показано, как создать таблицу на листе Sample (Пример). В таблице имеются заголовки, а также четыре столбца и семь строк с данными. Если приложение Excel, в котором выполняется код, поддерживает набор обязательных требованийExcelApi 1.2, ширина столбцов и высота строк задаются в соответствии с текущими данными в таблице.

Чтобы указать имя таблицы, необходимо сначала создать таблицу, а затем задать ее name свойство, как показано в следующем примере.

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.add("A1:D1", true /*hasHeaders*/); expensesTable.name = "ExpensesTable"; expensesTable.getHeaderRowRange().values = [["Date", "Merchant", "Category", "Amount"]]; expensesTable.rows.add(null /*add rows to the end of the table*/, [ ["1/1/2017", "The Phone Company", "Communications", "$120"], ["1/2/2017", "Northwind Electric Cars", "Transportation", "$142"], ["1/5/2017", "Best For You Organics Company", "Groceries", "$27"], ["1/10/2017", "Coho Vineyard", "Restaurant", "$33"], ["1/11/2017", "Bellows College", "Education", "$350"], ["1/15/2017", "Trey Research", "Other", "$135"], ["1/15/2017", "Best For You Organics Company", "Groceries", "$97"] ]); if (Office.context.requirements.isSetSupported("ExcelApi", "1.2")) < sheet.getUsedRange().format.autofitColumns(); sheet.getUsedRange().format.autofitRows(); >sheet.activate(); await context.sync(); >); 

Новая таблица

Новая таблица в Excel.

Добавление строк в таблицу

В примере ниже показано, как добавить семь новых строк в таблицу ExpensesTable (Таблица расходов) на листе Sample (Пример). Параметр index add метода имеет значение null , что указывает, что строки добавляются после существующих строк в таблице. Параметр alwaysInsert имеет значение true , что указывает, что новые строки должны быть вставлены в таблицу, а не под таблицей. Затем ширина столбцов и высота строк задаются в соответствии с текущими данными в таблице.

Свойство index объекта TableRow указывает номер индекса строки в коллекции строк таблицы. Объект TableRow не содержит id свойство, которое можно использовать в качестве уникального ключа для идентификации строки.

// This code sample shows how to add rows to a table that already exists // on a worksheet named Sample. await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.getItem("ExpensesTable"); expensesTable.rows.add( null, // index, Adds rows to the end of the table. [ ["1/16/2017", "THE PHONE COMPANY", "Communications", "$120"], ["1/20/2017", "NORTHWIND ELECTRIC CARS", "Transportation", "$142"], ["1/20/2017", "BEST FOR YOU ORGANICS COMPANY", "Groceries", "$27"], ["1/21/2017", "COHO VINEYARD", "Restaurant", "$33"], ["1/25/2017", "BELLOWS COLLEGE", "Education", "$350"], ["1/28/2017", "TREY RESEARCH", "Other", "$135"], ["1/31/2017", "BEST FOR YOU ORGANICS COMPANY", "Groceries", "$97"] ], true, // alwaysInsert, Specifies that the new rows be inserted into the table. ); sheet.getUsedRange().format.autofitColumns(); sheet.getUsedRange().format.autofitRows(); await context.sync(); >); 

Таблица с новыми строками

Таблица с новыми строками в Excel.

Добавление столбца в таблицу

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

Свойство index объекта TableColumn указывает номер индекса столбца в коллекции столбцов таблицы. Свойство id объекта TableColumn содержит уникальный ключ, идентифицирующий столбец.

Добавление столбца, содержащего статические значения

В примере кода ниже показано, как добавить новый столбец в таблицу ExpensesTable (Таблица расходов) на листе Sample (Пример). Новый столбец будет добавлен после всех существующих столбцов в таблице. Он будет содержать заголовок Day of the Week (День недели), а также данные для заполнения ячеек в столбце. Затем ширина столбцов и высота строк задаются в соответствии с текущими данными в таблице.

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.getItem("ExpensesTable"); expensesTable.columns.add(null /*add columns to the end of the table*/, [ ["Day of the Week"], ["Saturday"], ["Friday"], ["Monday"], ["Thursday"], ["Sunday"], ["Saturday"], ["Monday"] ]); sheet.getUsedRange().format.autofitColumns(); sheet.getUsedRange().format.autofitRows(); await context.sync(); >); 
Таблица с новым столбцом

Таблица с новым столбцом в Excel.

Добавление столбца, содержащего формулы

В примере кода ниже показано, как добавить новый столбец в таблицу ExpensesTable (Таблица расходов) на листе Sample (Пример). Новый столбец будет добавлен в конец таблицы, будет содержать заголовок Type of the Day (Тип дня), и в нем будет использована формула для заполнения каждой ячейки столбца. Затем ширина столбцов и высота строк задаются в соответствии с текущими данными в таблице.

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.getItem("ExpensesTable"); expensesTable.columns.add(null /*add columns to the end of the table*/, [ ["Type of the Day"], ['=IF(OR((TEXT([DATE], "dddd") = "Saturday"), (TEXT([DATE], "dddd") = "Sunday")), "Weekend", "Weekday")'], ['=IF(OR((TEXT([DATE], "dddd") = "Saturday"), (TEXT([DATE], "dddd") = "Sunday")), "Weekend", "Weekday")'], ['=IF(OR((TEXT([DATE], "dddd") = "Saturday"), (TEXT([DATE], "dddd") = "Sunday")), "Weekend", "Weekday")'], ['=IF(OR((TEXT([DATE], "dddd") = "Saturday"), (TEXT([DATE], "dddd") = "Sunday")), "Weekend", "Weekday")'], ['=IF(OR((TEXT([DATE], "dddd") = "Saturday"), (TEXT([DATE], "dddd") = "Sunday")), "Weekend", "Weekday")'], ['=IF(OR((TEXT([DATE], "dddd") = "Saturday"), (TEXT([DATE], "dddd") = "Sunday")), "Weekend", "Weekday")'], ['=IF(OR((TEXT([DATE], "dddd") = "Saturday"), (TEXT([DATE], "dddd") = "Sunday")), "Weekend", "Weekday")'] ]); sheet.getUsedRange().format.autofitColumns(); sheet.getUsedRange().format.autofitRows(); await context.sync(); >); 
Таблица с новым столбцом, содержащим вычисленные значения

Таблица с новым вычисляемым столбцом в Excel.

Изменение размера таблицы

Надстройка может изменять размер таблицы, не добавляя в нее данные или не изменяя значения ячеек. Чтобы изменить размер таблицы, используйте метод Table.resize . В следующем примере кода показано, как изменить размер таблицы. В этом примере кода используется таблица ExpensesTable из раздела Создание таблицы ранее в этой статье и для нового диапазона таблицы устанавливается значение A1:D20.

await Excel.run(async (context) => < // Retrieve the worksheet and a table on that worksheet. let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.getItem("ExpensesTable"); // Resize the table. expensesTable.resize("A1:D20"); await context.sync(); >); 

Новый диапазон таблицы должен перекрываться исходным диапазоном, а заголовки (или верхняя часть таблицы) должны находиться в одной строке.

Таблица после изменения размера

Таблица с несколькими пустыми строками в Excel.

Изменение имени столбца

В примере кода ниже показано, как изменить имя первого столбца в таблице на Purchase date. Затем ширина столбцов и высота строк задаются в соответствии с текущими данными в таблице.

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.getItem("ExpensesTable"); expensesTable.columns.load("items"); await context.sync(); expensesTable.columns.items[0].name = "Purchase date"; sheet.getUsedRange().format.autofitColumns(); sheet.getUsedRange().format.autofitRows(); await context.sync(); >); 

Таблица со столбцом с новым именем

Таблица с новым именем столбца в Excel.

Получение данных из таблицы

В примере кода ниже показано, как считать данные из таблицы ExpensesTable (Таблица расходов), размещенной на листе Sample (Пример), а затем отобразить эти данные под таблицей на том же листе.

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.getItem("ExpensesTable"); // Get data from the header row. let headerRange = expensesTable.getHeaderRowRange().load("values"); // Get data from the table. let bodyRange = expensesTable.getDataBodyRange().load("values"); // Get data from a single column. let columnRange = expensesTable.columns.getItem("Merchant").getDataBodyRange().load("values"); // Get data from a single row. let rowRange = expensesTable.rows.getItemAt(1).load("values"); // Sync to populate proxy objects with data from Excel. await context.sync(); let headerValues = headerRange.values; let bodyValues = bodyRange.values; let merchantColumnValues = columnRange.values; let secondRowValues = rowRange.values; // Write data from table back to the sheet sheet.getRange("A11:A11").values = [["Results"]]; sheet.getRange("A13:D13").values = headerValues; sheet.getRange("A14:D20").values = bodyValues; sheet.getRange("B23:B29").values = merchantColumnValues; sheet.getRange("A32:D32").values = secondRowValues; // Sync to update the sheet in Excel. await context.sync(); >); 

Таблица и выведенные данные

Данные таблицы в Excel.

Обнаружение изменений данных

Возможно, надстройке потребуется реагировать на изменения пользователями данных в таблице. Чтобы обнаружить эти изменения, можно зарегистрировать обработчик событий для события onChanged таблицы. Обработчики события onChanged получают объект TableChangedEventArgs при возникновении события.

Объект TableChangedEventArgs предоставляет сведения об изменениях и источнике. Так как событие onChanged возникает при изменении формата или значения данных, может быть полезно, чтобы надстройка проверяла, действительно ли значения изменились. Свойство details объединяет эти сведения в виде интерфейса ChangedEventDetail. В следующем примере кода показано, как отобразить значения и типы измененной ячейки до и после изменения.

// This function would be used as an event handler for the Table.onChanged event. async function onTableChanged(eventArgs) < await Excel.run(async (context) =>< let details = eventArgs.details; let address = eventArgs.address; // Print the before and after types and values to the console. console.log(`Change at $: was $($),` + ` now is $($)`); await context.sync(); >); > 

Сортировка данных в таблице

В примере кода ниже показано, как отсортировать данные по убыванию в четвертом столбце таблицы.

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.getItem("ExpensesTable"); // Queue a command to sort data by the fourth column of the table (descending). let sortRange = expensesTable.getDataBodyRange(); sortRange.sort.apply([ < key: 3, ascending: false, >, ]); // Sync to run the queued command in Excel. await context.sync(); >); 

Данные таблицы, отсортированные по столбцу Amount (Сумма) в порядке убывания

Отсортированные данные таблицы в Excel.

При сортировке данных на листе создается уведомление о событии. Дополнительные сведения о событиях, связанных с сортировкой, и о регистрации обработчиков событий надстройкой в ответ на такие события см. в статье Обработка событий сортировки.

Применение фильтров к таблице

В примере кода ниже показано, как применить фильтры для столбцов Amount (Сумма) и Category (Категория) в таблице. В результате применения фильтров будут отображены только те строки, у которых в столбце Category (Категория) содержится одно из указанных значений, а значения в столбце Amount (Сумма) меньше среднего значения для всех строк.

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.getItem("ExpensesTable"); // Queue a command to apply a filter on the Category column. let categoryFilter = expensesTable.columns.getItem("Category").filter; categoryFilter.apply(< filterOn: Excel.FilterOn.values, values: ["Restaurant", "Groceries"] >); // Queue a command to apply a filter on the Amount column. let amountFilter = expensesTable.columns.getItem("Amount").filter; amountFilter.apply(< filterOn: Excel.FilterOn.dynamic, dynamicCriteria: Excel.DynamicFilterCriteria.belowAverage >); // Sync to run the queued commands in Excel. await context.sync(); >); 

Таблица данных, в которой применены фильтры для столбцов Category (Категория) и Amount (Сумма)

Данные таблицы, отфильтрованные в Excel.

Удаление фильтров в таблице

В примере кода ниже показано, как удалить все фильтры, примененные к таблице.

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.getItem("ExpensesTable"); expensesTable.clearFilters(); await context.sync(); >); 

Данные таблицы без фильтров

Данные таблицы не фильтруются в Excel.

Получение отображаемого диапазона из отфильтрованной таблицы

В примере кода ниже показано, как получить диапазон, содержащий данные только из тех ячеек, которые в данный момент отображаются в указанной таблице, и записать значения из этого диапазона в консоль. Метод, как показано ниже, можно использовать getVisibleView() для получения видимого содержимого таблицы при каждом применении фильтров столбцов.

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.getItem("ExpensesTable"); let visibleRange = expensesTable.getDataBodyRange().getVisibleView(); visibleRange.load("values"); await context.sync(); console.log(visibleRange.values); >); 

Автофильтр

Надстройка может использовать объект AutoFilter таблицы для фильтрации данных. Объект AutoFilter является целой структурой фильтра таблицы или диапазона. Все операции фильтрации, описанные выше в этой статье, совместимы с автофильтром. Единая точка доступа упрощает доступ к нескольким фильтрам и управление ими.

В следующем примере кода показана такая же фильтрация данных, как в примере кода выше, но выполненная полностью с помощью автофильтра.

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.getItem("ExpensesTable"); expensesTable.autoFilter.apply(expensesTable.getRange(), 2, < filterOn: Excel.FilterOn.values, values: ["Restaurant", "Groceries"] >); expensesTable.autoFilter.apply(expensesTable.getRange(), 3, < filterOn: Excel.FilterOn.dynamic, dynamicCriteria: Excel.DynamicFilterCriteria.belowAverage >); await context.sync(); >); 

Объект AutoFilter можно также применять к диапазону на уровне листа. Дополнительные сведения см. в статье Работа с листами с использованием API JavaScript для Excel.

Форматирование таблицы

В примере кода ниже показано, как применить форматирование к таблице. В примере показано, как указать различные цвета заливки для строки заголовков, основной части, второй строки и первого столбца таблицы. Сведения о свойствах, которые вы можете использовать для задания формата, см. в статье Объект RangeFormat (API JavaScript для Excel).

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.getItem("ExpensesTable"); expensesTable.getHeaderRowRange().format.fill.color = "#C70039"; expensesTable.getDataBodyRange().format.fill.color = "#DAF7A6"; expensesTable.rows.getItemAt(1).getRange().format.fill.color = "#FFC300"; expensesTable.columns.getItemAt(0).getDataBodyRange().format.fill.color = "#FFA07A"; await context.sync(); >); 

Таблица после применения форматирования

Таблица после форматирования применяется в Excel.

Преобразование диапазона в таблицу

В примере кода ниже показано, как создать диапазон данных и преобразовывать его в таблицу. Затем ширина столбцов и высота строк задаются в соответствии с текущими данными в таблице.

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); // Define values for the range. let values = [["Product", "Qtr1", "Qtr2", "Qtr3", "Qtr4"], ["Frames", 5000, 7000, 6544, 4377], ["Saddles", 400, 323, 276, 651], ["Brake levers", 12000, 8766, 8456, 9812], ["Chains", 1550, 1088, 692, 853], ["Mirrors", 225, 600, 923, 544], ["Spokes", 6005, 7634, 4589, 8765]]; // Create the range. let range = sheet.getRange("A1:E7"); range.values = values; sheet.getUsedRange().format.autofitColumns(); sheet.getUsedRange().format.autofitRows(); sheet.activate(); // Convert the range to a table. let expensesTable = sheet.tables.add('A1:E7', true); expensesTable.name = "ExpensesTable"; await context.sync(); >); 

Данные в диапазоне (перед его преобразованием в таблицу)

Данные в диапазоне в Excel.

Данные в таблице (после преобразования диапазона в таблицу)

Данные в таблице Excel.

Импорт данных JSON в таблицу

В примере кода ниже показано, как создать таблицу на листе Sample (Пример), а затем заполнить ее с помощью объекта JSON, который определяет две строки данных. Затем ширина столбцов и высота строк задаются в соответствии с текущими данными в таблице.

await Excel.run(async (context) => < let sheet = context.workbook.worksheets.getItem("Sample"); let expensesTable = sheet.tables.add("A1:D1", true /*hasHeaders*/); expensesTable.name = "ExpensesTable"; expensesTable.getHeaderRowRange().values = [["Date", "Merchant", "Category", "Amount"]]; let transactions = [ < "DATE": "1/1/2017", "MERCHANT": "The Phone Company", "CATEGORY": "Communications", "AMOUNT": "$120" >, < "DATE": "1/1/2017", "MERCHANT": "Southridge Video", "CATEGORY": "Entertainment", "AMOUNT": "$40" >]; let newData = transactions.map(item => [item.DATE, item.MERCHANT, item.CATEGORY, item.AMOUNT]); expensesTable.rows.add(null, newData); sheet.getUsedRange().format.autofitColumns(); sheet.getUsedRange().format.autofitRows(); sheet.activate(); await context.sync(); >); 

Новая таблица

Новая таблица из импортированных данных JSON в Excel.

См. также

Рекомендации по работе с API Excel

В этой статье приведены рекомендации по работе с API Excel в Microsoft Graph.

Наиболее эффективным способом управления сеансами

Если у вас есть несколько вызовов в течение определенного периода времени, рекомендуется создать сеанс и передать идентификатор сеанса с каждым запросом. Чтобы представить сеанс в API, используйте заголовок workbook-session-id: . Это позволяет наиболее эффективно использовать API-интерфейсы Excel.

В следующем примере показано, как добавить новое число в таблицу, а затем найти одну запись в книге с помощью этого подхода.

Шаг 1. Создание сеанса

Запрос
POST https://graph.microsoft.com/v1.0/me/drive/items//workbook/createSession Content-type: application/json
 // Code snippets are only available for the latest version. Current version is 5.x // Dependencies using Microsoft.Graph.Drives.Item.Items.Item.Workbook.CreateSession; var requestBody = new CreateSessionPostRequestBody < PersistChanges = true, >; // To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp var result = await graphClient.Drives[""].Items[""].Workbook.CreateSession.PostAsync(requestBody); 
 // THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY mgc drives items workbook create-session post --drive-id --drive-item-id --body '\ ' 
 import ( "context" msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go" graphdrives "github.com/microsoftgraph/msgraph-sdk-go/drives" //other-imports ) graphClient := msgraphsdk.NewGraphServiceClientWithCredentials(cred, scopes) requestBody := graphdrives.NewCreateSessionPostRequestBody() persistChanges := true requestBody.SetPersistChanges(&persistChanges) createSession, err := graphClient.Drives().ByDriveId("drive-id").Items().ByDriveItemId("driveItem-id").Workbook().CreateSession().Post(context.Background(), requestBody, nil) 
 GraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider( authProvider ).buildClient(); Boolean persistChanges = true; graphClient.me().drive().items("").workbook() .createSession(WorkbookCreateSessionParameterSet .newBuilder() .withPersistChanges(persistChanges) .build()) .buildRequest() .post(); 
 const options = < authProvider, >; const client = Client.init(options); const workbookSessionInfo = < persistChanges: true >; await client.api('/me/drive/items//workbook/createSession') .post(workbookSessionInfo); 
 setPersistChanges(true); $result = $graphServiceClient->drives()->byDriveId('drive-id')->items()->byDriveItemId('driveItem-id')->workbook()->createSession()->post($requestBody)->wait(); 
 graph_client = GraphServiceClient(credentials, scopes) request_body = CreateSessionPostRequestBody( persist_changes = True, ) result = await graph_client.drives.by_drive_id('drive-id').items.by_drive_item_id('driveItem-id').workbook.create_session.post(request_body) 
Отклик

Ниже приведен успешный ответ.

HTTP/1.1 201 Created Content-type: application/json

Шаг 2. Добавление новой строки в таблицу

Запрос

POST https://graph.microsoft.com/v1.0/me/drive/items//workbook/tables//rows/add Content-type: application/json workbook-session-id:

Snippet not available 
 // THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY mgc drives items workbook tables rows add post --drive-id --drive-item-id --workbook-table-id --body '\ ' 
Snippet not available 
Snippet not available 
 const options = < authProvider, >; const client = Client.init(options); const workbookTableRow = < values: [[“east”, “pear”, 4]] >; await client.api('/me/drive/items//workbook/tables//rows/add') .post(workbookTableRow); 
Snippet not available 
Snippet not available 
Отклик
HTTP/1.1 200 OK Content-type: application/json

Шаг 3. Поиск значения в обновленной таблице

Запрос
POST https://graph.microsoft.com/v1.0/me/drive/items//workbook/functions/vlookup Content-type: application/json workbook-session-id: < "lookupValue":"pear", "tableArray":, "colIndexNum":2, "rangeLookup":false > 
 // Code snippets are only available for the latest version. Current version is 5.x // Dependencies using Microsoft.Graph.Drives.Item.Items.Item.Workbook.Functions.Vlookup; using Microsoft.Graph.Models; var requestBody = new VlookupPostRequestBody < LookupValue = "pear", TableArray = new Json < AdditionalData = new Dictionary< < "Address" , "Sheet1!B2:C7" >, >, >, ColIndexNum = 2, RangeLookup = false, >; // To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp var result = await graphClient.Drives[""].Items[""].Workbook.Functions.Vlookup.PostAsync(requestBody, (requestConfiguration) => < requestConfiguration.Headers.Add("workbook-session-id", ""); >); 
 // THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY mgc drives items workbook functions vlookup post --drive-id --drive-item-id --body ',\ "colIndexNum":2,\ "rangeLookup":false\ >\ ' 
 import ( "context" abstractions "github.com/microsoft/kiota-abstractions-go" msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go" graphdrives "github.com/microsoftgraph/msgraph-sdk-go/drives" graphmodels "github.com/microsoftgraph/msgraph-sdk-go/models" //other-imports ) graphClient := msgraphsdk.NewGraphServiceClientWithCredentials(cred, scopes) headers := abstractions.NewRequestHeaders() headers.Add("workbook-session-id", "") configuration := &graphdrives.DriveItemItemItemWorkbookFunctionsVlookupRequestBuilderPostRequestConfiguration < Headers: headers, >requestBody := graphdrives.NewVlookupPostRequestBody() lookupValue := "pear" requestBody.SetLookupValue(&lookupValue) tableArray := graphmodels.NewJson() additionalData := map[string]interface<> < "address" : "Sheet1!B2:C7", >tableArray.SetAdditionalData(additionalData) requestBody.SetTableArray(tableArray) colIndexNum := int32(2) requestBody.SetColIndexNum(&colIndexNum) rangeLookup := false requestBody.SetRangeLookup(&rangeLookup) vlookup, err := graphClient.Drives().ByDriveId("drive-id").Items().ByDriveItemId("driveItem-id").Workbook().Functions().Vlookup().Post(context.Background(), requestBody, configuration) 
Snippet not available 
 const options = < authProvider, >; const client = Client.init(options); const workbookFunctionResult = < lookupValue: 'pear', tableArray: , colIndexNum: 2, rangeLookup: false >; await client.api('/me/drive/items//workbook/functions/vlookup') .post(workbookFunctionResult); 
 setLookupValue('pear'); $tableArray = new Json(); $additionalData = [ 'Address' => 'Sheet1!B2:C7', ]; $tableArray->setAdditionalData($additionalData); $requestBody->setTableArray($tableArray); $requestBody->setColIndexNum(2); $requestBody->setRangeLookup(false); $requestConfiguration = new VlookupRequestBuilderPostRequestConfiguration(); $headers = [ 'workbook-session-id' => '', ]; $requestConfiguration->headers = $headers; $result = $graphServiceClient->drives()->byDriveId('drive-id')->items()->byDriveItemId('driveItem-id')->workbook()->functions()->vlookup()->post($requestBody, $requestConfiguration)->wait(); 
 graph_client = GraphServiceClient(credentials, scopes) request_body = VlookupPostRequestBody( lookup_value = "pear", table_array = Json( additional_data = < "address" : "Sheet1!B2:C7", >), col_index_num = 2, range_lookup = False, ) request_configuration = VlookupRequestBuilder.VlookupRequestBuilderPostRequestConfiguration() request_configuration.headers.add("workbook-session-id", "") result = await graph_client.drives.by_drive_id('drive-id').items.by_drive_item_id('driveItem-id').workbook.functions.vlookup.post(request_body, request_configuration = request_configuration) 
Отклик
HTTP code: 200 OK content-type: application/json

Шаг 4. Закрытие сеанса после завершения всех запросов

Запрос

POST https://graph.microsoft.com/v1.0/me/drive/items//workbook/closeSession Content-type: application/json workbook-session-id:

 // Code snippets are only available for the latest version. Current version is 5.x // Dependencies using Microsoft.Graph.Drives.Item.Items.Item.Workbook.CloseSession; var requestBody = new CloseSessionPostRequestBody < >; // To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp await graphClient.Drives[""].Items[""].Workbook.CloseSession.PostAsync(requestBody, (requestConfiguration) => < requestConfiguration.Headers.Add("workbook-session-id", ""); >); 
 // THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY mgc drives items workbook close-session post --drive-id --drive-item-id --body '\ ' 
 import ( "context" abstractions "github.com/microsoft/kiota-abstractions-go" msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go" graphdrives "github.com/microsoftgraph/msgraph-sdk-go/drives" //other-imports ) graphClient := msgraphsdk.NewGraphServiceClientWithCredentials(cred, scopes) headers := abstractions.NewRequestHeaders() headers.Add("workbook-session-id", "") configuration := &graphdrives.DriveItemItemItemWorkbookCloseSessionRequestBuilderPostRequestConfiguration < Headers: headers, >requestBody := graphdrives.NewCloseSessionPostRequestBody() graphClient.Drives().ByDriveId("drive-id").Items().ByDriveItemId("driveItem-id").Workbook().CloseSession().Post(context.Background(), requestBody, configuration) 
 GraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider( authProvider ).buildClient(); LinkedList requestOptions = new LinkedList(); requestOptions.add(new HeaderOption("workbook-session-id", "")); graphClient.me().drive().items("").workbook() .closeSession() .buildRequest( requestOptions ) .post(); 
 const options = < authProvider, >; const client = Client.init(options); const closeSession = < >; await client.api('/me/drive/items//workbook/closeSession') .post(closeSession); 
  '', ]; $requestConfiguration->headers = $headers; $graphServiceClient->drives()->byDriveId('drive-id')->items()->byDriveItemId('driveItem-id')->workbook()->closeSession()->post($requestBody, $requestConfiguration)->wait(); 
 graph_client = GraphServiceClient(credentials, scopes) request_body = CloseSessionPostRequestBody( ) request_configuration = CloseSessionRequestBuilder.CloseSessionRequestBuilderPostRequestConfiguration() request_configuration.headers.add("workbook-session-id", "") await graph_client.drives.by_drive_id('drive-id').items.by_drive_item_id('driveItem-id').workbook.close_session.post(request_body, request_configuration = request_configuration) 
Отклик
HTTP/1.1 204 No Content 

Работа с API- интерфейсами, которые занимают много времени

Вы можете заметить, что для выполнения некоторых операций требуется неопределенное время; например, открытие большой книги. Легко достичь времени ожидания ответа на эти запросы. Чтобы устранить эту проблему, мы предоставляем шаблон длительных операций. При использовании этого шаблона вам не нужно беспокоиться о времени ожидания запроса.

В настоящее время для создания сеанса API Excel в Microsoft Graph включен шаблон длительной операции. Этот шаблон включает в себя следующие шаги:

  1. Добавьте в Prefer: respond-async запрос заголовок, чтобы указать, что это длительная операция при создании сеанса.
  2. Длительная операция возвращает 202 Accepted ответ вместе с заголовком Location для получения состояния операции. Если создание сеанса завершается в течение нескольких секунд, он возвращает обычный ответ сеанса создания вместо того, чтобы использовать шаблон длительной операции.
  3. 202 Accepted С помощью ответа можно получить состояние операции в указанном расположении. Значения состояния операции: notStarted , running , succeeded и failed .
  4. После завершения операции вы можете получить результат создания сеанса по указанному URL-адресу в успешном ответе.

В следующем примере создается сеанс с использованием шаблона длительных операций.

Первоначальный запрос на создание сеанса

Запрос
POST https://graph.microsoft.com/v1.0/me/drive/items//workbook/createSession Prefer: respond-async Content-type: application/json
 // Code snippets are only available for the latest version. Current version is 5.x // Dependencies using Microsoft.Graph.Drives.Item.Items.Item.Workbook.CreateSession; var requestBody = new CreateSessionPostRequestBody < PersistChanges = true, >; // To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp var result = await graphClient.Drives[""].Items[""].Workbook.CreateSession.PostAsync(requestBody, (requestConfiguration) => < requestConfiguration.Headers.Add("Prefer", "respond-async"); >); 
 // THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY mgc drives items workbook create-session post --drive-id --drive-item-id --body '\ ' 
 import ( "context" abstractions "github.com/microsoft/kiota-abstractions-go" msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go" graphdrives "github.com/microsoftgraph/msgraph-sdk-go/drives" //other-imports ) graphClient := msgraphsdk.NewGraphServiceClientWithCredentials(cred, scopes) headers := abstractions.NewRequestHeaders() headers.Add("Prefer", "respond-async") configuration := &graphdrives.DriveItemItemItemWorkbookCreateSessionRequestBuilderPostRequestConfiguration < Headers: headers, >requestBody := graphdrives.NewCreateSessionPostRequestBody() persistChanges := true requestBody.SetPersistChanges(&persistChanges) createSession, err := graphClient.Drives().ByDriveId("drive-id").Items().ByDriveItemId("driveItem-id").Workbook().CreateSession().Post(context.Background(), requestBody, configuration) 
 GraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider( authProvider ).buildClient(); LinkedList requestOptions = new LinkedList(); requestOptions.add(new HeaderOption("Prefer", "respond-async")); Boolean persistChanges = true; graphClient.me().drive().items("").workbook() .createSession(WorkbookCreateSessionParameterSet .newBuilder() .withPersistChanges(persistChanges) .build()) .buildRequest( requestOptions ) .post(); 
 const options = < authProvider, >; const client = Client.init(options); const workbookSessionInfo = < persistChanges: true >; await client.api('/me/drive/items//workbook/createSession') .post(workbookSessionInfo); 
 setPersistChanges(true); $requestConfiguration = new CreateSessionRequestBuilderPostRequestConfiguration(); $headers = [ 'Prefer' => 'respond-async', ]; $requestConfiguration->headers = $headers; $result = $graphServiceClient->drives()->byDriveId('drive-id')->items()->byDriveItemId('driveItem-id')->workbook()->createSession()->post($requestBody, $requestConfiguration)->wait(); 
 graph_client = GraphServiceClient(credentials, scopes) request_body = CreateSessionPostRequestBody( persist_changes = True, ) request_configuration = CreateSessionRequestBuilder.CreateSessionRequestBuilderPostRequestConfiguration() request_configuration.headers.add("Prefer", "respond-async") result = await graph_client.drives.by_drive_id('drive-id').items.by_drive_item_id('driveItem-id').workbook.create_session.post(request_body, request_configuration = request_configuration) 
Отклик

Шаблон длительных операций возвращает ответ, аналогичный 202 Accepted приведенному ниже.

HTTP/1.1 202 Accepted Location: https://graph.microsoft.com/v1.0/me/drive/items//workbook/operations/ Content-type: application/json

В некоторых случаях, если создание завершается успешно в течение нескольких секунд, оно не будет входить в шаблон длительной операции. Вместо этого он возвращается в виде обычного сеанса создания, и успешный запрос вернет 201 Created ответ.

HTTP/1.1 201 Created Content-type: application/json

В следующем примере показан ответ при сбое запроса.

Примечание. Объект отклика, показанный здесь, может быть сокращен для удобочитаемости.

HTTP/1.1 500 Internal Server Error Content-type: application/json < "error":< "code": "internalServerError", "message": "An internal server error occurred while processing the request.", "innerError": < "code": "internalServerErrorUncategorized", "message": "An unspecified error has occurred.", "innerError": < "code": "GenericFileOpenError", "message": "The workbook cannot be opened." >> > > 

Опрос состояния длительного сеанса создания

С помощью шаблона длительных операций можно получить состояние создания в указанном расположении с помощью следующего запроса. Рекомендуемый интервал для опроса состояния составляет около 30 секунд. Максимальный интервал должен быть не более 4 минут.

Запрос

GET https://graph.microsoft.com/v1.0/me/drive/items//workbook/operations/

Отклик

Ниже приведен ответ, если операция имеет состояние running .

HTTP/1.1 200 OK Content-type: application/json < "id": , "status": "running" > 

Ниже приведен ответ, если состояние операции — succeeded .

HTTP/1.1 200 OK Content-type: application/json < "id": , "status": "succeeded", "resourceLocation": "https://graph.microsoft.com/v1.0/me/drive/items//workbook/sessionInfoResource(key='') > 

Ниже приведен ответ, если состояние операции — failed .

HTTP/1.1 200 OK Content-type: application/json < "id": , "status": "failed", "error": < "code": "internalServerError", "message": "An internal server error occurred while processing the request.", "innerError": < "code": ""internalServerErrorUncategorized", "message": "An unspecified error has occurred.", "innerError": < "code": "GenericFileOpenError", "message": "The workbook cannot be opened." >> > > 

Дополнительные сведения об ошибках см. в разделе Коды ошибок и сообщения.

Получение сведений о сеансе

Запрос

С состоянием succeeded можно получить сведения о созданном сеансе с resourceLocation помощью запроса, аналогичного приведенному ниже.

GET https://graph.microsoft.com/v1.0/me/drive/items//workbook/sessionInfoResource(key='')
Отклик

Ниже приведен отклик.

HTTP/1.1 200 OK Content-type: application/json

Получение сведений о сеансе зависит от первоначального запроса. Вам не нужно получать результат, если исходный запрос не возвращает текст ответа.

Уменьшение ошибок регулирования

API Excel в Microsoft Graph влияют на использование ресурсов нескольких служб зависимостей. Влияние может отличаться в разных запросах: например, можно ожидать, что обновление короткой строки в одной ячейке небольшой книги будет потреблять меньше ресурсов, чем добавление большой таблицы со сложными формулами в большую книгу.

Даже при использовании одного и того же API параметры и целевые книги могут привести к значительным различиям. Поэтому регулирование API Excel не определяется с простыми и универсальными номерами ограничений, так как они приводят к более строгим ограничениям. Приведенные ниже рекомендации помогут быстрее выполнять задачи с меньшим количеством ошибок регулирования.

заголовок Retry-After

Во многих случаях ответ регулирования включает заголовок Retry-After . Соблюдение значения заголовка и задержка аналогичных запросов помогут клиенту восстановиться после регулирования. Дополнительные сведения об обработке ответов на ошибки из API Excel в Microsoft Graph см. в статье Обработка ошибок для API Excel в Microsoft Graph.

Регулирование и параллелизм

Другим фактором, связанным с регулированием, является параллелизм запросов. Не рекомендуется увеличивать параллелизм при использовании API Excel (например, при параллелизации запросов к одной книге), особенно для запросов на запись. Вместо этого, если нет конкретных проблем, таких как значительные сетевые издержки по сравнению с очень коротким временем выполнения запроса, рекомендуется последовательное использование в наиболее распространенном случае: для каждой книги отправляется только следующий запрос после успешного получения ответа на текущий запрос.

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

См. также

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *