使用Python调用Microsoft Graph API访问个人账号OneDrive中Excel文件时出现'ItemNotFound'错误
问题描述
我尝试使用Microsoft Graph API读取和更新存储在OneDrive中的Excel文件,但持续遇到以下错误:
ERROR:root:Request failed: {"error":{"code":"ItemNotFound","message":"The requested resource doesn't exist.","innerError":{"code":"itemNotFound","message":"The requested resource doesn't exist.","date":"2025-01-18T22:20:58","request-id":"d908b11c-edcc-4a73-9383-2ca4328c3f4a","client-request-id":"d908b11c-edcc-4a73-9383-2ca4328c3f4a"}}}
已执行的步骤
- 通过Microsoft Graph API的
/drive/root/children端点获取了文件ID:- 返回的文件ID:
1555B702B0C2A00A!s86e7ed45f177405ba089286bc4cc00af
- 返回的文件ID:
- 验证了该文件在我的OneDrive账号中存在且可访问
- 使用了正确的API端点来访问工作簿,例如:
https://graph.microsoft.com/v1.0/me/drive/items/1555B702B0C2A00A!s86e7ed45f177405ba089286bc4cc00af/workbook/worksheets/Sheet1/range(address='A1:B2') - 确保Microsoft Graph权限配置正确:
- 权限范围:
Files.ReadWrite、offline_access、Sites.ReadWrite.All - 检查了文件已同步且可从我的OneDrive文件夹访问
- 权限范围:
疑问
为什么一个存在且可通过OneDrive访问的文件会触发ItemNotFound错误?
问题排查与解决方案
结合你的操作步骤和错误信息,我整理了几个最可能的原因及对应的解决办法:
1. 文件ID格式不正确
你获取到的文件ID结构有点异常——个人OneDrive的文件ID通常是[存储ID]![文件标识]的简洁格式(比如123ABC!4567),但你的ID里额外附带了一段s86e7ed45f177405ba089286bc4cc00af,这大概率不是正确的文件唯一ID。建议你重新调用GET /me/drive/root/children接口,仔细查看返回结果中的id字段,确保复制的是完整且正确的文件ID,不要混入其他无关字符或参数。
2. 授权账号与文件所属账号不匹配
你使用的/me/drive/items/{file-id}端点是针对当前授权用户的个人OneDrive的,如果你的API授权账号和存放Excel文件的OneDrive账号不是同一个,自然会找不到目标文件。可以先调用GET /me/drive/root接口,确认当前访问的OneDrive所属账号是否和你存放文件的账号一致。
另外,即使权限范围配置正确,也要确认离线访问的刷新令牌是否有效,有没有过期或者被账号管理员撤销权限。
3. 工作表名称或范围地址错误
有时候文件ID正确,但工作表名称大小写不匹配、拼写错误,或者范围地址格式有误,也会触发ItemNotFound错误。你可以先调用GET /me/drive/items/{正确文件ID}/workbook/worksheets接口,列出目标Excel里的所有工作表名称,确认Sheet1是真实存在的(注意区分大小写,比如实际是sheet1或者Sheet 1都会导致失败),再调整请求中的工作表名称和范围地址。
4. OneDrive云端同步延迟或文件状态异常
虽然你确认文件已同步,但OneDrive本地与云端的同步偶尔会有延迟,或者文件在云端处于临时处理状态(比如上传未完成、后台正在解析文件)。建议你直接登录OneDrive网页版,确认文件能正常打开,且修改时间是最新的,等待几分钟后再重试API请求。
5. 请求URL编码问题
如果你的请求URL中包含特殊字符(比如空格、中文等),没有正确编码也可能导致资源找不到。不过你使用文件ID访问的情况下这个概率较低,但还是可以检查下请求URL是否存在未转义的特殊字符,确保格式完全正确。
备注:内容来源于stack exchange,提问作者Rui Sousa

