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

Python导出Google Sheets出现exportSizeLimitExceeded错误如何修改脚本

错误根因

Google Sheets对导出为XLSX格式有硬限制:单文件导出上限为10MB,或单元格总数超过500万时就会触发exportSizeLimitExceeded的403错误,属于服务端限制,无法通过修改权限绕过,只能调整导出逻辑适配。

需要补充的逻辑及实现方案
  • 新增导出前的错误校验逻辑
    在写入文件前先判断响应状态码,如果返回403且错误原因匹配exportSizeLimitExceeded,自动切换为分批导出模式,不要直接写入响应内容。
  • 新增分批次拉取数据逻辑
    通过Google Sheets API的ranges参数指定每次拉取的行/列范围,比如每次拉取5万行数据,拉取完成后再合并为完整文件。如果有多张工作表,也可以按工作表拆分导出。
  • 新增多批次数据合并逻辑
    分批次拉取到的数据可以通过pandas、openpyxl等工具合并为同一个XLSX文件,也可以先导出为多个CSV文件后再合并,CSV格式的导出限制比XLSX宽松很多,适合处理超大数据量。
补充后的参考代码
import os
import datetime
import requests
import pandas as pd

# 原配置保持不变
SPREADSHEET_ID = "替换为你的表格ID"
AUTH_HEADER = {"Authorization": "Bearer 替换为你的授权token"}
path = "/root/xlsx/"
prefix = "Remastered"
suffix = datetime.datetime.now().strftime("%Y%m%d")
filename = prefix + "_" + suffix + ".xlsx"
v = os.path.join(path, filename)
print(v)

# 原导出请求(这里的res是你之前的请求响应)
# res = requests.get(你的原导出请求链接, headers=AUTH_HEADER)

# 新增错误判断和分批导出逻辑
if res.status_code == 403:
    err_data = res.json()
    if err_data["error"]["errors"][0]["reason"] == "exportSizeLimitExceeded":
        # 示例:按5万行拆分拉取,可根据你的表格实际列数调整步长
        step = 50000
        total_rows = 300000 # 替换为你的表格实际总行数,也可以先调用API获取总行数
        all_data = []
        # 先拉取表头
        header_res = requests.get(
            f"https://sheets.googleapis.com/v4/spreadsheets/{SPREADSHEET_ID}/values/Sheet1!A1:Z1",
            headers=AUTH_HEADER
        )
        headers = header_res.json()["values"][0]
        # 分批拉取内容
        for start in range(2, total_rows + 2, step):
            end = min(start + step - 1, total_rows + 1)
            batch_res = requests.get(
                f"https://sheets.googleapis.com/v4/spreadsheets/{SPREADSHEET_ID}/values/Sheet1!A{start}:Z{end}",
                headers=AUTH_HEADER
            )
            batch_values = batch_res.json().get("values", [])
            all_data.extend(batch_values)
        # 合并写入xlsx
        df = pd.DataFrame(all_data, columns=headers)
        df.to_excel(v, index=False)
else:
    # 正常导出逻辑不变
    with open(v, 'wb') as f:
        f.write(res.content)
优化建议
  • 如果表格行数不确定,可以先调用一次API拉取表格的元数据,获取实际总行数后再计算拆分步长,不需要手动写死
  • 数据量极大的情况下优先选择导出为CSV格式,导出速度更快,限制更少,后续需要XLSX格式再做转换
  • 可以给分批请求增加重试逻辑,避免网络波动导致拉取失败

内容的提问来源于stack exchange,提问作者rodskies

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:45:03