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

Python调用BigQuery查询Sheets生成的表报Drive权限错误如何解决

核心报错原因

你遇到的403权限错误是因为BigQuery查询Google Sheets生成的外部表时,需要跨服务访问Google Drive读取表格数据,你初始化BigQuery客户端使用的凭证默认仅具备BigQuery访问权限,缺少Drive的相关访问权限,所以查询普通原生表可以正常运行,查询关联Sheets的外部表就会报错。

必要配置步骤(可直接解决当前问题)
  • 步骤1:给认证账号开放表格访问权限
    你当前用于认证的账号(个人账号/服务账号)需要至少获得对应Google Sheets文件的查看者权限。如果是服务账号,直接打开目标Google Sheets,点击右上角「共享」,填入服务账号邮箱,权限选择「查看者」即可。
  • 步骤2:给认证凭证追加Drive访问作用域
    默认BigQuery客户端申请的权限范围不包含Drive访问权限,需要手动追加:
    1. 如果使用服务账号密钥文件认证,修改代码如下:
    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()
    
    1. 如果使用本地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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 02:00:03