Когда Microsoft Graph API завершает расчет в Excel?

Я могу увидеть, как запустить расчет электронной таблицы с помощью Microsoft Graph API здесь... https://docs.microsoft.com/en-us/graph/api/workbookapplication-calculate?view=graph-rest-1.0&tabs=http

Но когда я получаю результаты расчетов, они, кажется, не обновляются. Однако подтягиваю второй-третий раз, обычно обновляется.

Я предполагаю, что это означает, что расчет еще не завершен b/c размера файла или сложности вычислений.

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

есть идеи как это сделать?

ОБНОВЛЕНИЕ 1:

Это код, который я (сейчас) использую для создания сеанса (согласно @UJJAVAL123-MSFT)

var persistChanges = false;

var wrkbk = await graphClient.Me.Drive.Items[strItemId].Workbook
    .CreateSession(persistChanges)
    .Request()
    .PostAsync();

Это даст мне такое значение для id...

cluster=US5&session=15.SN3PEPF000074ED1.A82.1.V24.7737Nwad4oPuVafaO%2fpAkiay14.5.en-US5.en-US26.10037ffe965d2cf2-Unlimited1.A1.N16.16.0.12904.3505114.5.en-US5.en-US1.V1.N0.1.A&usid=1b230e8f-3bd0-cdaa-2da6-47db74154075

Я не совсем уверен, как / где это использовать, или использую ли я все это (похоже на строку запроса), или я должен анализировать и вытаскивать одно из значений...

cluster=US5
session=15.SN3PEPF000074ED1.A82.1.V24.xxxxxxxxxxxxxxxxx%2fpAkiay14.5.en-US5.en-US26.10037ffe965d2cf2-Unlimited1.A1.N16.16.0.12904.3505114.5.en-US5.en-US1.V1.N0.1.A
usid=1b230e8f-3bd0-cdaa-2da6-xxxxxxxxxxxx

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

var calculationType = "FullRebuild";

await graphClient.Me.Drive.Items[strItemId].Workbook.Application
    .Calculate(calculationType)
    .Request()
    .PostAsync();

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

Вот код, который я использую для проверки определенного диапазона для значения, не уверен, где мы передаем session-id здесь либо...

var result = await graphClient.Me.Drive.Items[strItemId].Workbook.Worksheets[strSheetName]
    .Range(strRangeName)
    .Request()
    .GetAsync();

ОБНОВЛЕНИЕ 2:

Я могу успешно запустить вызов API (предположительно) в том же сеансе, передав workbook-session-id (это ВСЯ строка, показанная выше), и я получаю ожидаемую 204 No Contentответ. Однако из фрагмента кода C# в Microsoft Graph Explorer неясно, как передатьworkbook-session-id в запросе.

Вот код, который он предоставляет...

GraphServiceClient graphClient = new GraphServiceClient( authProvider );

await graphClient.Me.Drive.Items["{item-id}"].Workbook.Application
    .Calculate(null)
    .Request()
    .PostAsync();

Итак, остается вопрос, как я могу PostAsync или GetAsync и ссылка на workbook-session-id?

Этот код НЕ дает мне ошибки...

await graphClient.Me.Drive.Items[strItemId].Workbook.Application
    .Calculate(calculationType)
    .Request()
    .Header("workbook-session-id",wrkbk.Id)
    .PostAsync();

Итак, вопрос в том, КОГДА я получу workbook-session-id? Получаю ли я его, когда сначала открываю книгу, а затем передаю ее каждому звонку?

2 ответа

Решение

Итак, после приличного количества тестов я понял это.

Ответ в том, что вы используете CreateSession(https://docs.microsoft.com/en-us/graph/api/workbook-createsession?view=graph-rest-1.0&tabs=http), чтобы получить информацию о книге, и вы устанавливаетеpersistChanges настройки, то вы получите обратно информацию о сеансе книги.

Как это...

using Microsoft.Graph;

// strItemId = the id from the microsoft graph api of the item
// strUserId = the id of the user from the microsoft graph api (note: must have permissions set correctly)
public static async Task<WorkbookSessionInfo> GetWorkbookSessionId(string strItemId, string strUserId)
{

    // true = you can see changes in the workbook
    // false = don't update the workbook, just do calculations
    var persistChanges = true;

    try
    {

        var wrkbk = await graphClient.Users[strUserId].Drive.Items[strItemId].Workbook
        .CreateSession(persistChanges)
        .Request()
        .PostAsync();

        var result = wrkbk;

        return result;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error getting items: {ex.Message}");
        return null;
    }

}

И вам вернули WorkbookSessionInfo объект, который включает SessionIdдля использования в последующих звонках. Таким образом, он сохраняет все ваши звонки в одном сеансе!

https://docs.microsoft.com/en-us/graph/api/resources/workbooksessioninfo?view=graph-rest-1.0

Вы должны создать сеанс и передавать идентификатор сеанса с каждым запросом. Наличие идентификатора сеанса в запросах гарантирует, что вы используете API Excel наиболее эффективным способом.

Проверьте здесь вызов API, чтобы получить сеанс

Другие вопросы по тегам