已授权服务账号时gspread读Google Sheets报SpreadsheetNotFound如何调试
gspread 读取Google Sheets 报
SpreadsheetNotFound 调试方案 最直接的触发原因
你代码里调用client.open()时传入了完整的表格共享链接,完全不符合方法的入参规则。client.open()的底层逻辑是:调用Google Drive接口拉取当前授权的服务账号能访问的全部表格列表,按表格的纯文本标题做匹配检索。你传一整串链接进去,没有任何表格的标题和这串内容匹配,就会遍历完所有列表都找不到目标,最终抛出SpreadsheetNotFound异常。
正确的表格访问写法
针对已经获取到链接的目标表格,不需要靠名称匹配检索,直接用表格ID精准打开,效率更高也不会因为重名出错:
- 从现有URL中提取表格ID:也就是链接里
/d/和/edit片段之间的字符串,以你提供的链接为例,提取出的ID为1Eo8QGzdwaiF7m59Tro1oN8ewfktDBI0KLfF3UL87lTk - 把原来传完整URL的代码段替换为:
sheet = client.open_by_key("1Eo8QGzdwaiF7m59Tro1oN8ewfktDBI0KLfF3UL87lTk")
如果一定要用名称匹配的方式打开表格,只需要向client.open()传入表格的纯标题文本,不要拼接链接内容。比如你的表格标题是「2024年业务数据」,就写client.open("2024年业务数据")即可。
替换代码后仍报错的排查方向
- 确认服务账号协作者权限:服务账号不属于普通个人Google账号,哪怕你把表格设置为“任何人带链接可查看”的公开权限,服务账号依然无法绕过协作者校验直接访问。必须把凭证JSON文件里
client_email字段对应的服务账号邮箱,单独添加为表格的协作者,授予查看或编辑权限。 - 检查云项目API开关:确认对应的Google云项目已经开启「Google Drive API」和「Google Sheets API」,未开启API的情况下,接口会返回空的表格列表,哪怕权限配置正确也会检索失败。
- 核对权限scope配置:你当前使用的两个scope可以兼容旧版gspread的功能,如果使用最新版本的gspread,可替换为更规范的权限范围,避免权限校验异常:
scope = [ "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive" ]
权限配置参考示意
内容的提问来源于stack exchange,提问作者Ashot Terteryan
相关产品推荐
相关产品推荐

