如何使用Smartsheet API及Python SDK批量下载多个工作表
解决方案
你现有代码有两个核心问题:
- 接口调用错误:
Reports.get_report_as_excel仅用于下载Smartsheet的报表(Report)资源,下载普通工作表必须调用Sheets类下的导出接口。 - 没有实现批量逻辑,也没做定时任务适配,直接跑会出现路径错乱、单文件下载失败导致全任务中断、历史文件被覆盖等问题。
可用批量下载脚本
脚本内置异常捕获、自动加日期后缀避免文件覆盖、全绝对路径适配定时任务运行环境,你只需要修改配置段的工作表ID、保存路径即可:
import os import smartsheet from datetime import datetime # -------------------------- 配置项 按需修改 -------------------------- # 要下载的资源列表:格式为 (资源ID, 自定义文件名前缀) # 共8个资源,替换成你自己的工作表/报表ID和对应名称即可 SHEET_LIST = [ (1234567890123456, "项目进度表"), (2345678901234567, "人员统计表"), (3456789012345678, "预算明细表"), (4567890123456789, "物料清单"), (5678901234567890, "交付排期表"), (6789012345678901, "风险台账"), (7890123456789012, "周度汇总表"), (8729488427892475, "汇总报表"), ] # 文件保存目录 提前手动创建好 建议不要放在桌面 避免权限问题 SAVE_DIR = "D:/Smartsheet_Weekly_Backup" # ------------------------------------------------------------------- # 初始化客户端 smartsheet_client = smartsheet.Smartsheet(os.environ['SMARTSHEET_ACCESS_TOKEN']) smartsheet_client.errors_as_exceptions(True) # 生成本次下载的日期后缀 格式如20240520 避免历史文件被覆盖 date_suffix = datetime.now().strftime("%Y%m%d") if __name__ == "__main__": for res_id, res_name in SHEET_LIST: try: # 拼接最终文件名:前缀_日期.xlsx file_name = f"{res_name}_{date_suffix}.xlsx" # 普通工作表调用Sheets接口下载,报表调用Reports接口 # 你可以根据自己的资源类型调整下面的调用方法 smartsheet_client.Sheets.get_sheet_as_excel( res_id, SAVE_DIR, file_name ) print(f"下载成功: {file_name}") except Exception as e: print(f"下载失败 [资源ID:{res_id} 名称:{res_name}] 错误信息: {str(e)}")
如果你要下载的资源里包含Report类型的报表,只需要把对应资源的下载方法替换为
smartsheet_client.Reports.get_report_as_excel即可,参数格式和工作表下载接口完全一致。
Windows任务计划配置要点
- 提前手动创建代码里配置的
SAVE_DIR文件夹,给运行任务的Windows账号开该目录的读写权限 - 访问令牌
SMARTSHEET_ACCESS_TOKEN要配置在系统环境变量中,不要只配在当前用户的临时环境变量里,否则定时任务非交互运行时会读不到变量 - 新建任务计划时,「操作」配置:
- 程序/脚本:填你本地python.exe的完整绝对路径,比如
C:\Python311\python.exe - 添加参数:填脚本本身的完整绝对路径,比如
D:\scripts\smartsheet_download.py - 起始于:填脚本所在的文件夹路径,比如
D:\scripts\
- 程序/脚本:填你本地python.exe的完整绝对路径,比如
- 如果需要在用户未登录时也运行任务,勾选「不管用户是否登录都要运行」,输入对应Windows账号的密码即可,不需要勾选最高权限除非你的保存目录在系统受保护路径下。
- 先手动在命令行跑一次脚本,确认所有文件能正常下载到指定目录,再配置每周定时触发规则,避免配置完任务跑失败找不到原因。
内容的提问来源于stack exchange,提问作者Charles Shin
相关产品推荐
相关产品推荐

