Python调用BigQuery查询Sheets生成的表报Drive权限错误如何解决
核心报错原因
你遇到的403权限错误是因为BigQuery查询Google Sheets生成的外部表时,需要跨服务访问Google Drive读取表格数据,你初始化BigQuery客户端使用的凭证默认仅具备BigQuery访问权限,缺少Drive的相关访问权限,所以查询普通原生表可以正常运行,查询关联Sheets的外部表就会报错。
必要配置步骤(可直接解决当前问题)
- 步骤1:给认证账号开放表格访问权限
你当前用于认证的账号(个人账号/服务账号)需要至少获得对应Google Sheets文件的查看者权限。如果是服务账号,直接打开目标Google Sheets,点击右上角「共享」,填入服务账号邮箱,权限选择「查看者」即可。 - 步骤2:给认证凭证追加Drive访问作用域
默认BigQuery客户端申请的权限范围不包含Drive访问权限,需要手动追加:- 如果使用服务账号密钥文件认证,修改代码如下:
from google.cloud import bigquery from google.oauth2 import service_account # 同时指定BigQuery和Drive只读权限范围 SCOPES = [ "https://www.googleapis.com/auth/bigquery", "https://www.googleapis.com/auth/drive.readonly" ] # 加载带指定scope的凭证 credentials = service_account.Credentials.from_service_account_file( "你的服务账号密钥文件路径.json", scopes=SCOPES ) # 初始化BigQuery客户端 bigquery_client = bigquery.Client( project="my_project", credentials=credentials ) query = """ select * from `table-from-sheets` """ df = bigquery_client.query(query).to_dataframe()- 如果使用本地gcloud个人账号认证,直接执行以下命令重新登录更新凭证即可,无需修改代码:
gcloud auth application-default login --scopes=https://www.googleapis.com/auth/bigquery,https://www.googleapis.com/auth/drive.readonly
替代实现方案
如果不想配置跨服务权限,可以选择以下方案:
- 方案1:同步Sheets数据到BigQuery原生表
用BigQuery定时任务或Cloud Function定时将Sheets数据同步到普通BigQuery原生表,后续直接查询原生表,无需Drive权限,查询性能也更高,适合数据更新频率不高的场景。 - 方案2:直接调用Google Sheets API读取数据
跳过BigQuery外部表中间层,直接拉取Sheets内容转DataFrame,适合小数据量场景,核心代码示例:import gspread import pandas as pd from google.oauth2.service_account import Credentials SCOPES = ["https://www.googleapis.com/auth/spreadsheets.readonly"] creds = Credentials.from_service_account_file("服务账号密钥.json", scopes=SCOPES) client = gspread.authorize(creds) # 打开指定表格并读取数据 sheet = client.open_by_key("你的Google Sheets文件ID").sheet1 raw_data = sheet.get_all_values() df = pd.DataFrame(raw_data[1:], columns=raw_data[0]) - 方案3:导出Sheets文件到Cloud Storage再加载到BigQuery
手动或定时将Sheets导出为CSV/Parquet格式上传到Google Cloud Storage,再加载到BigQuery表,适合数据量大、更新频率低的场景,稳定性更高,无需维护跨服务权限关联。
内容的提问来源于stack exchange,提问作者David Masip
相关产品推荐
相关产品推荐

