如何使用gspread一次性更新多个Google Sheets表格
问题说明
需要通过Python实现单次输入数据,自动同步填充到多个Google Sheets电子表格的效果,目前尝试的所有实现方案均无法正常生效,已编写的代码见截图:
可直接落地的实现方案
前置检查(90%的写入失效都是这步漏做)
- 前往Google Cloud控制台启用Google Sheets API、Google Drive API
- 为服务账号生成JSON格式的密钥文件
- 打开每一个需要同步数据的目标Google表格,点击右上角「共享」,把服务账号的邮箱添加为协作者,权限设置为编辑者,缺这步任何写入操作都会被权限拦截
依赖安装
使用封装更完善的gspread库操作表格,比原生API客户端少踩很多参数坑,先安装依赖:pip install gspread oauth2client
可直接运行的同步代码
import gspread from oauth2client.service_account import ServiceAccountCredentials # 接口权限范围配置,不要随意修改 AUTH_SCOPE = [ "https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive" ] # 替换为你自己下载的服务账号密钥文件本地路径 KEY_FILE_PATH = "your_service_account_secret.json" def batch_sync_sheets(write_data, sheet_id_list, worksheet_name="Sheet1", start_cell="A1"): """ 将同一份数据批量写入多个Google表格 :param write_data: 待写入内容,支持单个值(字符串/数字)、二维列表(批量写入多行列) :param sheet_id_list: 所有目标表格的ID列表,ID可从表格URL的/d/字段后提取 :param worksheet_name: 要写入的工作表名称,默认为初始创建的Sheet1 :param start_cell: 写入起始单元格位置,默认为A1 """ # 初始化认证客户端 creds = ServiceAccountCredentials.from_json_keyfile_name(KEY_FILE_PATH, AUTH_SCOPE) gc = gspread.authorize(creds) for sheet_id in sheet_id_list: try: # 打开目标表格、定位工作表 spreadsheet = gc.open_by_key(sheet_id) worksheet = spreadsheet.worksheet(worksheet_name) # 根据数据类型选择写入方法 if isinstance(write_data, list): # 批量写入多单元格时,指定USER_ENTERED参数和手动输入效果一致,会自动识别公式、日期格式 worksheet.update(start_cell, write_data, value_input_option="USER_ENTERED") else: # 单个值写入 worksheet.update_acell(start_cell, write_data) print(f"表格ID:{sheet_id} 写入完成") except Exception as e: print(f"表格ID:{sheet_id} 写入失败,错误:{str(e)}") if __name__ == "__main__": # 示例:写入单个值 content = "这是要同步的测试内容" # 示例:批量写入多行列,传二维列表即可 # content = [ # ["序号", "名称", "数值"], # [1, "测试项1", 100], # [2, "测试项2", 200] # ] # 替换为你所有需要同步的目标表格ID target_sheet_ids = [ "替换为第一个表格的ID", "替换为第二个表格的ID", "替换为第三个表格的ID" ] batch_sync_sheets(content, target_sheet_ids)
之前代码失效的常见排查点
- 如果用原生Google API客户端写入,必须传入
valueInputOption="USER_ENTERED"参数,否则默认参数会导致内容识别异常,看起来像没写入成功 - 不要混用认证方式:服务账号认证不需要弹浏览器授权,OAuth个人号认证第一次运行必须走完授权流程,且要勾选编辑权限
- 批量写入时传入的数据必须是二维列表结构,行列维度和目标写入区域匹配,否则API会直接返回参数错误
- 确认目标表格ID填写正确,不要把整个URL当成ID传入,ID是URL中
/d/和/edit之间的字符串
内容的提问来源于stack exchange,提问作者Halcyon_B
相关产品推荐
相关产品推荐

