使用 Microsoft Graph API 更新 Excel 命名范围中的值

Update Values in Excel Named Ranges using Microsoft Graph API

我有一个 Excel 文件加载到 Office 365 中,可通过 Microsoft Graph API 访问该文件,其中包含许多命名范围,有些是单独的值,有些是单元格块。

我可以使用 API 成功更新单个值,但是当我尝试同时更新多个单元格时,我 运行 遇到了问题。

对于此示例,考虑来自 F10:F12

的单个 3 元胞数组

我想填充如下:

F10 = A

F11 = B

F12 = C

因此,我创建了最终看起来像这样的字符串列表... [ ["A"], ["B"], ["C"] ]

然后我使用以下代码将其传递给图表 API...

public static async Task<WorkbookRange> UpdateRangeArray(string strItemId, string strSheetName, string strRangeName, List<string> strRangeValues, string strSessionId)
{
    string[][] strValueArray = new string[strRangeValues.Count][];
    try
    {
        int i = 0;
        foreach (var val in strRangeValues)
        {
            strValueArray[i] = new string[1] { val };
            i++;
        }
    }

    var jsonValueArray = JsonConvert.SerializeObject(strValueArray);

    var rangeUpdate = new Microsoft.Graph.WorkbookRange();
    rangeUpdate.Values = jsonValueArray;

    var result = await graphClient.Users[_strUserId].Drive.Items[strItemId].Workbook.Worksheets[strSheetName]
        .Range(strRangeName)
        .Request()
        .Header("workbook-session-id", strSessionId)
        .PatchAsync(rangeUpdate).ConfigureAwait(false);

    return result;

 }

所以我能够更新范围内的值,EXCEPT 而不是预期值,我得到的是这个...

F10 = [ ["A"],["B"],["C"] ]

F11 = [ ["A"],["B"],["C"] ]

F12 = [ ["A"],["B"],["C"] ]

而不是图形 API 将第一个值放在第一个单元格中,第二个值放在第二个单元格中,依此类推...它将整个数据数组放在每个单元格中。

我认为这是某种格式错误,也许我的 JSON 格式不正确,或者我使用错误的 Graph API 端点或其他方式提交它。

任何帮助将不胜感激...

更新 1:

我也尝试使用 RANGE(即 - .Range("F10:F12"))而不是使用 NAME,我得到了相同的结果。

更新 2:

Cross-posted on GitHub 以防这是一个错误,而不仅仅是用户错误。 https://github.com/microsoftgraph/msgraph-sdk-dotnet/issues/695

更新 3:

我可以通过 Graph API Explorer 成功修补到以下 URL... https://graph.microsoft.com/v1.0/me/drive/items/{item-id}/workbook/worksheets/INPUTS/range(地址='F10:F12')

有了这个 body... {"values":[["Hello"],["How"],["Are You?"]]}

...而且有效。

但仍然无法通过 MSGraph-SDK-dotnet

使其正常工作

更新 4:

我能够使用 Postman 让它正常工作,生成的 RestSharp 代码看起来像这样...

    public static async Task TestUpdatePostman()
    {
        var client = new RestClient("https://graph.microsoft.com/v1.0/users/{USER-ID}/drive/items/{ITEM-ID}/workbook/worksheets/INPUTS/range(address='F10:F12')");
        client.Timeout = -1;
        var request = new RestRequest(Method.PATCH);
        request.AddHeader("Authorization", "Bearer {INSERT-TOKEN}");
        request.AddHeader("Content-Type", "application/json");
        request.AddParameter("application/json", "{\"values\":[[\"Hello\"],[\"How\"],[\"Are You?\"]]}", ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);
        Console.WriteLine(response.Content);
    }

这再次让我相信 SDK 包装器实现 API 调用的方式存在问题。

这可能不是SDK问题。更新范围时,rangeUpdate.Values 应该是 JToken 类型而不是字符串。 尝试使用:

JArray jsonValueArray = JArray.FromObject(strValueArray);