咨询无需共享至服务账户的Python读取Google Sheet实现方案
解决方案:无需手动共享Google Sheet的读取方法
一、使用API Key读取公开共享的Google Sheet
若可将目标Sheet设置为「知道链接的任何人都可以查看」,就能用API Key直接读取,无需OAuth授权或手动共享操作。
实现步骤
- 在GCP控制台创建API Key:
- 启用Google Sheets API,进入「凭据」页面创建「API密钥」
- 配置Sheet权限:
- 打开目标Sheet,点击右上角「共享」,设置权限为「知道链接的任何人都可以查看」
- Python读取代码示例:
import pandas as pd # 替换为你的API Key和Sheet ID(URL中的长串字符) API_KEY = "your_api_key_here" SHEET_ID = "your_sheet_id_here" SHEET_NAME = "Sheet1" # 构造Sheets API请求地址 url = f"https://sheets.googleapis.com/v4/spreadsheets/{SHEET_ID}/values/{SHEET_NAME}?key={API_KEY}" # 读取并转换数据 df = pd.read_json(url) data = df['values'].tolist() print(data)
二、私有Sheet无需逐个共享的方案(域范围委派)
若Sheet为公司内部私有资源,无法设为公开,可使用域范围委派(仅适用于Google Workspace/G Suite域管理员),让服务账户有权访问域内所有Sheet,无需手动逐个共享。
实现步骤
- 配置域范围委派:
- 以域管理员身份登录Google Workspace Admin控制台
- 找到目标服务账户,启用「域范围委派」,添加OAuth范围:
https://www.googleapis.com/auth/spreadsheets.readonly(只读)或https://www.googleapis.com/auth/spreadsheets(读写)
- 修改Python代码模拟域内用户访问:
import gspread from google.oauth2 import service_account SERVICE_ACCOUNT_FILE = 'service_account.json' # 替换为域内有权访问目标Sheet的用户邮箱 USER_EMAIL = "user@your-domain.com" SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly'] # 创建委派凭据 creds = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES) delegated_creds = creds.with_subject(USER_EMAIL) # 授权读取Sheet client = gspread.authorize(delegated_creds) sheet = client.open('Sample').sheet1 data = sheet.get_all_values() print(data)
注意事项
- API Key仅适用于公开Sheet,存在数据泄露风险,需根据业务场景谨慎使用
- 域范围委派需要Google Workspace管理员权限,且服务账户需被授予对应访问范围
- 若既不能设Sheet为公开,又无Workspace管理员权限,可考虑用Drive API编写批量共享脚本,自动将所有目标Sheet共享给服务账户,减少人工操作
内容的提问来源于stack exchange,提问作者Mohit Aswani
相关产品推荐
相关产品推荐

