如何用Python提取Sheet列非空值并添加至字典?
提取Smartsheet邮箱列非空值到字典的方法
问题描述
我在编写Python脚本时,需要提取某Smartsheet中填充邮箱地址的列的所有值,目前已获取到sheet对象,如何将该列的非空值添加到字典中?
示例sheet对象
{ "accessLevel": "", "columns": [ { "hidden": true, "name": "_Sample_text" } ], "permalink": "https://app.smartsheet.com/sheets/SheetId", "resourceManagementEnabled": false, "rows": [ { "cells": [ { "columnId": 112345 }, { "columnId": 12345, "displayValue": "Jimmy@yahoo.com", "value": "Jimmy@yahoo.com" } ] } ] }
我考虑过的方案
- 使用Regex(感觉有更简便的方法)
- 导出到Excel再读取
我已尝试过的方法
- 转换为JSON(无法序列化)
- 使用sheet.get('xyz')方法
解决方案
实现思路
- 定位目标列ID:先从sheet的
columns数组中找到对应邮箱列的columnId(可通过列名匹配)。 - 遍历行提取非空值:循环所有行,在每行的
cells数组中找到匹配目标列ID的单元格,判断value或displayValue是否非空,符合条件则加入字典(键值可根据需求自定义,比如行号、行ID或邮箱本身)。
示例代码
# 模拟已获取的sheet对象(实际使用时替换为你的sheet对象) sheet = { "columns": [ {"hidden": True, "name": "_Sample_text", "columnId": 112345}, {"hidden": False, "name": "邮箱地址", "columnId": 12345} # 替换为你的邮箱列名 ], "rows": [ { "cells": [ {"columnId": 112345}, {"columnId": 12345, "displayValue": "Jimmy@yahoo.com", "value": "Jimmy@yahoo.com"} ] }, { "cells": [ {"columnId": 112345, "value": "test"}, {"columnId": 12345} # 空值,跳过 ] }, { "cells": [ {"columnId": 112345}, {"columnId": 12345, "displayValue": "Alice@gmail.com", "value": "Alice@gmail.com"} ] } ] } # 1. 获取目标邮箱列的columnId target_col_id = None for col in sheet.get('columns', []): if col.get('name') == '邮箱地址': # 替换为你的邮箱列名称 target_col_id = col['columnId'] break if not target_col_id: print("未找到目标邮箱列") else: # 2. 提取非空邮箱值到字典,这里用行号作为键,邮箱作为值 email_dict = {} for row_num, row in enumerate(sheet.get('rows', []), start=1): for cell in row.get('cells', []): if cell.get('columnId') == target_col_id: email_val = cell.get('value') or cell.get('displayValue') if email_val: email_dict[row_num] = email_val break # 找到对应列单元格后终止当前行的循环 print(email_dict) # 输出:{1: 'Jimmy@yahoo.com', 3: 'Alice@gmail.com'}
补充说明
- 无需使用Regex:如果只是提取非空值,直接判断
value/displayValue是否存在即可,Regex仅用于邮箱格式验证,非必要。 - 无需导出Excel:直接操作sheet对象的结构更高效,避免额外的文件IO操作。
- 若使用Smartsheet SDK:如果你的sheet对象是SDK返回的实例,可通过
sheet.columns、sheet.rows获取数据,通过cell.column_id匹配目标列,逻辑与上述示例一致。
内容的提问来源于stack exchange,提问作者user21244853
相关产品推荐
相关产品推荐

