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

Python解析Google Sheets多工作表时触发异常如何终止for循环

修复方案

你当前代码的核心问题有两个:

  • 仅捕获了SystemExit异常,但请求不存在的工作表时,Google Sheets API抛出的是apiclient.errors.HttpError异常,不会被现有捕获逻辑命中,所以会直接报错
  • 外层循环没有判断终止条件,哪怕工作表不存在也会继续执行后续迭代

修改后的完整代码如下:

# 导入统一放到函数头部,避免重复加载
import httplib2
import pandas as pd
from apiclient import discovery
from apiclient.errors import HttpError

# 请在此处填写你自己的Google API开发者密钥
key = "你的开发者密钥"

def main_concat(id_file, n):
    try:
        discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?'
                        'version=v4')
        service = discovery.build(
            'sheets',
            'v4',
            http=httplib2.Http(),
            discoveryServiceUrl=discoveryUrl,
            developerKey=key)

        spreadsheetId = id_file
        rangeName = f'Respuestas de formulario {n}!A1:L1000'
        result = service.spreadsheets().values().get(
            spreadsheetId=spreadsheetId, range=rangeName).execute()
        values = result.get('values', [])

        if not values:
            print(f'工作表{n}无数据')
            return pd.DataFrame() # 无数据返回空DataFrame,可根据需求调整
        else:
            df=pd.DataFrame(values)
        return df
      
    except HttpError as e:
        # 捕获工作表不存在的异常,返回None标识遍历结束
        if 'Unable to parse range' in str(e):
            print('已遍历完所有存在的表单工作表')
            return None
        # 其他API错误照常抛出方便排查
        else:
            raise e

dfs=[]
for i in range(1,200):
    df=main_concat('1nRAte3AH0pvLMQTg-SEkiSsy4MONJnpTADOGoDLA', i)
    # 收到终止信号直接跳出循环
    if df is None:
        break
    dfs.append(df)

逻辑说明

  • 提前导入HttpError类专门捕获API请求错误,只有当错误是「无法解析范围」(对应工作表不存在)时才返回终止标识,其他API异常会正常抛出方便排查问题
  • 外层循环每次判断返回值,如果是None就直接终止循环,不会继续执行后续无效请求
  • 导入统一放到函数外,避免每次调用函数都重复执行导入逻辑,提升运行效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:54:05