Когда 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, чтобы получить сеанс