使用Python调用Google API创建Google文档遇错误求助
解决服务账号凭据创建Google Docs时的类型不匹配错误
你的问题根源很清晰:Google Docs的官方quickstart示例用的是面向终端用户的OAuth 2.0授权流程(需要桌面/Web应用类型的凭据),但你使用的是服务账号凭据文件,这两种凭据类型不兼容,所以才会抛出ValueError: Client secrets must be for a web or installed app.错误。
而gspread库本身对服务账号认证做了专门适配,所以你能正常操作表格,但Docs的示例代码没有处理服务账号的情况。下面是修改方案,让你用现有的服务账号凭据创建Google Docs:
步骤1:修改认证逻辑,使用服务账号凭据
替换原示例中的OAuth flow代码,改用google.oauth2.service_account加载你的凭据文件,构建Docs服务客户端。
完整代码示例:
from google.oauth2 import service_account from googleapiclient.discovery import build # Docs API的权限范围,创建文档需要这个权限 SCOPES = ['https://www.googleapis.com/auth/documents'] # 你的服务账号凭据文件路径 SERVICE_ACCOUNT_FILE = 'credentials.json' def main(): # 加载服务账号凭据 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES) # 构建Google Docs服务客户端 docs_service = build('docs', 'v1', credentials=credentials) # 创建新文档 new_doc = docs_service.documents().create(body={ 'title': '自动化审核请求文档' # 自定义文档标题 }).execute() # 输出文档信息 doc_id = new_doc['documentId'] print(f"新文档创建成功!") print(f"文档ID:{doc_id}") print(f"在线编辑链接:https://docs.google.com/document/d/{doc_id}/edit") if __name__ == '__main__': main()
步骤2:(可选)给其他用户添加文档访问权限
服务账号创建的文档默认只有服务账号自身能访问,如果需要让团队成员查看或编辑,你需要借助Google Drive API来设置权限(Docs的权限由Drive管理)。
添加权限的代码片段(可以插入到上面的main函数中,创建文档之后):
# 构建Drive服务客户端 drive_service = build('drive', 'v3', credentials=credentials) # 定义权限:给指定邮箱添加编辑权限 permission_body = { 'type': 'user', 'role': 'writer', # 可选:reader(只读)、writer(编辑)、owner(所有者) 'emailAddress': 'your-team-member@example.com' } # 应用权限设置 drive_service.permissions().create( fileId=doc_id, body=permission_body, sendNotificationEmail=True # 是否给用户发送权限通知邮件 ).execute() print(f"已给your-team-member@example.com添加编辑权限")
关键注意事项
- 确保在Google Cloud控制台中启用了Google Docs API和Google Drive API(如果要设置权限的话);
- 服务账号的凭据文件无需更换,你现有的
credentials.json完全可用; - 如果需要批量创建文档或进行更复杂的编辑操作,可以基于Docs API的能力扩展功能。
内容的提问来源于stack exchange,提问作者Timur Nurlygayanov
相关产品推荐
相关产品推荐

