如何通过Python API在Smartsheet中根据Level列自动缩进行?
基于Level列实现Data Shuttle导入后的行自动缩进(API程序化方案)
核心思路
Data Shuttle本身不支持按Level列自动设置层级缩进,我们可以通过先完成数据导入,再用API批量调整行的父级关联来实现需求:
- 先让客户用Data Shuttle完成CSV导入,确保
Level列值正确同步到目标表格 - 通过API拉取所有导入后的记录,按顺序遍历并根据
Level值构建层级关系 - 调用API批量更新每行的父行ID,以此实现对应层级的缩进效果
具体实现步骤(以Airtable API为例)
1. 拉取导入后的所有记录
先调用列表接口获取包含Level字段和记录ID的完整数据:
import requests API_KEY = "your_airtable_api_key" BASE_ID = "your_base_id" TABLE_ID = "your_table_id" # 拉取目标视图下的所有记录 response = requests.get( f"https://api.airtable.com/v0/{BASE_ID}/{TABLE_ID}", headers={"Authorization": f"Bearer {API_KEY}"}, params={"view": "Grid view"} # 替换为你实际使用的视图名称 ) records = response.json()["records"]
2. 构建层级映射,确定每行的父行
用栈结构维护当前层级的父行,按顺序遍历记录来匹配对应层级:
level_stack = [] update_batch = [] for record in records: current_level = record["fields"].get("Level", 0) record_id = record["id"] # 调整栈长度以匹配当前层级,弹出多余的父级记录 while len(level_stack) > current_level: level_stack.pop() # 确定父行ID:Level为0时无父行,否则取栈顶的记录ID作为父级 parent_id = level_stack[-1] if level_stack else None if parent_id is not None: update_batch.append({ "id": record_id, "fields": {"Parent": [parent_id]} # 替换为你表格中关联父行的字段名 }) # 将当前记录加入栈,作为后续子行的父级候选 if len(level_stack) == current_level: level_stack.append(record_id)
3. 批量更新记录的父行关联
调用批量更新接口,将调整后的父行关系同步到表格:
# 按API限制分批更新(Airtable单次最多更新10条) for i in range(0, len(update_batch), 10): batch = update_batch[i:i+10] update_response = requests.patch( f"https://api.airtable.com/v0/{BASE_ID}/{TABLE_ID}", headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}, json={"records": batch} ) if update_response.status_code != 200: print(f"批次更新失败: {update_response.json()}")
关键注意事项
- 确保CSV导入后的记录顺序正确:父行必须在对应的子行之前,否则层级映射会出错
- 替换代码中的API密钥、Base/Table ID、字段名(比如
Parent字段需和你的表格配置一致) - 如果是其他工具的API(如Notion),核心逻辑完全通用,仅需调整API调用的格式和字段参数
内容的提问来源于stack exchange,提问作者oscar
相关产品推荐
相关产品推荐

