cc-lark 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/.github/workflows/ci.yml +47 -0
  2. package/.github/workflows/release.yml +47 -0
  3. package/.github/workflows/sync-upstream.yml +127 -0
  4. package/.prettierrc.json +7 -0
  5. package/README.md +214 -0
  6. package/dist/core/api-error.d.ts +193 -0
  7. package/dist/core/api-error.d.ts.map +1 -0
  8. package/dist/core/api-error.js +263 -0
  9. package/dist/core/api-error.js.map +1 -0
  10. package/dist/core/auth-errors.d.ts +13 -0
  11. package/dist/core/auth-errors.d.ts.map +1 -0
  12. package/dist/core/auth-errors.js +14 -0
  13. package/dist/core/auth-errors.js.map +1 -0
  14. package/dist/core/config.d.ts +60 -0
  15. package/dist/core/config.d.ts.map +1 -0
  16. package/dist/core/config.js +115 -0
  17. package/dist/core/config.js.map +1 -0
  18. package/dist/core/device-flow.d.ts +80 -0
  19. package/dist/core/device-flow.d.ts.map +1 -0
  20. package/dist/core/device-flow.js +231 -0
  21. package/dist/core/device-flow.js.map +1 -0
  22. package/dist/core/index.d.ts +16 -0
  23. package/dist/core/index.d.ts.map +1 -0
  24. package/dist/core/index.js +16 -0
  25. package/dist/core/index.js.map +1 -0
  26. package/dist/core/lark-client.d.ts +136 -0
  27. package/dist/core/lark-client.d.ts.map +1 -0
  28. package/dist/core/lark-client.js +315 -0
  29. package/dist/core/lark-client.js.map +1 -0
  30. package/dist/core/token-store.d.ts +67 -0
  31. package/dist/core/token-store.d.ts.map +1 -0
  32. package/dist/core/token-store.js +215 -0
  33. package/dist/core/token-store.js.map +1 -0
  34. package/dist/core/types.d.ts +286 -0
  35. package/dist/core/types.d.ts.map +1 -0
  36. package/dist/core/types.js +11 -0
  37. package/dist/core/types.js.map +1 -0
  38. package/dist/core/uat-client.d.ts +64 -0
  39. package/dist/core/uat-client.d.ts.map +1 -0
  40. package/dist/core/uat-client.js +227 -0
  41. package/dist/core/uat-client.js.map +1 -0
  42. package/dist/core/version.d.ts +26 -0
  43. package/dist/core/version.d.ts.map +1 -0
  44. package/dist/core/version.js +50 -0
  45. package/dist/core/version.js.map +1 -0
  46. package/dist/index.d.ts +12 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +116 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/tools/bitable/app.d.ts +20 -0
  51. package/dist/tools/bitable/app.d.ts.map +1 -0
  52. package/dist/tools/bitable/app.js +301 -0
  53. package/dist/tools/bitable/app.js.map +1 -0
  54. package/dist/tools/bitable/field.d.ts +19 -0
  55. package/dist/tools/bitable/field.d.ts.map +1 -0
  56. package/dist/tools/bitable/field.js +315 -0
  57. package/dist/tools/bitable/field.js.map +1 -0
  58. package/dist/tools/bitable/index.d.ts +21 -0
  59. package/dist/tools/bitable/index.d.ts.map +1 -0
  60. package/dist/tools/bitable/index.js +39 -0
  61. package/dist/tools/bitable/index.js.map +1 -0
  62. package/dist/tools/bitable/record.d.ts +22 -0
  63. package/dist/tools/bitable/record.d.ts.map +1 -0
  64. package/dist/tools/bitable/record.js +434 -0
  65. package/dist/tools/bitable/record.js.map +1 -0
  66. package/dist/tools/bitable/table.d.ts +21 -0
  67. package/dist/tools/bitable/table.d.ts.map +1 -0
  68. package/dist/tools/bitable/table.js +361 -0
  69. package/dist/tools/bitable/table.js.map +1 -0
  70. package/dist/tools/calendar/calendar.d.ts +18 -0
  71. package/dist/tools/calendar/calendar.d.ts.map +1 -0
  72. package/dist/tools/calendar/calendar.js +192 -0
  73. package/dist/tools/calendar/calendar.js.map +1 -0
  74. package/dist/tools/calendar/event.d.ts +20 -0
  75. package/dist/tools/calendar/event.d.ts.map +1 -0
  76. package/dist/tools/calendar/event.js +465 -0
  77. package/dist/tools/calendar/event.js.map +1 -0
  78. package/dist/tools/calendar/index.d.ts +19 -0
  79. package/dist/tools/calendar/index.d.ts.map +1 -0
  80. package/dist/tools/calendar/index.js +37 -0
  81. package/dist/tools/calendar/index.js.map +1 -0
  82. package/dist/tools/chat/chat.d.ts +11 -0
  83. package/dist/tools/chat/chat.d.ts.map +1 -0
  84. package/dist/tools/chat/chat.js +106 -0
  85. package/dist/tools/chat/chat.js.map +1 -0
  86. package/dist/tools/chat/index.d.ts +11 -0
  87. package/dist/tools/chat/index.d.ts.map +1 -0
  88. package/dist/tools/chat/index.js +20 -0
  89. package/dist/tools/chat/index.js.map +1 -0
  90. package/dist/tools/chat/members.d.ts +9 -0
  91. package/dist/tools/chat/members.d.ts.map +1 -0
  92. package/dist/tools/chat/members.js +80 -0
  93. package/dist/tools/chat/members.js.map +1 -0
  94. package/dist/tools/common/get-user.d.ts +11 -0
  95. package/dist/tools/common/get-user.d.ts.map +1 -0
  96. package/dist/tools/common/get-user.js +112 -0
  97. package/dist/tools/common/get-user.js.map +1 -0
  98. package/dist/tools/common/index.d.ts +11 -0
  99. package/dist/tools/common/index.d.ts.map +1 -0
  100. package/dist/tools/common/index.js +20 -0
  101. package/dist/tools/common/index.js.map +1 -0
  102. package/dist/tools/common/search-user.d.ts +9 -0
  103. package/dist/tools/common/search-user.d.ts.map +1 -0
  104. package/dist/tools/common/search-user.js +88 -0
  105. package/dist/tools/common/search-user.js.map +1 -0
  106. package/dist/tools/doc/create.d.ts +17 -0
  107. package/dist/tools/doc/create.d.ts.map +1 -0
  108. package/dist/tools/doc/create.js +159 -0
  109. package/dist/tools/doc/create.js.map +1 -0
  110. package/dist/tools/doc/fetch.d.ts +17 -0
  111. package/dist/tools/doc/fetch.d.ts.map +1 -0
  112. package/dist/tools/doc/fetch.js +123 -0
  113. package/dist/tools/doc/fetch.js.map +1 -0
  114. package/dist/tools/doc/index.d.ts +21 -0
  115. package/dist/tools/doc/index.d.ts.map +1 -0
  116. package/dist/tools/doc/index.js +33 -0
  117. package/dist/tools/doc/index.js.map +1 -0
  118. package/dist/tools/doc/shared.d.ts +69 -0
  119. package/dist/tools/doc/shared.d.ts.map +1 -0
  120. package/dist/tools/doc/shared.js +172 -0
  121. package/dist/tools/doc/shared.js.map +1 -0
  122. package/dist/tools/doc/update.d.ts +25 -0
  123. package/dist/tools/doc/update.d.ts.map +1 -0
  124. package/dist/tools/doc/update.js +208 -0
  125. package/dist/tools/doc/update.js.map +1 -0
  126. package/dist/tools/drive/file.d.ts +13 -0
  127. package/dist/tools/drive/file.d.ts.map +1 -0
  128. package/dist/tools/drive/file.js +212 -0
  129. package/dist/tools/drive/file.js.map +1 -0
  130. package/dist/tools/drive/index.d.ts +12 -0
  131. package/dist/tools/drive/index.d.ts.map +1 -0
  132. package/dist/tools/drive/index.js +25 -0
  133. package/dist/tools/drive/index.js.map +1 -0
  134. package/dist/tools/im/format-messages.d.ts +99 -0
  135. package/dist/tools/im/format-messages.d.ts.map +1 -0
  136. package/dist/tools/im/format-messages.js +277 -0
  137. package/dist/tools/im/format-messages.js.map +1 -0
  138. package/dist/tools/im/helpers.d.ts +53 -0
  139. package/dist/tools/im/helpers.d.ts.map +1 -0
  140. package/dist/tools/im/helpers.js +85 -0
  141. package/dist/tools/im/helpers.js.map +1 -0
  142. package/dist/tools/im/index.d.ts +25 -0
  143. package/dist/tools/im/index.d.ts.map +1 -0
  144. package/dist/tools/im/index.js +44 -0
  145. package/dist/tools/im/index.js.map +1 -0
  146. package/dist/tools/im/message-read.d.ts +19 -0
  147. package/dist/tools/im/message-read.d.ts.map +1 -0
  148. package/dist/tools/im/message-read.js +526 -0
  149. package/dist/tools/im/message-read.js.map +1 -0
  150. package/dist/tools/im/message.d.ts +22 -0
  151. package/dist/tools/im/message.d.ts.map +1 -0
  152. package/dist/tools/im/message.js +233 -0
  153. package/dist/tools/im/message.js.map +1 -0
  154. package/dist/tools/im/resource.d.ts +19 -0
  155. package/dist/tools/im/resource.d.ts.map +1 -0
  156. package/dist/tools/im/resource.js +185 -0
  157. package/dist/tools/im/resource.js.map +1 -0
  158. package/dist/tools/im/time-utils.d.ts +70 -0
  159. package/dist/tools/im/time-utils.d.ts.map +1 -0
  160. package/dist/tools/im/time-utils.js +277 -0
  161. package/dist/tools/im/time-utils.js.map +1 -0
  162. package/dist/tools/index.d.ts +85 -0
  163. package/dist/tools/index.d.ts.map +1 -0
  164. package/dist/tools/index.js +135 -0
  165. package/dist/tools/index.js.map +1 -0
  166. package/dist/tools/oauth.d.ts +15 -0
  167. package/dist/tools/oauth.d.ts.map +1 -0
  168. package/dist/tools/oauth.js +379 -0
  169. package/dist/tools/oauth.js.map +1 -0
  170. package/dist/tools/search/doc-search.d.ts +9 -0
  171. package/dist/tools/search/doc-search.d.ts.map +1 -0
  172. package/dist/tools/search/doc-search.js +219 -0
  173. package/dist/tools/search/doc-search.js.map +1 -0
  174. package/dist/tools/search/index.d.ts +11 -0
  175. package/dist/tools/search/index.d.ts.map +1 -0
  176. package/dist/tools/search/index.js +18 -0
  177. package/dist/tools/search/index.js.map +1 -0
  178. package/dist/tools/sheets/index.d.ts +11 -0
  179. package/dist/tools/sheets/index.d.ts.map +1 -0
  180. package/dist/tools/sheets/index.js +18 -0
  181. package/dist/tools/sheets/index.js.map +1 -0
  182. package/dist/tools/sheets/sheet.d.ts +11 -0
  183. package/dist/tools/sheets/sheet.d.ts.map +1 -0
  184. package/dist/tools/sheets/sheet.js +332 -0
  185. package/dist/tools/sheets/sheet.js.map +1 -0
  186. package/dist/tools/task/index.d.ts +12 -0
  187. package/dist/tools/task/index.d.ts.map +1 -0
  188. package/dist/tools/task/index.js +30 -0
  189. package/dist/tools/task/index.js.map +1 -0
  190. package/dist/tools/task/task.d.ts +13 -0
  191. package/dist/tools/task/task.d.ts.map +1 -0
  192. package/dist/tools/task/task.js +225 -0
  193. package/dist/tools/task/task.js.map +1 -0
  194. package/dist/tools/task/tasklist.d.ts +13 -0
  195. package/dist/tools/task/tasklist.d.ts.map +1 -0
  196. package/dist/tools/task/tasklist.js +206 -0
  197. package/dist/tools/task/tasklist.js.map +1 -0
  198. package/dist/tools/wiki/index.d.ts +11 -0
  199. package/dist/tools/wiki/index.d.ts.map +1 -0
  200. package/dist/tools/wiki/index.js +20 -0
  201. package/dist/tools/wiki/index.js.map +1 -0
  202. package/dist/tools/wiki/node.d.ts +11 -0
  203. package/dist/tools/wiki/node.d.ts.map +1 -0
  204. package/dist/tools/wiki/node.js +112 -0
  205. package/dist/tools/wiki/node.js.map +1 -0
  206. package/dist/tools/wiki/space.d.ts +11 -0
  207. package/dist/tools/wiki/space.d.ts.map +1 -0
  208. package/dist/tools/wiki/space.js +125 -0
  209. package/dist/tools/wiki/space.js.map +1 -0
  210. package/dist/utils/index.d.ts +8 -0
  211. package/dist/utils/index.d.ts.map +1 -0
  212. package/dist/utils/index.js +8 -0
  213. package/dist/utils/index.js.map +1 -0
  214. package/dist/utils/logger.d.ts +36 -0
  215. package/dist/utils/logger.d.ts.map +1 -0
  216. package/dist/utils/logger.js +101 -0
  217. package/dist/utils/logger.js.map +1 -0
  218. package/eslint.config.js +13 -0
  219. package/package.json +54 -0
  220. package/skills/feishu-bitable/SKILL.md +248 -0
  221. package/skills/feishu-bitable/references/examples.md +813 -0
  222. package/skills/feishu-bitable/references/field-properties.md +763 -0
  223. package/skills/feishu-bitable/references/record-values.md +911 -0
  224. package/skills/feishu-calendar/SKILL.md +244 -0
  225. package/skills/feishu-channel-rules/SKILL.md +18 -0
  226. package/skills/feishu-channel-rules/references/markdown-syntax.md +138 -0
  227. package/skills/feishu-create-doc/SKILL.md +719 -0
  228. package/skills/feishu-fetch-doc/SKILL.md +93 -0
  229. package/skills/feishu-im-read/SKILL.md +163 -0
  230. package/skills/feishu-task/SKILL.md +293 -0
  231. package/skills/feishu-troubleshoot/SKILL.md +70 -0
  232. package/skills/feishu-update-doc/SKILL.md +285 -0
  233. package/src/core/api-error.ts +342 -0
  234. package/src/core/auth-errors.ts +27 -0
  235. package/src/core/config.ts +134 -0
  236. package/src/core/device-flow.ts +314 -0
  237. package/src/core/index.ts +16 -0
  238. package/src/core/lark-client.ts +391 -0
  239. package/src/core/token-store.ts +249 -0
  240. package/src/core/types.ts +302 -0
  241. package/src/core/uat-client.ts +298 -0
  242. package/src/core/version.ts +53 -0
  243. package/src/index.ts +138 -0
  244. package/src/tools/bitable/app.ts +390 -0
  245. package/src/tools/bitable/field.ts +406 -0
  246. package/src/tools/bitable/index.ts +43 -0
  247. package/src/tools/bitable/record.ts +559 -0
  248. package/src/tools/bitable/table.ts +472 -0
  249. package/src/tools/calendar/calendar.ts +254 -0
  250. package/src/tools/calendar/event.ts +606 -0
  251. package/src/tools/calendar/index.ts +41 -0
  252. package/src/tools/chat/chat.ts +127 -0
  253. package/src/tools/chat/index.ts +24 -0
  254. package/src/tools/chat/members.ts +93 -0
  255. package/src/tools/common/get-user.ts +127 -0
  256. package/src/tools/common/index.ts +24 -0
  257. package/src/tools/common/search-user.ts +99 -0
  258. package/src/tools/doc/create.ts +184 -0
  259. package/src/tools/doc/fetch.ts +149 -0
  260. package/src/tools/doc/index.ts +38 -0
  261. package/src/tools/doc/shared.ts +228 -0
  262. package/src/tools/doc/update.ts +240 -0
  263. package/src/tools/drive/file.ts +265 -0
  264. package/src/tools/drive/index.ts +29 -0
  265. package/src/tools/im/format-messages.ts +391 -0
  266. package/src/tools/im/helpers.ts +109 -0
  267. package/src/tools/im/index.ts +49 -0
  268. package/src/tools/im/message-read.ts +676 -0
  269. package/src/tools/im/message.ts +303 -0
  270. package/src/tools/im/resource.ts +225 -0
  271. package/src/tools/im/time-utils.ts +347 -0
  272. package/src/tools/index.ts +205 -0
  273. package/src/tools/oauth.ts +460 -0
  274. package/src/tools/search/doc-search.ts +250 -0
  275. package/src/tools/search/index.ts +22 -0
  276. package/src/tools/sheets/index.ts +22 -0
  277. package/src/tools/sheets/sheet.ts +382 -0
  278. package/src/tools/task/index.ts +34 -0
  279. package/src/tools/task/task.ts +265 -0
  280. package/src/tools/task/tasklist.ts +262 -0
  281. package/src/tools/wiki/index.ts +24 -0
  282. package/src/tools/wiki/node.ts +131 -0
  283. package/src/tools/wiki/space.ts +152 -0
  284. package/src/utils/index.ts +8 -0
  285. package/src/utils/logger.ts +132 -0
  286. package/tests/core/config.test.ts +238 -0
  287. package/tests/core/device-flow.test.ts +490 -0
  288. package/tests/core/lark-client.test.ts +378 -0
  289. package/tests/core/token-store.test.ts +438 -0
  290. package/tests/index.test.ts +360 -0
  291. package/tests/tools/doc/create.test.ts +224 -0
  292. package/tests/tools/doc/fetch.test.ts +182 -0
  293. package/tests/tools/doc/shared.test.ts +183 -0
  294. package/tests/tools/doc/update.test.ts +330 -0
  295. package/tests/tools/im/format-messages.test.ts +184 -0
  296. package/tests/tools/im/time-utils.test.ts +178 -0
  297. package/tests/utils/logger.test.ts +140 -0
  298. package/tsconfig.json +20 -0
@@ -0,0 +1,813 @@
1
+ # 飞书多维表格使用场景完整示例
2
+
3
+ 本文档提供多维表格操作的完整场景示例,包括参数说明和注意事项。
4
+
5
+ > **基础参考**: 先查阅 [字段 Property 配置详解](field-properties.md) 和 [记录值数据结构详解](record-values.md)
6
+
7
+ ---
8
+
9
+ ## 📋 目录
10
+
11
+ 1. [场景 0: 创建数据表(两种模式对比)](#场景-0-创建数据表两种模式对比)
12
+ 2. [场景 1: 查字段类型(必做第一步)](#场景-1-查字段类型必做第一步)
13
+ 3. [场景 2: 批量导入客户数据](#场景-2-批量导入客户数据)
14
+ 4. [场景 2.5: 创建表并插入数据(含空行处理)](#场景-25-创建表并插入数据含空行处理)
15
+ 5. [场景 3: 筛选查询(高级筛选)](#场景-3-筛选查询高级筛选)
16
+ 6. [场景 4: 更新单条记录](#场景-4-更新单条记录)
17
+ 7. [场景 5: 创建带选项的单选字段](#场景-5-创建带选项的单选字段)
18
+ 8. [场景 6: 创建复杂字段(进度、货币、评分)](#场景-6-创建复杂字段进度货币评分)
19
+ 9. [场景 7: 处理附件字段](#场景-7-处理附件字段)
20
+ 10. [场景 8: 双向关联字段](#场景-8-双向关联字段)
21
+
22
+ ---
23
+
24
+ ## 场景 0: 创建数据表(两种模式对比)
25
+
26
+ ### 模式 A:一次性定义所有字段
27
+
28
+ **适用场景**:字段类型、配置都已明确,需要快速创建表结构。
29
+
30
+ **优势**:一次 API 调用,原子性操作。
31
+
32
+ **工具**: `feishu_bitable_app_table`
33
+
34
+ ```json
35
+ {
36
+ "action": "create",
37
+ "app_token": "S404b...",
38
+ "table": {
39
+ "name": "客户管理表",
40
+ "default_view_name": "所有客户",
41
+ "fields": [
42
+ {
43
+ "field_name": "客户名称",
44
+ "type": 1
45
+ },
46
+ {
47
+ "field_name": "负责人",
48
+ "type": 11,
49
+ "property": {
50
+ "multiple": false
51
+ }
52
+ },
53
+ {
54
+ "field_name": "签约日期",
55
+ "type": 5,
56
+ "property": {
57
+ "date_formatter": "yyyy-MM-dd"
58
+ }
59
+ },
60
+ {
61
+ "field_name": "状态",
62
+ "type": 3,
63
+ "property": {
64
+ "options": [
65
+ {"name": "进行中", "color": 0},
66
+ {"name": "已完成", "color": 10}
67
+ ]
68
+ }
69
+ },
70
+ {
71
+ "field_name": "金额",
72
+ "type": 2,
73
+ "ui_type": "Currency",
74
+ "property": {
75
+ "currency_code": "CNY",
76
+ "formatter": "0.00"
77
+ }
78
+ }
79
+ ]
80
+ }
81
+ }
82
+ ```
83
+
84
+ **返回示例**:
85
+ ```json
86
+ {
87
+ "table_id": "tblXXXXXXXX",
88
+ "name": "客户管理表",
89
+ "default_view_id": "vewXXXXXXXX"
90
+ }
91
+ ```
92
+
93
+ ---
94
+
95
+ ### 模式 B:使用默认表 + 逐步修改字段
96
+
97
+ **适用场景**:探索式建表,需要边建边调整,或复杂字段配置需要分步确认。
98
+
99
+ **优势**:
100
+ - `app.create` 自带默认表和默认字段,可在此基础上调整
101
+ - 复杂字段(单选 options、URL 格式等)分步确认,减少出错
102
+ - 踩坑后容易回退(比如 URL 字段改为文本字段)
103
+
104
+ **完整流程**:
105
+
106
+ #### 步骤 1: 创建 App(工具: `feishu_bitable_app`)
107
+
108
+ ```json
109
+ {
110
+ "action": "create",
111
+ "name": "客户管理系统",
112
+ "folder_token": "fldXXXXXXXX"
113
+ }
114
+ ```
115
+
116
+ **返回**: 包含 `app_token` 和默认表的 `default_table_id`
117
+
118
+ ---
119
+
120
+ #### 步骤 2: 查看默认字段(工具: `feishu_bitable_app_table_field`)
121
+
122
+ ```json
123
+ {
124
+ "action": "list",
125
+ "app_token": "S404b...",
126
+ "table_id": "tblXXXXXXXX"
127
+ }
128
+ ```
129
+
130
+ **返回示例**:
131
+ ```json
132
+ {
133
+ "fields": [
134
+ {
135
+ "field_id": "fld001",
136
+ "field_name": "文本",
137
+ "type": 1,
138
+ "ui_type": "Text"
139
+ },
140
+ {
141
+ "field_id": "fld002",
142
+ "field_name": "数字",
143
+ "type": 2,
144
+ "ui_type": "Number"
145
+ }
146
+ ]
147
+ }
148
+ ```
149
+
150
+ ---
151
+
152
+ #### 步骤 3: 修改默认字段名称(工具: `feishu_bitable_app_table_field`)
153
+
154
+ ```json
155
+ {
156
+ "action": "update",
157
+ "app_token": "S404b...",
158
+ "table_id": "tblXXXXXXXX",
159
+ "field_id": "fld001",
160
+ "field_name": "客户名称"
161
+ }
162
+ ```
163
+
164
+ ---
165
+
166
+ #### 步骤 4: 补充缺失字段(工具: `feishu_bitable_app_table_field`)
167
+
168
+ ```json
169
+ {
170
+ "action": "create",
171
+ "app_token": "S404b...",
172
+ "table_id": "tblXXXXXXXX",
173
+ "field_name": "负责人",
174
+ "type": 11,
175
+ "property": {
176
+ "multiple": false
177
+ }
178
+ }
179
+ ```
180
+
181
+ ---
182
+
183
+ #### 步骤 5: 查看空记录(工具: `feishu_bitable_app_table_record`)
184
+
185
+ ```json
186
+ {
187
+ "action": "list",
188
+ "app_token": "S404b...",
189
+ "table_id": "tblXXXXXXXX"
190
+ }
191
+ ```
192
+
193
+ **返回**: 可能包含空记录 `[{"record_id": "recxxx", "fields": {}}, ...]`
194
+
195
+ ---
196
+
197
+ #### 步骤 6: 删除空行(工具: `feishu_bitable_app_table_record`)
198
+
199
+ ```json
200
+ {
201
+ "action": "batch_delete",
202
+ "app_token": "S404b...",
203
+ "table_id": "tblXXXXXXXX",
204
+ "records": ["recxxx", "recyyy"]
205
+ }
206
+ ```
207
+
208
+ ---
209
+
210
+ #### 步骤 7: 批量插入数据(工具: `feishu_bitable_app_table_record`)
211
+
212
+ ```json
213
+ {
214
+ "action": "batch_create",
215
+ "app_token": "S404b...",
216
+ "table_id": "tblXXXXXXXX",
217
+ "records": [
218
+ {
219
+ "fields": {
220
+ "客户名称": "Bytedance",
221
+ "负责人": [{"id": "ou_xxx"}],
222
+ "状态": "进行中"
223
+ }
224
+ }
225
+ ]
226
+ }
227
+ ```
228
+
229
+ ---
230
+
231
+ **⚠️ 模式 B 的关键注意事项**:
232
+ - 默认表中通常已有空记录,**必须先删除**,否则会有数据污染
233
+ - 步骤 5-6 是必需的,不能跳过
234
+ - 适合不确定字段配置的探索式场景
235
+
236
+ ---
237
+
238
+ ## 场景 1: 查字段类型(必做第一步)
239
+
240
+ **为什么必做**: 不同字段类型的值格式完全不同,必须先查询再写入。
241
+
242
+ **工具**: `feishu_bitable_app_table_field`
243
+
244
+ ```json
245
+ {
246
+ "action": "list",
247
+ "app_token": "S404b...",
248
+ "table_id": "tblXXXXXXXX"
249
+ }
250
+ ```
251
+
252
+ **返回示例**:
253
+ ```json
254
+ {
255
+ "fields": [
256
+ {
257
+ "field_id": "fld001",
258
+ "field_name": "任务名称",
259
+ "type": 1,
260
+ "ui_type": "Text",
261
+ "property": {}
262
+ },
263
+ {
264
+ "field_id": "fld002",
265
+ "field_name": "负责人",
266
+ "type": 11,
267
+ "ui_type": "User",
268
+ "property": {
269
+ "multiple": true
270
+ }
271
+ },
272
+ {
273
+ "field_id": "fld003",
274
+ "field_name": "截止日期",
275
+ "type": 5,
276
+ "ui_type": "DateTime",
277
+ "property": {
278
+ "date_formatter": "yyyy-MM-dd HH:mm"
279
+ }
280
+ },
281
+ {
282
+ "field_id": "fld004",
283
+ "field_name": "状态",
284
+ "type": 3,
285
+ "ui_type": "SingleSelect",
286
+ "property": {
287
+ "options": [
288
+ {"id": "optXXX", "name": "进行中", "color": 0},
289
+ {"id": "optYYY", "name": "已完成", "color": 10}
290
+ ]
291
+ }
292
+ }
293
+ ]
294
+ }
295
+ ```
296
+
297
+ **关键信息**:
298
+ - `type`: 字段基础类型(1=文本, 2=数字, 3=单选...)
299
+ - `ui_type`: UI 展示类型(区分进度、货币、评分等)
300
+ - `property`: 字段配置(单选的 options、日期的 formatter 等)
301
+
302
+ ---
303
+
304
+ ## 场景 2: 批量导入客户数据
305
+
306
+ **工具**: `feishu_bitable_app_table_record`
307
+
308
+ ```json
309
+ {
310
+ "action": "batch_create",
311
+ "app_token": "S404b...",
312
+ "table_id": "tblXXXXXXXX",
313
+ "records": [
314
+ {
315
+ "fields": {
316
+ "客户名称": "某某",
317
+ "负责人": [{"id": "ou_xxx"}],
318
+ "签约日期": 1674206443000,
319
+ "状态": "进行中",
320
+ "金额": 1000000,
321
+ "标签": ["重要客户", "战略合作"],
322
+ "联系电话": "17899870000",
323
+ "官网": {
324
+ "text": "某某官网",
325
+ "link": "https://www.xxxx.com"
326
+ }
327
+ }
328
+ },
329
+ {
330
+ "fields": {
331
+ "客户名称": "飞书",
332
+ "负责人": [{"id": "ou_xxx"}],
333
+ "签约日期": 1675416243000,
334
+ "状态": "已完成",
335
+ "金额": 500000,
336
+ "标签": ["核心产品"],
337
+ "联系电话": "13800138000"
338
+ }
339
+ }
340
+ ]
341
+ }
342
+ ```
343
+
344
+ **字段值格式说明**:
345
+ - **文本**: 字符串 `"客户名称"`
346
+ - **人员**: 对象数组 `[{"id": "ou_xxx"}]`(只能传 id)
347
+ - **日期**: 毫秒时间戳 `1674206443000`
348
+ - **单选**: 字符串 `"进行中"`
349
+ - **多选**: 字符串数组 `["重要客户", "战略合作"]`
350
+ - **数字**: 数字 `1000000`
351
+ - **电话**: 字符串 `"17899870000"`
352
+ - **超链接**: 对象 `{"text": "显示文本", "link": "URL"}`
353
+
354
+ **返回示例**:
355
+ ```json
356
+ {
357
+ "records": [
358
+ {
359
+ "record_id": "rec001",
360
+ "fields": {...}
361
+ },
362
+ {
363
+ "record_id": "rec002",
364
+ "fields": {...}
365
+ }
366
+ ]
367
+ }
368
+ ```
369
+
370
+ **限制**:
371
+ - 单次最多 500 条记录
372
+ - 超过需分批调用
373
+
374
+ ---
375
+
376
+ ## 场景 2.5: 创建表并插入数据(含空行处理)
377
+
378
+ **问题**: `app.create` 创建的默认表中会自带空记录(空行),直接插入数据会导致数据污染。
379
+
380
+ **正确流程**: 见场景 0 的模式 B
381
+
382
+ **核心步骤**:
383
+ 1. 创建 App → 获取 `app_token` 和 `default_table_id`
384
+ 2. 查看默认表记录 (`list` action)
385
+ 3. 删除空行 (`batch_delete` action)
386
+ 4. 批量插入数据 (`batch_create` action)
387
+
388
+ **错误示例**(跳过步骤 2-3):
389
+ ```
390
+ 表格最终状态:
391
+ | 客户名称 | 负责人 | 状态 |
392
+ |---------|--------|------|
393
+ | | | | ← 空行(原有)
394
+ | Bytedance | 张三 | 进行中 | ← 新插入
395
+ | 飞书 | 李四 | 已完成 | ← 新插入
396
+ ```
397
+
398
+ **正确示例**(执行步骤 2-3):
399
+ ```
400
+ 表格最终状态:
401
+ | 客户名称 | 负责人 | 状态 |
402
+ |---------|--------|------|
403
+ | Bytedance | 张三 | 进行中 |
404
+ | 飞书 | 李四 | 已完成 |
405
+ ```
406
+
407
+ ---
408
+
409
+ ## 场景 3: 筛选查询(高级筛选)
410
+
411
+ **工具**: `feishu_bitable_app_table_record`
412
+
413
+ ```json
414
+ {
415
+ "action": "list",
416
+ "app_token": "S404b...",
417
+ "table_id": "tblXXXXXXXX",
418
+ "filter": {
419
+ "conjunction": "and",
420
+ "conditions": [
421
+ {
422
+ "field_name": "状态",
423
+ "operator": "is",
424
+ "value": ["进行中"]
425
+ },
426
+ {
427
+ "field_name": "截止日期",
428
+ "operator": "isLess",
429
+ "value": ["ExactDate", "1740441600000"]
430
+ },
431
+ {
432
+ "field_name": "优先级",
433
+ "operator": "isGreater",
434
+ "value": ["3"]
435
+ }
436
+ ]
437
+ },
438
+ "sort": [
439
+ {
440
+ "field_name": "截止日期",
441
+ "desc": false
442
+ },
443
+ {
444
+ "field_name": "优先级",
445
+ "desc": true
446
+ }
447
+ ],
448
+ "field_names": ["任务名称", "负责人", "截止日期", "状态"],
449
+ "page_size": 100
450
+ }
451
+ ```
452
+
453
+ **参数说明**:
454
+
455
+ ### filter 结构
456
+ - `conjunction`: 条件组合方式(`"and"` 或 `"or"`)
457
+ - `conditions`: 条件数组
458
+
459
+ ### operator 类型(10 种)
460
+
461
+ | operator | 含义 | 支持字段 | value 格式 |
462
+ |----------|------|----------|-----------|
463
+ | `is` | 等于 | 所有 | `["值"]` |
464
+ | `isNot` | 不等于 | 除日期外 | `["值"]` |
465
+ | `contains` | 包含 | 除日期外 | `["值1", "值2"]` |
466
+ | `doesNotContain` | 不包含 | 除日期外 | `["值1"]` |
467
+ | `isEmpty` | 为空 | 所有 | `[]` |
468
+ | `isNotEmpty` | 不为空 | 所有 | `[]` |
469
+ | `isGreater` | 大于 | 数字、日期 | `["值"]` |
470
+ | `isGreaterEqual` | 大于等于 | 数字 | `["值"]` |
471
+ | `isLess` | 小于 | 数字、日期 | `["值"]` |
472
+ | `isLessEqual` | 小于等于 | 数字 | `["值"]` |
473
+
474
+ ### 日期字段特殊值
475
+
476
+ ```json
477
+ // 具体日期
478
+ {"operator": "is", "value": ["ExactDate", "1702449755000"]}
479
+
480
+ // 相对日期
481
+ {"operator": "is", "value": ["Today"]} // 今天
482
+ {"operator": "is", "value": ["Tomorrow"]} // 明天
483
+ {"operator": "is", "value": ["Yesterday"]} // 昨天
484
+ {"operator": "is", "value": ["CurrentWeek"]} // 本周
485
+ {"operator": "is", "value": ["LastWeek"]} // 上周
486
+ {"operator": "is", "value": ["TheLastWeek"]} // 过去七天
487
+ {"operator": "is", "value": ["TheNextWeek"]} // 未来七天
488
+ ```
489
+
490
+ ### sort 结构
491
+ - `field_name`: 排序字段
492
+ - `desc`: `true` 降序,`false` 升序
493
+ - 支持多字段排序(按数组顺序)
494
+
495
+ ---
496
+
497
+ ## 场景 4: 更新单条记录
498
+
499
+ **工具**: `feishu_bitable_app_table_record`
500
+
501
+ ```json
502
+ {
503
+ "action": "update",
504
+ "app_token": "S404b...",
505
+ "table_id": "tblXXXXXXXX",
506
+ "record_id": "recusyQbB0fVL5",
507
+ "fields": {
508
+ "状态": "已完成",
509
+ "完成时间": 1674206443000,
510
+ "备注": "客户已签约"
511
+ }
512
+ }
513
+ ```
514
+
515
+ **说明**:
516
+ - 只传需要更新的字段
517
+ - 不传的字段保持不变
518
+ - 支持部分字段更新
519
+
520
+ **批量更新**(最多 500 条):
521
+
522
+ ```json
523
+ {
524
+ "action": "batch_update",
525
+ "app_token": "S404b...",
526
+ "table_id": "tblXXXXXXXX",
527
+ "records": [
528
+ {
529
+ "record_id": "rec001",
530
+ "fields": {
531
+ "状态": "已完成"
532
+ }
533
+ },
534
+ {
535
+ "record_id": "rec002",
536
+ "fields": {
537
+ "状态": "已完成"
538
+ }
539
+ }
540
+ ]
541
+ }
542
+ ```
543
+
544
+ ---
545
+
546
+ ## 场景 5: 创建带选项的单选字段
547
+
548
+ **工具**: `feishu_bitable_app_table_field`
549
+
550
+ ```json
551
+ {
552
+ "action": "create",
553
+ "app_token": "S404b...",
554
+ "table_id": "tblXXXXXXXX",
555
+ "field_name": "优先级",
556
+ "type": 3,
557
+ "property": {
558
+ "options": [
559
+ {"name": "高", "color": 0},
560
+ {"name": "中", "color": 1},
561
+ {"name": "低", "color": 2}
562
+ ]
563
+ }
564
+ }
565
+ ```
566
+
567
+ **颜色编号**(color 范围 0-54):
568
+ - 0: 红色
569
+ - 1: 橙色
570
+ - 10: 绿色
571
+ - 20: 蓝色
572
+
573
+ **多选字段**(type=4)格式相同:
574
+
575
+ ```json
576
+ {
577
+ "action": "create",
578
+ "app_token": "S404b...",
579
+ "table_id": "tblXXXXXXXX",
580
+ "field_name": "标签",
581
+ "type": 4,
582
+ "property": {
583
+ "options": [
584
+ {"name": "重要", "color": 0},
585
+ {"name": "紧急", "color": 1},
586
+ {"name": "长期", "color": 10}
587
+ ]
588
+ }
589
+ }
590
+ ```
591
+
592
+ **注意**:
593
+ - 创建时**不能**指定选项 ID(`id` 字段),系统自动生成
594
+ - 选项总数不超过 20,000
595
+
596
+ ---
597
+
598
+ ## 场景 6: 创建复杂字段(进度、货币、评分)
599
+
600
+ ### 进度字段 (type=2, ui_type="Progress")
601
+
602
+ ```json
603
+ {
604
+ "action": "create",
605
+ "app_token": "S404b...",
606
+ "table_id": "tblXXXXXXXX",
607
+ "field_name": "完成进度",
608
+ "type": 2,
609
+ "ui_type": "Progress",
610
+ "property": {
611
+ "min": 0,
612
+ "max": 100,
613
+ "range_customize": true
614
+ }
615
+ }
616
+ ```
617
+
618
+ **写入值**: `0.75` 表示 75%
619
+
620
+ ---
621
+
622
+ ### 货币字段 (type=2, ui_type="Currency")
623
+
624
+ ```json
625
+ {
626
+ "action": "create",
627
+ "app_token": "S404b...",
628
+ "table_id": "tblXXXXXXXX",
629
+ "field_name": "预算",
630
+ "type": 2,
631
+ "ui_type": "Currency",
632
+ "property": {
633
+ "currency_code": "CNY",
634
+ "formatter": "0,000.00"
635
+ }
636
+ }
637
+ ```
638
+
639
+ **currency_code 可选值**:
640
+ - `"CNY"`: 人民币 (¥)
641
+ - `"USD"`: 美元 ($)
642
+ - `"EUR"`: 欧元 (€)
643
+ - `"JPY"`: 日元 (¥)
644
+
645
+ **写入值**: `5000.50`(普通数字)
646
+
647
+ ---
648
+
649
+ ### 评分字段 (type=2, ui_type="Rating")
650
+
651
+ ```json
652
+ {
653
+ "action": "create",
654
+ "app_token": "S404b...",
655
+ "table_id": "tblXXXXXXXX",
656
+ "field_name": "客户满意度",
657
+ "type": 2,
658
+ "ui_type": "Rating",
659
+ "property": {
660
+ "min": 1,
661
+ "max": 5,
662
+ "rating": {
663
+ "symbol": "star"
664
+ }
665
+ }
666
+ }
667
+ ```
668
+
669
+ **symbol 可选值**:
670
+ - `"star"`: ⭐ 星星
671
+ - `"heart"`: ❤️ 爱心
672
+ - `"fire"`: 🔥 火焰
673
+ - `"thumbsup"`: 👍 赞
674
+
675
+ **写入值**: `4`(整数)
676
+
677
+ ---
678
+
679
+ ## 场景 7: 处理附件字段
680
+
681
+ ### 步骤 1: 上传附件到多维表格
682
+
683
+ **工具**: `feishu_drive_media`(上传素材接口)
684
+
685
+ ```json
686
+ {
687
+ "action": "upload",
688
+ "file_path": "/path/to/file.pdf",
689
+ "parent_type": "bitable_image",
690
+ "parent_node": "S404b..." // app_token
691
+ }
692
+ ```
693
+
694
+ **返回**:
695
+ ```json
696
+ {
697
+ "file_token": "DRiFbwaKsoZaLax4WKZbEGCccoe"
698
+ }
699
+ ```
700
+
701
+ ---
702
+
703
+ ### 步骤 2: 创建附件字段(可选)
704
+
705
+ ```json
706
+ {
707
+ "action": "create",
708
+ "app_token": "S404b...",
709
+ "table_id": "tblXXXXXXXX",
710
+ "field_name": "合同文件",
711
+ "type": 17
712
+ }
713
+ ```
714
+
715
+ ---
716
+
717
+ ### 步骤 3: 写入附件记录
718
+
719
+ ```json
720
+ {
721
+ "action": "create",
722
+ "app_token": "S404b...",
723
+ "table_id": "tblXXXXXXXX",
724
+ "fields": {
725
+ "客户名称": "Bytedance",
726
+ "合同文件": [
727
+ {"file_token": "DRiFxxxxxxxxxxxxxxxxxxCccoe"},
728
+ {"file_token": "BZk3bxxxxxxxxxxxxxxxxeKqcLe"}
729
+ ]
730
+ }
731
+ }
732
+ ```
733
+
734
+ **限制**:
735
+ - 单个单元格附件数不超过 100
736
+ - 必须先上传到当前多维表格,不能用外部 file_token
737
+
738
+ ---
739
+
740
+ ## 场景 8: 双向关联字段
741
+
742
+ ### 步骤 1: 创建双向关联字段
743
+
744
+ **在"任务表"中创建关联到"项目表"的字段**:
745
+
746
+ ```json
747
+ {
748
+ "action": "create",
749
+ "app_token": "S404b...",
750
+ "table_id": "tbl_task",
751
+ "field_name": "所属项目",
752
+ "type": 21,
753
+ "property": {
754
+ "table_id": "tbl_project",
755
+ "back_field_name": "关联的任务",
756
+ "multiple": true
757
+ }
758
+ }
759
+ ```
760
+
761
+ **结果**:
762
+ - 在"任务表"中创建字段"所属项目"
763
+ - 在"项目表"中**自动创建**字段"关联的任务"
764
+
765
+ ---
766
+
767
+ ### 步骤 2: 写入关联记录
768
+
769
+ ```json
770
+ {
771
+ "action": "create",
772
+ "app_token": "S404b...",
773
+ "table_id": "tbl_task",
774
+ "fields": {
775
+ "任务名称": "开发新功能",
776
+ "所属项目": {
777
+ "link_record_ids": ["rec_project_001"]
778
+ }
779
+ }
780
+ }
781
+ ```
782
+
783
+ **级联更新**:
784
+ - 在"任务表"中设置"所属项目"为 `rec_project_001`
785
+ - "项目表"的 `rec_project_001` 记录的"关联的任务"字段会**自动添加**当前任务的 record_id
786
+
787
+ ---
788
+
789
+ ### 单向关联 (type=18)
790
+
791
+ **区别**: 只影响当前表,不会自动更新对方表
792
+
793
+ ```json
794
+ {
795
+ "action": "create",
796
+ "app_token": "S404b...",
797
+ "table_id": "tbl_task",
798
+ "field_name": "参考任务",
799
+ "type": 18,
800
+ "property": {
801
+ "table_id": "tbl_task", // 可以关联自己
802
+ "multiple": true
803
+ }
804
+ }
805
+ ```
806
+
807
+ ---
808
+
809
+ ## 🔗 参考链接
810
+
811
+ - [字段 Property 配置详解](field-properties.md)
812
+ - [记录值数据结构详解](record-values.md)
813
+ - [飞书开放平台 - 多维表格文档](https://open.feishu.cn/document/server-docs/docs/bitable-v1/bitable-overview)