Microsoft graph api Microsoft Graph API何时在Excel中完成计算?

Microsoft graph api Microsoft Graph API何时在Excel中完成计算?,microsoft-graph-api,microsoft-graph-excel,Microsoft Graph Api,Microsoft Graph Excel,我可以在这里看到如何使用Microsoft Graph API触发电子表格的计算。。。 但是,当我从计算中提取结果时,它们似乎没有更新。然而,我拉了第二次或第三次,它通常是更新 我假设这意味着计算并没有完成文件大小或计算复杂性的b/c 然而,由于是异步的,我没有找到任何方法来检查计算何时完成 你知道怎么做吗 更新1: 这是我(现在)用来创建会话的代码(per) 这会给我一个像这样的“id”值 cluster=US5&session=15.SN3PEPF000074ED1.A82.1.V

我可以在这里看到如何使用Microsoft Graph API触发电子表格的计算。。。

但是,当我从计算中提取结果时,它们似乎没有更新。然而,我拉了第二次或第三次,它通常是更新

我假设这意味着计算并没有完成文件大小或计算复杂性的b/c

然而,由于是异步的,我没有找到任何方法来检查计算何时完成

你知道怎么做吗

更新1:

这是我(现在)用来创建会话的代码(per)

这会给我一个像这样的“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
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;
    }

}
我不确定如何/在何处使用它,或者我是否使用整个东西(它看起来像一个查询字符串),或者我是否应该解析并提取其中一个值

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();
另外,我发现可以创建、刷新和关闭会话,但不能完全确定如何检查会话中的特定异步进程

下面是我用来检查特定范围内某个值的代码,也不确定在哪里传递
会话id

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

通过传递
工作簿会话id
(上面显示的整个字符串),我可以在同一会话中成功运行API调用(可能),并得到预期的
204无内容
响应。但是,从Microsoft Graph Explorer中的c#代码片段不清楚如何在请求中传递工作簿会话id

下面是它提供的代码

GraphServiceClient graphClient = new GraphServiceClient( authProvider );

await graphClient.Me.Drive.Items["{item-id}"].Workbook.Application
    .Calculate(null)
    .Request()
    .PostAsync();
因此问题仍然存在,我如何执行
PostAsync
GetAsync
并引用
工作簿会话id

这个代码没有给我一个错误

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

现在的问题是,我什么时候才能获得
工作簿会话id
?当我最初打开工作簿,然后将其传递给每个呼叫时,我是否得到了它?

您应该创建一个会话,并在每个请求中传递会话Id。出现 请求中的会话Id确保您以最高效的方式使用Excel API 这是可能的


在这里查看

,经过大量测试后,我找到了答案

答案是使用
CreateSession
方法()获取工作簿信息,然后设置
persistChanges
设置,然后返回有关工作簿会话的信息

像这样

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
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;
    }

}
使用Microsoft.Graph;
//strItemId=项目的microsoft graph api中的id
//strUserId=来自microsoft graph api的用户id(注意:必须正确设置权限)
公共静态异步任务GetWorkbooksSessionId(字符串strItemId、字符串strUserId)
{
//true=您可以在工作簿中看到更改
//false=不更新工作簿,只进行计算
var=true;
尝试
{
var wrkbk=await-graphClient.Users[strUserId].Drive.Items[strItemId].工作簿
.CreateSession(持久化更改)
.Request()
.PostAsync();
var结果=wrkbk;
返回结果;
}
捕获(例外情况除外)
{
WriteLine($“获取项时出错:{ex.Message}”);
返回null;
}
}
然后返回一个
WorkbookSessionInfo
对象,其中包括
SessionId
,供后续调用使用。这样,它可以使您的所有呼叫保持在同一会话中


啊,好吧,开始有意义了。但是如何使用calculate函数传递会话id(在c中)?会话似乎处于
工作簿
级别,没有看到任何关于如何在
工作簿.应用程序
级别使用会话id的文档。@gotmike,感谢您的回复。为什么不试试这是图形浏览器一次,在请求头中传递会话id并检查它是否工作。这可能是api的问题。这个异步应该可以在这里工作。好的,我在图形浏览器中尝试了一下,得到了一个会话id(上面提到的更新),但不确定在触发计算的步骤中如何使用它。而且,我不知道如何知道它何时完成。