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中的文件有两种方法:

  1. drive/items/{item-id}
  2. /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的文档中了解如何解决文件的问题 。