在Google Cloud配置webhook自动触发代码监听Google Sheets新数据
方案选型结论
你列的三个GCP服务里,只有Cloud Run完全适配当前场景,另外两个和webhook承载需求完全无关:
- Cloud Build API:面向CI/CD构建场景,核心能力是按流水线执行构建、打包、测试任务,无常驻HTTP请求承载能力,不适合用来接业务触发请求
- Cloud Deploy:面向多环境应用发布流转场景,用来管理部署流水线、版本发布节奏,和表格事件触发脚本的需求不匹配
- Cloud Run:Serverless容器服务,按实际请求量计费,自动扩缩容,无需手动维护服务器,和Google Workspace(Sheets)、GCP其他服务原生打通,是承载这类轻量webhook的最优选择。
附当前运行环境截图:
具体配置步骤
1. 改造现有Python脚本为HTTP服务
你原有读取表格、执行业务逻辑的代码可以直接复用,只需要加一层HTTP接口用来接收触发请求即可,用Flask写最小可用示例:
from flask import Flask, request import gspread # 导入你原有脚本依赖的其他库 app = Flask(__name__) # --- 以下是你原有鉴权、初始化Sheets连接的代码,直接迁移过来即可 --- # 例:服务账号鉴权初始化 SHEET_ID = "替换成你的Google表格ID" WEBHOOK_TOKEN = "替换成你自己生成的随机复杂字符串,用来做接口鉴权" gc = gspread.service_account(filename="service_account_key.json") sheet = gc.open_by_key(SHEET_ID).sheet1 # 你原有实现的读取指定列、处理业务逻辑的函数 def process_new_rows(): # 原有业务逻辑放这里,建议加上游标判断:只处理上次处理位置之后的新增行,避免重复执行 pass # --- 原有代码段结束 --- # 新增webhook接口 @app.route("/sheet-trigger", methods=["POST"]) def trigger_handler(): # 校验请求token,防止非法请求触发逻辑 req_token = request.headers.get("X-Webhook-Token", "") if req_token != WEBHOOK_TOKEN: return "Unauthorized", 401 # 执行业务逻辑 process_new_rows() return "OK", 200 if __name__ == "__main__": app.run(host="0.0.0.0", port=8080)
同目录下新建requirements.txt,写入依赖:
flask==2.3.3 gunicorn==21.2.0 gspread==5.12.4 # 追加你原有脚本用到的其他依赖
同目录下新建Dockerfile用于容器化部署:
FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . # 启动HTTP服务,监听Cloud Run默认要求的8080端口 CMD ["gunicorn", "--bind", ":8080", "--workers", "1", "main:app"]
2. 部署服务到Cloud Run
- 打开GCP控制台,切换到你正在使用的项目,进入Cloud Run服务页面
- 点击「创建服务」,选择「从源代码部署」,上传刚才写好的代码目录,区域选离你近的即可
- 「认证方式」选择「允许未认证调用」,鉴权逻辑已经在代码里通过token实现,无需额外配置IAM权限
- 高级设置里把请求超时调整到和你业务逻辑执行时长匹配(默认60秒,最长可设3600秒)
- 等待部署完成,复制生成的服务公网地址,格式为
https://<你的服务名>-<hash>.run.app
3. 配置表格变更触发规则
选下面任意一种方式即可,第二种配置成本最低:
- 方式一(无代码配置):调用Google Drive Push Notification API,给目标表格文件注册watch规则,设置事件类型为文件内容更新,推送地址填
https://<你的Cloud Run地址>/sheet-trigger,自定义请求头带上你之前设置的X-Webhook-Token即可 - 方式二(低代码配置):打开目标Google表格,点击顶部菜单栏「扩展程序」->「Apps Script」,写入以下触发代码:
保存脚本后,点击左侧边栏「触发器」,新建触发器:触发函数选function sendWebhook() { const options = { method: "post", headers: { "X-Webhook-Token": "你之前设置的WEBHOOK_TOKEN值" }, muteHttpExceptions: true }; UrlFetchApp.fetch("https://<你的Cloud Run地址>/sheet-trigger", options); }sendWebhook,事件来源选「来自电子表格」,事件类型根据你的数据新增场景选「编辑时」或「表单提交时」,保存并完成账号授权即可。
注意事项
- 记得把你用的服务账号邮箱加到Google表格的共享列表里,授予至少查看权限,否则脚本读不到表格数据
- 业务逻辑里建议加行号游标:比如把最后处理到的行号存在表格隐藏单元格、Cloud Firestore或者服务内存里,每次触发只处理游标之后的行,处理完更新游标,避免重复处理历史数据
- Apps Script不要用简单触发器(直接命名函数为
onEdit),简单触发器没有外网访问权限,必须用可安装触发器才能正常发请求到Cloud Run
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

