You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何配置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")

方法二:手动授权(适合测试场景)

  1. 找到服务账号的邮箱(格式一般是[服务账号名]@[项目ID].iam.gserviceaccount.com,可在Google云控制台的IAM页面查看)
  2. 用该服务账号邮箱登录Google表格(需确保服务账号已开通对应权限)
  3. 打开创建好的表格,点击右上角分享按钮
  4. 输入你的个人邮箱,设置对应访问权限(编辑/查看等)并发送邀请

注意事项

  • 使用Drive API前,需确保Google云项目中已启用Drive API,可在控制台API库中搜索启用
  • 权限设置的role可按需选择:reader(只读)、writer(可编辑)、owner(所有者)

内容的提问来源于stack exchange,提问作者Tri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:35:22