如何将Alteryx SQL Editor语句转为Smartsheet API的Python调用?
使用Python调用Smartsheet API筛选非空列数据
我目前使用Alteryx Designer连接Smartsheet API,在Alteryx的「Choose Table or Specify Query」对话框的「SQL Editor」中编写了如下代码:
SELECT * FROM "Proj PAGE 1__1234567891234567s_" as AM WHERE AM."ABC DEF" IS NOT NULL现在我希望通过Python调用Smartsheet API来执行该查询,以获取「ABC DEF」列不为空的数据。我已成功连接Smartsheet API并获取整个工作表,但不清楚如何添加条件来请求数据子集,请问该如何实现这一需求?
两种实现方法
方法一:用Smartsheet API自带的筛选参数(推荐)
这种方法直接在API请求阶段过滤数据,减少传输量,效率更高。步骤如下:
- 先找到目标列
ABC DEF对应的列ID(Smartsheet API用列ID而非列名做筛选) - 调用API时传入筛选条件,只拉取符合要求的行
示例代码:
import smartsheet # 初始化客户端(你应该已经配置好API密钥了) smartsheet_client = smartsheet.Smartsheet('你的API密钥') # 工作表ID:从Alteryx表名里的数字部分提取,比如示例里的1234567891234567 sheet_id = 1234567891234567 # 第一步:获取列信息,找到「ABC DEF」的column_id sheet_columns = smartsheet_client.Sheets.get_sheet(sheet_id, include='columns').columns target_column_id = None for col in sheet_columns: if col.title == 'ABC DEF': target_column_id = col.id break # 第二步:设置筛选规则,只取目标列不为空的行 filter_rules = { "filter": { "columnId": target_column_id, "operator": "NOT_EMPTY" } } # 获取过滤后的工作表数据 filtered_sheet = smartsheet_client.Sheets.get_sheet( sheet_id, query_params=filter_rules ) # 遍历处理结果 for row in filtered_sheet.rows: for cell in row.cells: if cell.column_id == target_column_id: print(f"行ID: {row.id}, ABC DEF值: {cell.value}") break
方法二:获取全量数据后本地过滤
如果你已经能拿到整个工作表的数据,直接在Python里过滤就行:
# 假设你已经获取了全量工作表数据,存在full_sheet变量中 filtered_rows = [] target_column_id = None # 先定位目标列ID for col in full_sheet.columns: if col.title == 'ABC DEF': target_column_id = col.id break # 筛选出目标列不为空的行 for row in full_sheet.rows: for cell in row.cells: if cell.column_id == target_column_id: # 排除空值和空字符串 if cell.value is not None and cell.value.strip() != '': filtered_rows.append(row) break # 处理筛选后的行 for row in filtered_rows: print(f"符合条件的行ID: {row.id}")
注意事项
- Smartsheet API的筛选只支持简单条件,复杂逻辑(比如多条件组合)需要在本地处理
- 匹配列名时注意大小写和空格,确保和工作表里的列名完全一致
- 优先用API筛选,尤其是数据量较大的时候,能节省带宽和处理时间
内容的提问来源于stack exchange,提问作者floss
相关产品推荐
相关产品推荐

