Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Microsoft Graph API无法更新Excel文件_Excel_Microsoft Graph Api_Onedrive - Fatal编程技术网

Microsoft Graph API无法更新Excel文件

Microsoft Graph API无法更新Excel文件,excel,microsoft-graph-api,onedrive,Excel,Microsoft Graph Api,Onedrive,我有一个Excel文件(.xlsx),当我的OneDrive中已有该文件时,我可以使用如下REST命令对其进行修改: /v1.0/me/drive/root:/SpreadSheetName.xlsx:/workbook/worksheets/content\u stats/tables('RawStats')/Rows 当我修改代码以首先将文件上载到OneDrive(而不是使用已经存在的文件)并使用REST API时,会出现以下错误: OpenTypes不支持打开导航属性。属性名称:“表” 我

我有一个Excel文件(
.xlsx
),当我的OneDrive中已有该文件时,我可以使用如下REST命令对其进行修改:

/v1.0/me/drive/root:/SpreadSheetName.xlsx:/workbook/worksheets/content\u stats/tables('RawStats')/Rows

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

OpenTypes不支持打开导航属性。属性名称:“表”

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

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

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

它被上传为MIME类型:
application/vnd.openxmlformats of icedocument.spreadsheetml.sheet

它使用通过OAuth2委托的这些作用域:

  • User.Read
  • User.ReadWrite
  • 文件。读取
  • 文件。读写
  • Files.ReadWrite.All
  • Sites.ReadWrite.All
使用Node.js和JavaScript,尽管这不重要

以下是用于上载文件的代码:

函数copyTemplateInOneDrive(res、queryParam、officeAccessToken、回调){
var fs=需要('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(Excel电子表格模板文件名,函数读取(错误,文件内容){
var请求=要求(“请求”);
变量选项={
url:上传url,
标题:{
“接受”:“应用程序/json”,
“授权”:“持有人”+officeAccessToken,
“内容类型”:xlsxMimeType,
},
正文:文件内容
};
请求.放置(选项,函数(错误,响应,正文){
var result=JSON.parse(body);
如果(结果中的“id”){
log(“已成功将模板文件上载到OneDrive”);
res.write(“已成功将模板文件上载到OneDrive”);
var excelSpreadsheetID=result.id;
excelSpreadsheetUrl=result.webUrl;
}否则{
console.log(“错误:无法将模板文件上载到OneDrive”+正文);
res.write(“错误:无法将模板文件上载到OneDrive”+正文);
返回;
}
回调(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从
    驱动器/根目录
    切换到
    驱动器/项目
    ,但如果将
    保留在原位,则告诉OneDrive按文件路径而不是
    id来寻址。换句话说,它正在寻找一个名为
    “{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
    

    您可以在的文档中阅读文件的地址。

    您可以提供触发此错误的代码吗?这里没什么可谈的。嗨,马克!这是修改表的第二次调用,如上所示:“”。你也想要JavaScript吗?我不认为JS是坏的,因为它可以在文件已经在OneDrive中时使用。另外,请注意,您编辑了第一个命令的完整URL,它丢失了“”虽然第二个命令保留了该位,但通常会删除
    graph.microsoft.com
    位,因为可以假定该位,因此较短的字符串更容易读入。我错过了第二个电话。至于这个电话,JS会很有帮助。您的通话内容几乎相同,因此在拨打电话之前,显然存在一些问题。最有可能的问题是上传文件或上传完成后获得的
    ID
    。谢谢Marc。也许您可以传递一条更好的错误消息,然后是“OpenTypes上不支持打开导航属性。属性名称:'表'”,而这仅仅是文件无法打开的问题。