为何配置Service Account权限后仍无法访问其创建的Google Spreadsheet?
服务账号创建的Google表格无法用个人邮箱访问的问题解决
问题背景
按以下步骤创建了Google服务账号:
- 打开Google云控制台凭证页面(对应项目MyProject)
- 点击CREATE CREDENTIALS按钮,选择Service account
- 填写服务账号详情后点击CREATE AND CONTINUE
- 给服务账号分配项目Owner角色,点击CONTINUE
- 在服务账号权限设置中添加个人邮箱,点击DONE
- 进入服务账号的PERMISSIONS标签页,给个人邮箱分配Service Account Admin角色并保存
- 切换到KEYS标签页,创建并下载JSON密钥文件,放置在代码路径下
使用以下代码通过Spreadsheet API创建新表格:
def create(title): creds = service_account.Credentials.from_service_account_file('odoo-spreadsheet-371808-7186d4c03b4c.json', scopes=SCOPES) service = build('sheets', 'v4', credentials=creds) spreadsheet = { 'properties': { 'title': title }, } spreadsheet = service.spreadsheets().create(body=spreadsheet) response = spreadsheet.execute() print('response', response) print('spreadsheetId:', response.get('spreadsheetId')) print('spreadsheetUrl:', response.get('spreadsheetUrl'))
代码执行成功,但用个人邮箱打开生成的spreadsheetUrl时显示Access Denied,无法访问。
问题原因
你给个人邮箱配置的是服务账号的管理权限(比如Service Account Admin),但服务账号创建的表格,默认只有该服务账号本身拥有完整访问权限,个人邮箱并没有被授予这个具体表格的访问权限,所以会出现权限不足的提示。
解决方法
方法一:通过API自动添加个人邮箱的表格访问权限
在创建表格后,调用Drive API的权限接口给个人邮箱添加权限。需要确保SCOPES包含Drive API的权限(比如'https://www.googleapis.com/auth/drive')。
修改后的代码示例:
from googleapiclient.discovery import build from google.oauth2 import service_account # 需包含Drive API的权限 SCOPES = [ 'https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive' ] def create(title, user_email): creds = service_account.Credentials.from_service_account_file('odoo-spreadsheet-371808-7186d4c03b4c.json', scopes=SCOPES) # 创建表格 sheets_service = build('sheets', 'v4', credentials=creds) spreadsheet = { 'properties': { 'title': title }, } response = sheets_service.spreadsheets().create(body=spreadsheet).execute() spreadsheet_id = response.get('spreadsheetId') print('spreadsheetId:', spreadsheet_id) print('spreadsheetUrl:', response.get('spreadsheetUrl')) # 给个人邮箱添加表格访问权限 drive_service = build('drive', 'v3', credentials=creds) permission = { 'type': 'user', 'role': 'writer', # 可根据需求改为reader或owner 'emailAddress': user_email } drive_service.permissions().create( fileId=spreadsheet_id, body=permission, sendNotificationEmail=True # 可选:是否发送通知邮件 ).execute()
调用时传入你的个人邮箱即可:create("测试表格", "your-personal-email@example.com")
方法二:手动授权(适合测试场景)
- 找到服务账号的邮箱(格式一般是
[服务账号名]@[项目ID].iam.gserviceaccount.com,可在Google云控制台的IAM页面查看) - 用该服务账号邮箱登录Google表格(需确保服务账号已开通对应权限)
- 打开创建好的表格,点击右上角分享按钮
- 输入你的个人邮箱,设置对应访问权限(编辑/查看等)并发送邀请
注意事项
- 使用Drive API前,需确保Google云项目中已启用Drive API,可在控制台API库中搜索启用
- 权限设置的
role可按需选择:reader(只读)、writer(可编辑)、owner(所有者)
内容的提问来源于stack exchange,提问作者Tri
相关产品推荐
相关产品推荐

