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

通过Python编写的Google Cloud Function访问关联Google Sheet的BigQuery数据库时遭遇403权限错误的解决求助

解决BigQuery关联Google Sheet时Cloud Function的403权限错误

我来帮你搞定这个问题!你遇到的Permission denied while getting Drive credentials错误,本质是因为你的BigQuery表关联了Google Sheet,而Cloud Function使用的服务账号没有访问Google Drive的权限——哪怕你给了它Owner角色,也得单独处理Drive的授权,再加上Sheet本身要共享给服务账号才行。下面是一步步的解决方法:

1. 先搞懂错误根源

当BigQuery查询关联Google Sheet的表时,它会后台调用Google Drive API去读取Sheet数据。你的服务账号虽然有项目Owner权限,但默认没有Drive的访问权限,而且关联的Sheet也没共享给这个服务账号,所以就触发了403错误。

2. 给服务账号添加Drive访问权限

用命令行给服务账号添加Drive只读权限(足够满足需求,避免过度授权):

gcloud projects add-iam-policy-binding test-24s --member="serviceAccount:connect-to-bigquery@test-24s.iam.gserviceaccount.com" --role="roles/drive.reader"

如果你的Sheet是私有且仅允许特定账号访问,也可以用roles/drive.file角色,但drive.reader更通用。

3. 把关联的Google Sheet共享给服务账号

这一步很容易被忽略!打开你的Google Sheet,点击右上角的「共享」,输入服务账号邮箱connect-to-bigquery@test-24s.iam.gserviceaccount.com,权限设置为「查看者」,然后发送邀请。

4. 优化Cloud Function代码(可选但实用)

你原来的代码只是打印结果并返回成功消息,改成返回JSON格式的查询结果会让API更有用:

from google.cloud import bigquery
import json

def hello_world(request):
    client = bigquery.Client()
    query = "SELECT order_id, MAX(status) AS last_status FROM `test-24s.Dataset.Order_Status` GROUP BY order_id"
    query_job = client.query(query)
    # 将查询结果转换成字典列表,方便转成JSON
    results = [dict(row) for row in query_job]
    # 返回JSON格式的响应
    return json.dumps(results), 200, {'Content-Type': 'application/json'}

5. 额外注意事项

  • 遵循最小权限原则:生产环境别用Owner角色,只给服务账号必要的权限:BigQuery的roles/bigquery.dataViewer(用于查询表) + Drive的roles/drive.reader就足够了。
  • 等待权限生效:IAM权限有时候需要几分钟才能同步,部署完Cloud Function后别急着测试,等2-3分钟再试。
  • 检查Sheet权限设置:确保Sheet没有设置「仅组织内成员可访问」这类限制,否则服务账号可能还是访问不了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:52:45