Google Drive API技术问题:使用gspread无法读取他人共享的文档
问题原因及解决方案
这个问题我之前帮人排查过,核心原因出在你使用的OAuth权限范围上:
- 权限范围的局限性:
https://www.googleapis.com/auth/drive.file是Google Drive API的一个受限权限,它只允许你的gspread客户端访问两类文件:- 由该OAuth客户端直接创建的文件(也就是你自己创建的那个文件,符合这个条件,所以能正常打开)
- 你手动通过授权流程明确授予该客户端访问权限的特定文件
而那个群组共享给你的文件,既不是这个客户端创建的,也没有被授权给该客户端,所以Google API会返回NOT_FOUND的404错误——本质上是权限不足导致的“找不到”,而非文件真的不存在。
至于你能在Web应用中打开这个文件,是因为网页端直接使用了你个人账户的完整权限,和gspread客户端使用的OAuth令牌权限是完全独立的两套权限体系。
解决办法
你可以根据需求选择以下两种方案:
方案1:扩大权限范围(推荐)
把OAuth权限范围更换为更适合的只读权限:
- 如果只需要访问Google表格,用
https://www.googleapis.com/auth/spreadsheets.readonly - 如果需要访问Drive里的更多类型文件,用
https://www.googleapis.com/auth/drive.readonly
更换权限后,你需要重新生成OAuth令牌(旧令牌的权限范围不会自动更新),之后gspread就能访问所有你个人账户有权限的共享文件了。
方案2:手动授权特定文件(适合不想扩大权限的场景)
如果你坚持使用drive.file权限,可以手动将共享文件授权给你的OAuth客户端:
- 打开目标共享Google表格,点击右上角的「分享」按钮
- 在分享对话框中,输入你用于OAuth授权的个人账户邮箱(或者Google Cloud Console中该OAuth客户端对应的测试用户邮箱)
- 授予至少「查看者」权限,保存后重新尝试用gspread打开该文件
内容的提问来源于stack exchange,提问作者Weier
相关产品推荐
相关产品推荐

