如何跳过Python调用Google Apps Script的身份验证实现自动化?
解决Python调用Google Apps Script API时的手动认证问题
问题背景
需要实现从数据库提取数据推送至Google Sheets,并自动运行Apps Script宏格式化的全流程自动化,但当前使用InstalledAppFlow的认证方式每次运行都需要手动登录,无法适配调度器的无交互场景,调整权限范围也未解决问题。
解决方案:使用服务账号(Service Account)实现无交互认证
服务账号是Google Cloud提供的服务器到服务器交互身份,无需手动登录即可完成认证,完全适配自动化调度场景。
步骤1:创建并配置服务账号
- 登录Google Cloud Console,进入对应项目的「IAM与管理」→「服务账号」页面,创建新服务账号,下载生成的JSON密钥文件(命名为
service-account-key.json)。 - 在Cloud Console的「API与服务」→「库」中搜索并启用Apps Script API。
- 授权服务账号访问目标资源:
- 打开目标Google Sheets,点击「共享」,将服务账号邮箱(密钥文件内的
client_email字段)添加为表格编辑者。 - 若Apps Script部署权限设为「仅自己」,需在Apps Script编辑器的「项目设置」→「云平台项目」中关联到对应Google Cloud项目,再在Cloud Console的IAM页面给服务账号添加「Apps Script API执行者」角色。
- 打开目标Google Sheets,点击「共享」,将服务账号邮箱(密钥文件内的
步骤2:修改Python代码
替换原有的InstalledAppFlow认证逻辑,改用服务账号凭证:
import os.path from googleapiclient import errors from googleapiclient.discovery import build from googleapiclient.errors import HttpError from google.oauth2.service_account import Credentials # 仅保留必要权限范围,减少冗余风险 SCOPES = [ "https://www.googleapis.com/auth/script.processes", "https://www.googleapis.com/auth/spreadsheets" ] script_id = "AKfycbxtDnDYa2mTZKB6WoqK_D9PDsLZyqb7GQAh7pvER-K-rMFXYNa6oVOhzXHsyfyl8vLz" # 基于服务账号密钥创建认证凭证 creds = Credentials.from_service_account_file( "service-account-key.json", scopes=SCOPES ) # 构建Script API服务实例 service = build("script", "v1", credentials=creds) # 执行Apps Script指定函数 request = {"function": "helloWorld"} try: response = service.scripts().run(scriptId=script_id, body=request).execute() if "error" in response: error_details = response["error"]["details"][0] print(f"执行失败: {error_details['errorMessage']}") else: print(f"执行结果: {response['response'].get('result')}") except HttpError as err: print(f"HTTP请求错误: {err}")
关键注意事项
- 服务账号的JSON密钥文件需安全存储,禁止上传至公共代码仓库。
- 权限范围仅保留实际需要的项,避免过度授权带来的安全风险。
- Apps Script部署时需设置为「在我(开发者)授权下运行」,确保服务账号具备调用权限。
内容的提问来源于stack exchange,提问作者Aditya J
相关产品推荐
相关产品推荐

