Microsoft Graph API无法更新Excel文件
我有一个Excel文件( .xlsx
),当我已经在我的OneDrive中,我可以使用像这样的REST命令来修改它:
/v1.0/me/drive/root:/SpreadSheetName.xlsx:/workbook/worksheets/content_stats/tables('RawStats')/Rows
当我修改我的代码首先将file upload到OneDrive(而不是使用已经存在的文件),并使用REST API时,出现错误:
OpenTypes不支持打开的导航属性。 属性名称:'表'。
我已经在网上search这条消息,并且找不到与我正在做的事有关的任何事情。 REST调用修改刚刚上传的文件几乎是相同的,虽然我通过ID
引用文件,因为这是由上传API返回的。 这是我用来修改刚刚上传的文件的URL。
/v1.0/me/drive/items:/<RealExcelSpreadsheetID>:/workbook/worksheets/content_stats/tables('RawStats')/Rows
两者都在做一个POST
。 完全相同的文件,唯一不同的是它正在上传,而不是已经在OneDrive中。 该文件是绝对正确上传,因为当我通过OneDrive的网页界面,我find它,并可以在线查看。 这是一个商业账户。
它以MIMEtypes上传: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
。
它使用通过OAuth2委派的这些范围:
-
User.Read
-
User.ReadWrite
-
Files.Read
-
Files.ReadWrite
-
Files.ReadWrite.All
-
Sites.ReadWrite.All
使用Node.js和JavaScript,尽pipe这不重要。
这里是用来上传文件的代码:
function copyTemplateInOneDrive(res, queryParam, officeAccessToken, callback) { var fs = require('fs'); var excelExt = ".xlsx"; var excelSpreadsheetFilenameStart = "stats"; var uploadUrl = "https://graph.microsoft.com/v1.0/me/drive/root:/" + excelSpreadsheetFilename + dateNowFull() + excelExt + ":/content"; var xlsxMimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; fs.readFile(excelSpreadsheetTemplateFilename, function read(error, fileContent) { var request = require('request'); var options = { url: uploadUrl, headers: { 'Accept': 'application/json', 'Authorization': 'Bearer ' + officeAccessToken, 'Content-Type': xlsxMimeType, }, body: fileContent }; request.put(options, function (error, response, body) { var result = JSON.parse(body); if ('id' in result) { console.log("Successfully uploaded template file to OneDrive"); res.write("Successfully uploaded template file to OneDrive"); var excelSpreadsheetID = result.id; excelSpreadsheetUrl = result.webUrl; } else { console.log("ERROR: unable to upload template file to OneDrive " + body); res.write("Error: unable to upload template file to OneDrive" + body); return; } callback(null, res, queryParam, officeAccessToken, excelSpreadsheetID); }); }); }
它使用node.js中的asynchronous模块(使用callback)。 它还保存返回的ID,并稍后将其传递给Microsoft Graph的调用。
你这里的问题是你打电话的url是使用预期文件path(即folder\filename.ext
)的语法而不是id
。 这就是为什么切换到文件名开始为你工作。
解决存储在OneDrive中的文件有两种方法:
-
drive/items/{item-id}
-
/drive/root:/path/to/file
(注意:)
您正确地将您的URI从drive/root
切换到drive/items
但通过保留:
您正在告诉OneDrive通过它的path而不是它的id
来解决文件。 换句话说,它正在寻找一个名为"{some-id}"
。
为了通过它的path寻址文件,你的URL是正确的:
/drive/root:/{file-path}:/workbook/worksheets/content_stats/tables('RawStats')/Rows
但是,对于通过它的id
寻址文件,你需要删除:
/drive/items/{file-id}/workbook/worksheets/content_stats/tables('RawStats')/Rows
您可以在DriveItem的文档中了解如何解决文件的问题 。