您好。
single-select : option name, string
multi-select : array, each element of the array is an option name
select 的单选 和 多选,在本地python取值时 都没办法取到显示值,如下图:
![]()
以下红框内容对应上图中的单选项,数据未经过处理:
可以帮我排查一下这个问题吗?非常感谢
。
总结
#!/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()
