【问题标题】:Microsoft Graph API returning no tables for shared worksheetMicrosoft Graph API 不返回共享工作表的表
【发布时间】:2020-08-19 15:59:37
【问题描述】:

我的目标是在与我共享的 Online Excel 电子表格上读取和写入内容。该操作必须在 WPF C# 应用程序中使用 Microsoft Graph API 执行。问题是我无法访问各个行,只能访问工作表名称的信息。

我可以通过以下调用获得正确的工作表:

GET https://graph.microsoft.com/v1.0/drives(DRIVE_ID)/items(ITEM_ID)/workbook/worksheets(WORKSHEET_ID)/

我得到以下回复:

 {
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#drives(DRIVE_ID)/items(ITEM_ID)/workbook/worksheets/$entity",
"@odata.id": "/drives(DRIVE_ID)/items(ITEM_ID)/workbook/worksheets(%27%7B00000000-0001-0000-0500-000000000000%7D%27)",
"id": "{00000000-0001-0000-0500-000000000000}",
"name": "Daniel",
"position": 5,
"visibility": "Visible"
}

这是正确的。但是,如果我附加一个/tables,我会得到以下响应

{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#drives(DRIVE_ID)/items(ITEM_ID)/workbook/worksheets('%7B00000000-0001-0000-0500-000000000000%7D')/tables",
"value": []
}

这是不正确的,因为工作表有内容,而且没有表引用,我无法使用 /tables('0')/Rows 查询访问表的行。

我使用的用户对工作表具有读/写权限(我可以使用浏览器更改工作表)。在应用程序上,我请求所有安全范围,即使我已经读过只有“files.read”和“files.readwrite”是必需的。令牌已正确授予,我可以从文件、驱动器和工作簿中读取大量信息,除了表和行。

我可以使用浏览器编辑的 URL 基于 SharePoint。 https://COMPANY_NAME.sharepoint.com/...

有什么建议吗?

2017 年 10 月 8 日更新

所以你可以在请求时检查我所做的请求是否正确

GET https://graph.microsoft.com/v1.0/drives/DRIVE_ID/items/ITEM_ID/workbook/worksheets

我明白了

{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#drives('b%DRIVE_ID')/items('ITEM_ID')/workbook/worksheets",
"value": [{
    "@odata.id": "/drives('DRIVE_ID')/items('ITEM_ID')/workbook/worksheets(%27%7B00000000-0001-0000-0000-000000000000%7D%27)",
    "id": "{00000000-0001-0000-0000-000000000000}",
    "name": "N0",
    "position": 0,
    "visibility": "Hidden"
},
{
    "@odata.id": "/drives('b%DRIVE_ID')/items('ITEM_ID')/workbook/worksheets(%27%7B00000000-0001-0000-0100-000000000000%7D%27)",
    "id": "{00000000-0001-0000-0100-000000000000}",
    "name": "N1",
    "position": 1,
    "visibility": "Hidden"
},
{
    "@odata.id": "/drives('b%DRIVE_ID')/items('ITEM_ID')/workbook/worksheets(%27%7B00000000-0001-0000-0200-000000000000%7D%27)",
    "id": "{00000000-0001-0000-0200-000000000000}",
    "name": "N2",
    "position": 2,
    "visibility": "Visible"
},
{
    "@odata.id": "/drives('b%DRIVE_ID')/items('ITEM_ID')/workbook/worksheets(%27%7B00000000-0001-0000-0300-000000000000%7D%27)",
    "id": "{00000000-0001-0000-0300-000000000000}",
    "name": "N3",
    "position": 3,
    "visibility": "Visible"
},
{
    "@odata.id": "/drives('b%DRIVE_ID')/items('ITEM_ID')/workbook/worksheets(%27%7B00000000-0001-0000-0400-000000000000%7D%27)",
    "id": "{00000000-0001-0000-0400-000000000000}",
    "name": "N4",
    "position": 4,
    "visibility": "Visible"
},
{
    "@odata.id": "/drives('b%DRIVE_ID')/items('ITEM_ID')/workbook/worksheets(%27%7B00000000-0001-0000-0500-000000000000%7D%27)",
    "id": "{00000000-0001-0000-0500-000000000000}",
    "name": "Daniel",
    "position": 5,
    "visibility": "Visible"
},
{
    "@odata.id": "/drives('b%DRIVE_ID')/items('ITEM_ID')/workbook/worksheets(%27%7B00000000-0001-0000-0600-000000000000%7D%27)",
    "id": "{00000000-0001-0000-0600-000000000000}",
    "name": "N6",
    "position": 6,
    "visibility": "Visible"
},
{
    "@odata.id": "/drives('b%DRIVE_ID')/items('ITEM_ID')/workbook/worksheets(%27%7B00000000-0001-0000-0700-000000000000%7D%27)",
    "id": "{00000000-0001-0000-0700-000000000000}",
    "name": "N7",
    "position": 7,
    "visibility": "Visible"
},
{
    "@odata.id": "/drives('b%DRIVE_ID')/items('ITEM_ID')/workbook/worksheets(%27%7B00000000-0001-0000-0800-000000000000%7D%27)",
    "id": "{00000000-0001-0000-0800-000000000000}",
    "name": "N8",
    "position": 8,
    "visibility": "Visible"
},
{
    "@odata.id": "/drives('b%DRIVE_ID')/items('ITEM_ID')/workbook/worksheets(%27%7B00000000-0001-0000-0900-000000000000%7D%27)",
    "id": "{00000000-0001-0000-0900-000000000000}",
    "name": "N9",
    "position": 9,
    "visibility": "Visible"
}]
}

还有,尝试时

GET https://graph.microsoft.com/v1.0/drives/DRIVE_ID/items/ITEM_ID/workbook/worksheets/00000000-0001-0000-0500-000000000000

那么响应是:

{
  "error": {
    "code": "ItemNotFound",
    "message": "The requested resource doesn't exist.",
    "innerError": {
      "request-id": "GUID",
      "date": "2017-10-08T07:00:0"
    }
  }
}

最后,我在创建身份验证令牌时请求以下范围:“user.read”、“files.read.all”、“files.read”、“files.read.selected”、“files.readwrite”、 “files.readwrite.all”、“files.readwrite.selected”、“sites.read.all”、“sites.readwrite.all”

【问题讨论】:

  • 仅供参考,您需要的范围是Files.ReadWrite.All。这使您可以读取/写入您可以访问的所有文件。 Files.ReadWrite 只允许你读/写你拥有的文件。
  • 你可以试试v1.0/drives/items/{item-id}/workbook/tables 和v1.0/drives/items/{item-id}/workbook/worksheets/{worksheet-id|name}tables 吗?请注意格式略有不同。
  • @MarcLaFleur-MSFT 我实际上有一个范围“user.read”、“files.read.all”、“files.read”、“files.read.selected”、“files.readwrite” ","files.readwrite.all", "files.readwrite.selected", "sites.read.all", "sites.readwrite.all" 并且该应用程序被授权访问所有这些以及更多。我这样做是为了确保我没有遗漏任何东西。我现在将尝试您的下一个建议。
  • @MarcLaFleur-MSFT 通过删除 DRIVE_ID 参数,找不到该项目,我认为这是预期的,因为这是一个“SharedWithMe”项目。使用建议的格式并保留 /drives/DRIVE_ID,我得到相同的空表值,除非我尝试使用 {worksheet-id} 参数,为此我得到“找不到资源”。我假设在第二种格式中,我应该使用“/tables”而不是“tables”(添加斜线)。我将使用有关可用工作表的信息更新问题。

标签: c# excel microsoft-graph-api


【解决方案1】:

除了 dpim 的响应之外,我会说首先检查文件是否有任何表。如果不涉及表,您可以使用range 对象直接与数据交互。

对于范围写入操作,请查看range update API。这要求您知道您正在处理的地址。

对于阅读,您可以使用GET /workbook/worksheets/{id|name}/range(address='<address>') 或者如果您知道范围的名称(命名项),您可以使用 GET /workbook/names/{name}/range。如果您不知道地址或名称,可以使用used range 让所有包含数据的单元格开始。

【讨论】:

    【解决方案2】:

    我发现了同样的问题。问题似乎是由于我在桌面 Excel 应用程序中创建了表格,而不是在浏览器中。

    为了解决这个问题,我打开了桌面 Excel 应用程序并删除了所有表格。然后我在线返回 Excel 并创建表格。这些被命名为 Table1、Table2 等等,没有办法在 Excel 中在线重命名它们 - 这是一个已知的、记录在案的缺陷。

    Graph Explorer 随后能够找到并列出表格。

    为了好玩,我随后在桌面应用程序中重新打开了工作表,根据自己的喜好重命名了 Table1、Table2...,Graph explorer 仍然可以找到它们的新名称。

    固定。

    【讨论】:

      【解决方案3】:

      您能否确认工作表有table?表格是工作表的特定元素,不与数据范围同义。

      要获取工作表的单元格值,您可以获取used range。这将为您提供对工作表上包含任何已修改单元格(具有格式和/或值的单元格)的范围的引用。然后,您可以根据需要操作范围。

      为了解决您的第二个问题,在查询工作表时收到 ItemNotFound 错误:我相信您的查询未使用正确的工作表 ID。 id 的格式为 {<guid>},您在 /<guid> 上查询,而不是在 /{<guid>} 上查询

      尝试: GET https://graph.microsoft.com/v1.0/drives/DRIVE_ID/items/ITEM_ID/workbook/worksheets/{00000000-0001-0000-0500-000000000000}

      代替: GET https://graph.microsoft.com/v1.0/drives/DRIVE_ID/items/ITEM_ID/workbook/worksheets/00000000-0001-0000-0500-000000000000

      【讨论】:

      • 可以使用 /worksheets/name 或 /worksheets/id 访问工作表。 ID 包含在 { 和 } 字符中。这些字符需要 URL 编码。因此,它类似于 /worksheets/%7B00000000-0001-0000-0500-000000000000%7D。如果您使用工作表名称作为关键注意事项,它也应该被编码。
      猜你喜欢
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      相关资源
      最近更新 更多