【发布时间】: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