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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:47:05