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 委托的这些范围:
User.Read
User.ReadWrite
Files.Read
Files.ReadWrite
Files.ReadWrite.All
Sites.ReadWrite.All
使用 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 中的文件:
drive/items/{item-id}
/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 的文档中了解文件的寻址方式。
我有一个 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 委托的这些范围:
User.Read
User.ReadWrite
Files.Read
Files.ReadWrite
Files.ReadWrite.All
Sites.ReadWrite.All
使用 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 中的文件:
drive/items/{item-id}
/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 的文档中了解文件的寻址方式。