python 本地拉取 seatable 表格的 select 字段 取值不对。

您好。

single-select : option name, string
multi-select : array, each element of the array is an option name
select 的单选 和 多选,在本地python取值时 都没办法取到显示值,如下图:

image

以下红框内容对应上图中的单选项,数据未经过处理:

可以帮我排查一下这个问题吗?非常感谢 :rose:

总结

#!/usr/bin/env python

# -*- coding: utf-8 -*-

“”"

SeaTable Base 元数据调试工具

用于获取SeaTable Base中所有表格的信息(表格ID、表格名称、字段ID、字段名称、第一行记录)

并将数据保存到JSON文件中,方便开发者调试和管理字段ID

“”"

import json

import os

import csv

from typing import Dict, List, Any

from datetime import datetime

from jswm.seatable_connection import SeaTable接口客户端

from jswm.seatable_bases_config import SEATABLE_BASES

class SeaTable元数据调试工具:

"""SeaTable Base元数据调试工具类"""



def \__init_\_(self, 输出目录: str = "debug_seatable_metadata"):

    """

    初始化调试工具

    

    参数:

        输出目录: JSON文件保存的目录名称

    """

    self.输出目录 = 输出目录

    self.确保输出目录存在()



def 确保输出目录存在(self):

    """确保输出目录存在,如果不存在则创建"""

    if not os.path.exists(self.输出目录):

        os.makedirs(self.输出目录)

        print(f"创建输出目录: {self.输出目录}")



def 获取单个Base的元数据(self, base_key: str, base_config: Dict\[str, Any\]) -> Dict\[str, Any\]:

    """

    获取单个SeaTable Base的所有元数据

    

    参数:

        base_key: Base的键名

        base_config: Base的配置信息

        

    返回:

        dict: 包含Base所有元数据的字典

    """

    print(f"\\n=== 开始获取Base: {base_config\['name'\]} ({base_key}) ===")

    

    \# 创建SeaTable客户端

    try:

        客户端 = SeaTable接口客户端(

            服务器地址=base_config\['server_url'\],

            API令牌=base_config\['api_token'\]

        )

        

        \# 获取访问令牌

        访问令牌结果 = 客户端.获取访问令牌()

        if not 访问令牌结果:

            print(f"❌ 无法获取Base {base_key} 的访问令牌")

            return {}

        

        \# 获取表格列表

        表格列表 = 客户端.获取表格列表()

        print(f"✅ 获取到 {len(表格列表)} 个表格")

        

        base_metadata = {

            "base_key": base_key,

            "base_name": base_config\['name'\],

            "server_url": base_config\['server_url'\],

            "tables": \[\]

        }

        

        \# 遍历每个表格

        for 表格索引, 表格 in enumerate(表格列表):

            表格名称 = 表格.get('name', '')

            表格\_id = 表格.get('\_id', '')

            列信息 = 表格.get('columns', \[\])

            

            print(f"\\n  ── 处理表格 \[{表格索引 + 1}/{len(表格列表)}\]: {表格名称} (ID: {表格\_id}) - Base: {base_config\['name'\]} ──")

            print(f"  找到 {len(列信息)} 个字段")

            

            \# 获取表格的第一行数据

            第一行数据 = 客户端.查询行数据(表格名称, 限制数量=1)

            

            \# 获取第一行数据的值(如果有)

            first_row_data = 第一行数据\[0\] if 第一行数据 else {}

            

            \# 专门处理【下单工厂】表格

            if 表格名称 == "下单工厂":

                print(f"\\n🔍 找到【下单工厂】表格,打印第一行原始数据:")

                print("=" \* 60)

                if 第一行数据:

                    print("原始数据类型:", type(第一行数据\[0\]))

                    print("原始数据内容:", 第一行数据\[0\])

                    print("\\n各个字段的原始值:")

                    for key, value in 第一行数据\[0\].items():

                        print(f"  字段ID: {key}, 值: {value}, 类型: {type(value)}")

                else:

                    print("❌ 【下单工厂】表格没有数据")

                print("=" \* 60)

            

            \# 构建表格元数据

            表格\_metadata = {

                "table_name": 表格名称,

                "table_id": 表格\_id,

                "columns": \[\],

                "first_row": first_row_data

            }

            

            \# 添加字段信息

            for 列 in 列信息:

                字段\_name = 列.get('name', '')

                字段\_key = 列.get('key', '')

                字段\_type = 列.get('type', '')

                

                \# 获取该字段的第一行数据值

                字段\_value = first_row_data.get(字段\_key, "")

                

                表格\_metadata\['columns'\].append({

                    "column_name": 字段\_name,

                    "column_key": 字段\_key,

                    "column_type": 字段\_type,

                    "first_row_value": 字段\_value

                })

                

                \# 打印字段信息和第一行数据值

                print(f"  - {字段\_name} (Key: {字段\_key}, Type: {字段\_type}) => 值: {字段\_value}")

            

            \# 打印调试信息:当前表格名称和配置的表格列表

            print(f"  调试信息: 表格名称='{表格名称}', 配置表格列表={base_config.get('tables', \[\])}")

            

            \# 保存所有表格的信息,不管配置中是否指定

            base_metadata\['tables'\].append(表格\_metadata)

            print(f"  ✅ 已添加到元数据")

        

        return base_metadata

        

    except Exception as e:

        print(f"❌ 获取Base {base_key} 的元数据失败: {str(e)}")

        import traceback

        traceback.print_exc()

        return {}



def 获取所有Bases的元数据(self) -> Dict\[str, Any\]:

    """

    获取配置中所有SeaTable Bases的元数据

    

    返回:

        dict: 包含所有Bases元数据的字典

    """

    print("🚀 开始获取所有SeaTable Bases的元数据...")

    

    all_metadata = {

        "timestamp": self.获取当前时间(),

        "bases": {}

    }

    

    \# 遍历所有配置的Bases

    for base_key, base_config in SEATABLE_BASES.items():

        base_metadata = self.获取单个Base的元数据(base_key, base_config)

        if base_metadata:

            all_metadata\['bases'\]\[base_key\] = base_metadata

    

    return all_metadata



def 获取当前时间(self) -> str:

    """

    获取当前时间的字符串表示

    

    返回:

        str: 当前时间字符串,格式为YYYY-MM-DD HH:MM:SS

    """

    from datetime import datetime

    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")



def 保存元数据到JSON文件(self, 元数据: Dict\[str, Any\]):

    """

    将元数据保存到JSON文件

    

    参数:

        元数据: 要保存的元数据字典

    """

    \# 保存完整的元数据到一个文件

    完整文件名 = os.path.join(self.输出目录, "all_bases_metadata.json")

    try:

        with open(完整文件名, "w", encoding="utf-8") as f:

            json.dump(元数据, f, ensure_ascii=False, indent=2)

        print(f"\\n✅ 完整元数据已保存到: {完整文件名}")

    except Exception as e:

        print(f"❌ 保存完整元数据失败: {str(e)}")

    

    \# 为每个Base单独保存一个JSON文件

    for base_key, base_metadata in 元数据\['bases'\].items():

        base_filename = os.path.join(self.输出目录, f"base\_{base_key}\_metadata.json")

        try:

            with open(base_filename, "w", encoding="utf-8") as f:

                json.dump(base_metadata, f, ensure_ascii=False, indent=2)

            print(f"✅ Base {base_key} 元数据已保存到: {base_filename}")

        except Exception as e:

            print(f"❌ 保存Base {base_key} 元数据失败: {str(e)}")



def 保存元数据到CSV文件(self, 元数据: Dict\[str, Any\]):

    """

    将元数据保存为CSV格式文件

    

    参数:

        元数据: 要保存的元数据字典

    """

    \# 删除输出目录中所有现有的CSV文件

    for 文件 in os.listdir(self.输出目录):

        if 文件.endswith(".csv"):

            文件路径 = os.path.join(self.输出目录, 文件)

            os.remove(文件路径)

    

    \# 保存所有表格的字段信息到一个CSV文件

    fields_csv_file = os.path.join(self.输出目录, "all_tables_fields.csv")

    

    try:

        with open(fields_csv_file, "w", newline="", encoding="utf-8-sig") as f:

            writer = csv.writer(f)

            \# 写入表头

            writer.writerow(\["Base Key", "Base名称", "表格名称", "表格ID", "字段名称", "字段Key", "字段类型", "第一行值"\])

            

            \# 写入数据

            for base_key, base_metadata in 元数据\['bases'\].items():

                base_name = base_metadata.get("base_name", "")

                for table in base_metadata.get("tables", \[\]):

                    table_name = table.get("table_name", "")

                    table_id = table.get("table_id", "")

                    for column in table.get("columns", \[\]):

                        writer.writerow(\[

                            base_key,

                            base_name,

                            table_name,

                            table_id,

                            column.get("column_name", ""),

                            column.get("column_key", ""),

                            column.get("column_type", ""),

                            column.get("first_row_value", "")

                        \])

        

        print(f"✅ 所有表格字段信息已保存到: {fields_csv_file}")

    except Exception as e:

        print(f"❌ 保存CSV文件失败: {str(e)}")

    

    \# 为每个表格单独保存一个CSV文件(包含字段信息和第一行数据)

    for base_key, base_metadata in 元数据\['bases'\].items():

        base_name = base_metadata.get("base_name", "")

        for table in base_metadata.get("tables", \[\]):

            table_name = table.get("table_name", "")

            table_fields = table.get("columns", \[\])

            first_row = table.get("first_row", {})

            

            \# 跳过没有字段的表格

            if not table_fields:

                continue

            

            \# 构建表格CSV文件名

            safe_table_name = table_name.replace(" ", "\_")

            table_csv_file = os.path.join(self.输出目录, f"base\_{base_key}\_{safe_table_name}\_metadata.csv")

            

            try:

                with open(table_csv_file, "w", newline="", encoding="utf-8-sig") as f:

                    writer = csv.writer(f)

                    

                    \# 写入表格基本信息

                    writer.writerow(\["Base Key", base_key\])

                    writer.writerow(\["Base名称", base_name\])

                    writer.writerow(\["表格名称", table_name\])

                    writer.writerow(\["表格ID", table.get("table_id", "")\])

                    writer.writerow(\[\])  # 空行

                    

                    \# 写入字段信息

                    writer.writerow(\["字段名称", "字段Key", "字段类型", "第一行值"\])

                    for column in table_fields:

                        field_value = first_row.get(column.get("column_key", ""), "")

                        writer.writerow(\[

                            column.get("column_name", ""),

                            column.get("column_key", ""),

                            column.get("column_type", ""),

                            field_value

                        \])

                

                print(f"✅ 表格 {table_name} 元数据已保存到: {table_csv_file}")

            except Exception as e:

                print(f"❌ 保存表格 {table_name} 元数据失败: {str(e)}")



def 运行(self):

    """

    运行调试工具,获取所有元数据并保存到CSV文件

    """

    print("=" \* 60)

    print("SeaTable Base 元数据调试工具")

    print("=" \* 60)

    

    \# 获取所有Bases的元数据

    所有\_metadata = self.获取所有Bases的元数据()

    

    if 所有\_metadata\['bases'\]:

        \# 保存到CSV文件

        print("\\n" + "=" \* 40)

        print("开始保存CSV格式文件...")

        print("=" \* 40)

        self.保存元数据到CSV文件(所有\_metadata)

        

        print("\\n" + "=" \* 60)

        print("🎉 所有操作已完成!")

        print(f"📁 元数据文件已保存到目录: {self.输出目录}")

        print(f"📋 生成的文件类型:")

        print(f"   - CSV格式: 所有表格字段汇总和按表格分类的详细元数据")

        print("💡 可以在打包时将该目录排除")

        print("=" \* 60)

    else:

        print("\\n" + "=" \* 60)

        print("❌ 未能获取任何Base的元数据")

        print("请检查:")

        print("1. API Token是否有效")

        print("2. 网络连接是否正常")

        print("3. 服务器地址是否正确")

        print("=" \* 60)

def main():

"""主函数,直接运行调试工具"""

调试工具 = SeaTable元数据调试工具()

调试工具.运行()

if _name_ == “_main_”:

main()