Microsoft Graph API 无法更新 Excel 文件

Microsoft Graph API unable to update Excel file

我有一个 Excel 文件 (.xlsx),当我的 OneDrive 中已有它时,我可以使用这样的 REST 命令来修改它:

/v1.0/me/drive/root:/SpreadSheetName.xlsx:/workbook/worksheets/content_stats/tables('RawStats')/Rows

当我修改我的代码以首先将文件上传到 OneDrive(而不是使用已经存在的文件)并使用 REST API 时,我收到错误:

Open navigation properties are not supported on OpenTypes. Property name: 'tables'.

我在网上搜索了这条消息,但找不到与我正在做的事情相关的任何内容。修改刚刚上传的文件的 REST 调用几乎相同,尽管我确实通过 ID 引用文件,因为这是上传 API 返回的内容。这是我用来修改刚刚上传的文件的URL。

/v1.0/me/drive/items:/<RealExcelSpreadsheetID>:/workbook/worksheets/content_stats/tables('RawStats')/Rows

两人都在做 POST。完全相同的文件,唯一不同的是它是先上传的,而不是已经在 OneDrive 中。该文件确实已正确上传,因为当我通过 OneDrive 网络界面时,我确实找到了它并可以在线查看。这是一个企业帐户。

上传为 MIME 类型:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

它使用通过 OAuth2 委托的这些范围:

使用 Node.js 和 JavaScript,尽管这无关紧要。

这是用于上传文件的代码:

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 的异步模块(使用回调)。它还保存返回的 ID,稍后将其传递到对 Microsoft Graph 的调用中。

您的问题是您使用 id 调用的 URL 使用的语法需要文件路径(即 folder\filename.ext)而不是 id。这就是切换到文件名开始为您工作的原因。

有两种方法可以寻址存储在 OneDrive 中的文件:

  1. drive/items/{item-id}
  2. /drive/root:/path/to/file(注意:

您正确地将您的 URI 从 drive/root 切换到了 drive/items,但是通过将 : 留在原地,您是在告诉 OneDrive 通过文件的路径而不是 [=12] 来寻址文件=].换句话说,它正在寻找名为 "{some-id}".

的文件

对于通过文件路径寻址文件,您的 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 的文档中了解文件的寻址方式。