如何通过Python API更新单个Google表格中的多个工作表
如何用gspread-dataframe将多个DataFrames上传到单个Google表格?
嘿,我来帮你搞定这个问题!你现在只能推送单个DataFrame到Google表格,其实只要对现有代码做一点扩展,就能轻松支持多个DataFrame的上传,下面分两种最常用的场景给你演示:
场景1:把不同DataFrame放到同一个表格的独立工作表(Sheet)里
这种情况适合把不同类的数据分开存储,比如销售数据、用户数据各占一个Sheet。我们可以先检查目标工作表是否存在,不存在就新建,然后逐个写入DataFrame:
from gspread_dataframe import get_as_dataframe, set_with_dataframe import gspread from oauth2client.service_account import ServiceAccountCredentials import pandas as pd # 授权部分(建议补充drive权限,避免创建工作表时出错) scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive'] creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope) client = gspread.authorize(creds) # 打开你的目标Google表格(替换成你的表格名称或ID) spreadsheet = client.open("你的表格名称") # 准备示例DataFrames(替换成你自己的真实数据) df_sales = pd.DataFrame({'日期': ['2024-01-01', '2024-01-02'], '销售额': [1000, 1500]}) df_users = pd.DataFrame({'用户ID': [1,2,3], '用户名': ['张三', '李四', '王五']}) df_inventory = pd.DataFrame({'商品ID': ['P001', 'P002'], '库存数量': [50, 30]}) # 定义每个DataFrame对应的工作表名称 df_sheet_mapping = [ ("销售数据", df_sales), ("用户数据", df_users), ("库存数据", df_inventory) ] # 遍历写入每个DataFrame for sheet_name, df in df_sheet_mapping: try: # 尝试获取已存在的工作表 worksheet = spreadsheet.worksheet(sheet_name) except gspread.exceptions.WorksheetNotFound: # 不存在就新建工作表,行数和列数匹配DataFrame worksheet = spreadsheet.add_worksheet( title=sheet_name, rows=df.shape[0] + 1, # 多留一行给表头 cols=df.shape[1] ) # 将DataFrame写入工作表(默认会覆盖原有数据) set_with_dataframe(worksheet, df)
场景2:把多个DataFrame放到同一个工作表的不同区域
如果想把相关数据汇总到同一个Sheet里(比如上下排列或左右并列),可以利用set_with_dataframe的row和col参数指定起始位置:
# 打开目标汇总工作表 summary_worksheet = spreadsheet.worksheet("数据汇总") # 第一个DataFrame从A1位置开始写入 set_with_dataframe(summary_worksheet, df_sales, row=1, col=1) # 第二个DataFrame放到第一个的下方,留一行空行分隔 next_row = df_sales.shape[0] + 2 # DataFrame行数 + 2(1行表头+1行空行) set_with_dataframe(summary_worksheet, df_users, row=next_row, col=1) # 第三个DataFrame放到第一个的右侧,留一列空列分隔 next_col = df_sales.shape[1] + 2 set_with_dataframe(summary_worksheet, df_inventory, row=1, col=next_col)
一些实用小提醒
- 如果不想覆盖原有数据,而是追加新的DataFrame,可以先读取现有工作表的数据,计算出下一个可用行:
# 获取现有数据并清理空行 existing_df = get_as_dataframe(summary_worksheet) existing_df = existing_df.dropna(how='all') # 计算下一个起始行 append_row = len(existing_df) + 2 set_with_dataframe(summary_worksheet, df_new_data, row=append_row, col=1) - 授权时一定要包含
https://www.googleapis.com/auth/drive权限,否则新建工作表可能会提示权限不足。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

