You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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')方法

解决方案

实现思路

  1. 定位目标列ID:先从sheet的columns数组中找到对应邮箱列的columnId(可通过列名匹配)。
  2. 遍历行提取非空值:循环所有行,在每行的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:09:24