如何在不使用SDK的情况下用Python从Smartsheets行获取附件?
不使用SDK访问Smartsheets行附件并下载的方法
问题原因
你之前访问不到attachments键,是因为Smartsheets API默认返回的行数据里不包含附件信息,必须在请求行数据时主动指定要包含附件的参数。
解决步骤
修改行数据请求,添加附件查询参数
调用获取行数据的接口时,必须在URL末尾加上?include=attachments,这样返回的行对象才会携带attachments字段。请求示例:GET https://api.smartsheet.com/2.0/sheets/{你的表格ID}/rows?include=attachments请求头要带上你的API令牌:
Authorization: Bearer {你的API令牌}遍历行数据并处理附件
当请求成功后,行对象里会出现attachments数组(如果该行有附件的话)。你可以遍历数组,通过附件ID调用下载接口获取文件内容,再保存到本地。
完整代码示例
import requests # 替换成你的配置信息 SMARTSHEET_API_TOKEN = "你的API令牌" SHEET_ID = "目标表格的ID" headers = {"Authorization": f"Bearer {SMARTSHEET_API_TOKEN}"} # 1. 获取包含附件的行数据 rows_response = requests.get( f"https://api.smartsheet.com/2.0/sheets/{SHEET_ID}/rows?include=attachments", headers=headers ) rows_response.raise_for_status() # 抛出请求错误 data = rows_response.json() # 2. 遍历每行处理附件 for row in data["rows"]: row_id = row["id"] # 检查当前行是否存在附件 if "attachments" not in row or not row["attachments"]: print(f"行ID {row_id} 没有附件") continue print(f"行ID {row_id} 发现 {len(row['attachments'])} 个附件") for attachment in row["attachments"]: attach_name = attachment["name"] attach_id = attachment["id"] print(f"开始下载: {attach_name}") # 3. 请求附件内容 download_response = requests.get( f"https://api.smartsheet.com/2.0/sheets/{SHEET_ID}/rows/{row_id}/attachments/{attach_id}/content", headers=headers ) download_response.raise_for_status() # 4. 保存到本地 with open(attach_name, "wb") as file: file.write(download_response.content) print(f"{attach_name} 已保存到本地")
注意事项
- 确保你的API令牌有足够的权限(至少需要对目标表格的读权限和附件下载权限)。
- 如果附件名称重复,保存时可能会覆盖旧文件,你可以给文件名加上行ID或附件ID来避免冲突。
内容的提问来源于stack exchange,提问作者reiem87
相关产品推荐
相关产品推荐

