@amaster.ai/pi-lark 0.1.4 → 0.1.6

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 (416) hide show
  1. package/package.json +3 -3
  2. package/skills/lark-approval/SKILL.md +99 -0
  3. package/skills/lark-approval/references/lark-approval-approvals-get.md +128 -0
  4. package/skills/lark-approval/references/lark-approval-approvals-search.md +103 -0
  5. package/skills/lark-approval/references/lark-approval-initiate.md +221 -0
  6. package/skills/lark-approval/references/lark-approval-instance-form-control-parameters.md +606 -0
  7. package/skills/lark-approval/references/lark-approval-instance-value-sourcing.md +108 -0
  8. package/skills/lark-approval/references/lark-approval-instances-cancel.md +78 -0
  9. package/skills/lark-approval/references/lark-approval-instances-cc.md +105 -0
  10. package/skills/lark-approval/references/lark-approval-instances-get.md +145 -0
  11. package/skills/lark-approval/references/lark-approval-instances-initiated.md +128 -0
  12. package/skills/lark-approval/references/lark-approval-tasks-add-sign.md +120 -0
  13. package/skills/lark-approval/references/lark-approval-tasks-approve.md +81 -0
  14. package/skills/lark-approval/references/lark-approval-tasks-query.md +85 -0
  15. package/skills/lark-approval/references/lark-approval-tasks-reject.md +73 -0
  16. package/skills/lark-approval/references/lark-approval-tasks-remind.md +82 -0
  17. package/skills/lark-approval/references/lark-approval-tasks-rollback.md +89 -0
  18. package/skills/lark-approval/references/lark-approval-tasks-transfer.md +91 -0
  19. package/skills/lark-apps/SKILL.md +110 -0
  20. package/skills/lark-apps/references/lark-apps-access-scope-get.md +28 -0
  21. package/skills/lark-apps/references/lark-apps-access-scope-set.md +40 -0
  22. package/skills/lark-apps/references/lark-apps-automation.md +164 -0
  23. package/skills/lark-apps/references/lark-apps-cloud-dev.md +120 -0
  24. package/skills/lark-apps/references/lark-apps-create.md +40 -0
  25. package/skills/lark-apps/references/lark-apps-db-execute.md +228 -0
  26. package/skills/lark-apps/references/lark-apps-db.md +162 -0
  27. package/skills/lark-apps/references/lark-apps-env-pull.md +37 -0
  28. package/skills/lark-apps/references/lark-apps-env.md +48 -0
  29. package/skills/lark-apps/references/lark-apps-file.md +96 -0
  30. package/skills/lark-apps/references/lark-apps-get.md +43 -0
  31. package/skills/lark-apps/references/lark-apps-git-credential.md +37 -0
  32. package/skills/lark-apps/references/lark-apps-html-publish.md +62 -0
  33. package/skills/lark-apps/references/lark-apps-init.md +36 -0
  34. package/skills/lark-apps/references/lark-apps-list.md +37 -0
  35. package/skills/lark-apps/references/lark-apps-local-dev.md +78 -0
  36. package/skills/lark-apps/references/lark-apps-observability.md +48 -0
  37. package/skills/lark-apps/references/lark-apps-openapi-key.md +79 -0
  38. package/skills/lark-apps/references/lark-apps-plugin-install.md +36 -0
  39. package/skills/lark-apps/references/lark-apps-plugin-list.md +23 -0
  40. package/skills/lark-apps/references/lark-apps-plugin-uninstall.md +25 -0
  41. package/skills/lark-apps/references/lark-apps-release-create.md +32 -0
  42. package/skills/lark-apps/references/lark-apps-release-get.md +28 -0
  43. package/skills/lark-apps/references/lark-apps-release-list.md +31 -0
  44. package/skills/lark-apps/references/lark-apps-role.md +133 -0
  45. package/skills/lark-apps/references/lark-apps-session-messages-list.md +53 -0
  46. package/skills/lark-apps/references/lark-apps-update.md +30 -0
  47. package/skills/lark-attendance/SKILL.md +57 -0
  48. package/skills/lark-base/SKILL.md +161 -0
  49. package/skills/lark-base/references/dashboard-block-data-config.md +376 -0
  50. package/skills/lark-base/references/formula-field-guide.md +737 -0
  51. package/skills/lark-base/references/lark-base-cell-value.md +158 -0
  52. package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +717 -0
  53. package/skills/lark-base/references/lark-base-dashboard.md +247 -0
  54. package/skills/lark-base/references/lark-base-data-analysis-sop.md +210 -0
  55. package/skills/lark-base/references/lark-base-data-query-guide.md +61 -0
  56. package/skills/lark-base/references/lark-base-data-query.md +454 -0
  57. package/skills/lark-base/references/lark-base-field-create.md +105 -0
  58. package/skills/lark-base/references/lark-base-field-json.md +527 -0
  59. package/skills/lark-base/references/lark-base-field-update.md +173 -0
  60. package/skills/lark-base/references/lark-base-form-detail.md +71 -0
  61. package/skills/lark-base/references/lark-base-form-questions-create.md +118 -0
  62. package/skills/lark-base/references/lark-base-form-questions-update.md +92 -0
  63. package/skills/lark-base/references/lark-base-form-submit.md +170 -0
  64. package/skills/lark-base/references/lark-base-record-batch-create.md +57 -0
  65. package/skills/lark-base/references/lark-base-record-batch-update.md +52 -0
  66. package/skills/lark-base/references/lark-base-record-history-list.md +43 -0
  67. package/skills/lark-base/references/lark-base-record-upsert.md +63 -0
  68. package/skills/lark-base/references/lark-base-role-guide.md +65 -0
  69. package/skills/lark-base/references/lark-base-view-set-filter.md +191 -0
  70. package/skills/lark-base/references/lark-base-workflow-guide.md +830 -0
  71. package/skills/lark-base/references/lark-base-workflow-schema.md +1071 -0
  72. package/skills/lark-base/references/lookup-field-guide.md +512 -0
  73. package/skills/lark-base/references/role-config.md +549 -0
  74. package/skills/lark-calendar/SKILL.md +198 -0
  75. package/skills/lark-calendar/references/lark-calendar-create.md +83 -0
  76. package/skills/lark-calendar/references/lark-calendar-meeting.md +40 -0
  77. package/skills/lark-calendar/references/lark-calendar-recurring.md +90 -0
  78. package/skills/lark-calendar/references/lark-calendar-room-find.md +109 -0
  79. package/skills/lark-calendar/references/lark-calendar-rsvp.md +38 -0
  80. package/skills/lark-calendar/references/lark-calendar-schedule-clear-time.md +59 -0
  81. package/skills/lark-calendar/references/lark-calendar-schedule-fuzzy-time.md +88 -0
  82. package/skills/lark-calendar/references/lark-calendar-schedule-meeting.md +122 -0
  83. package/skills/lark-calendar/references/lark-calendar-suggestion.md +121 -0
  84. package/skills/lark-calendar/references/lark-calendar-update.md +100 -0
  85. package/skills/lark-contact/SKILL.md +55 -0
  86. package/skills/lark-contact/references/lark-contact-get-user.md +19 -0
  87. package/skills/lark-contact/references/lark-contact-search-user.md +123 -0
  88. package/skills/lark-doc/SKILL.md +84 -0
  89. package/skills/lark-doc/references/lark-doc-create.md +80 -0
  90. package/skills/lark-doc/references/lark-doc-fetch.md +140 -0
  91. package/skills/lark-doc/references/lark-doc-history.md +107 -0
  92. package/skills/lark-doc/references/lark-doc-md.md +76 -0
  93. package/skills/lark-doc/references/lark-doc-media-download.md +50 -0
  94. package/skills/lark-doc/references/lark-doc-media-insert.md +114 -0
  95. package/skills/lark-doc/references/lark-doc-media-preview.md +41 -0
  96. package/skills/lark-doc/references/lark-doc-mindnote.md +128 -0
  97. package/skills/lark-doc/references/lark-doc-resource-cover.md +70 -0
  98. package/skills/lark-doc/references/lark-doc-update.md +260 -0
  99. package/skills/lark-doc/references/lark-doc-whiteboard.md +158 -0
  100. package/skills/lark-doc/references/lark-doc-word-stat.md +93 -0
  101. package/skills/lark-doc/references/lark-doc-xml-extended-blocks.md +35 -0
  102. package/skills/lark-doc/references/lark-doc-xml.md +182 -0
  103. package/skills/lark-doc/references/style/lark-doc-create-workflow.md +47 -0
  104. package/skills/lark-doc/references/style/lark-doc-style.md +68 -0
  105. package/skills/lark-doc/references/style/lark-doc-update-workflow.md +48 -0
  106. package/skills/lark-doc/scripts/doc_word_stat.py +1243 -0
  107. package/skills/lark-drive/SKILL.md +232 -0
  108. package/skills/lark-drive/references/lark-drive-add-comment.md +193 -0
  109. package/skills/lark-drive/references/lark-drive-apply-permission.md +77 -0
  110. package/skills/lark-drive/references/lark-drive-comment-location.md +205 -0
  111. package/skills/lark-drive/references/lark-drive-comments-guide.md +80 -0
  112. package/skills/lark-drive/references/lark-drive-cover.md +79 -0
  113. package/skills/lark-drive/references/lark-drive-create-folder.md +73 -0
  114. package/skills/lark-drive/references/lark-drive-create-shortcut.md +103 -0
  115. package/skills/lark-drive/references/lark-drive-delete.md +103 -0
  116. package/skills/lark-drive/references/lark-drive-download.md +31 -0
  117. package/skills/lark-drive/references/lark-drive-export-download.md +50 -0
  118. package/skills/lark-drive/references/lark-drive-export.md +174 -0
  119. package/skills/lark-drive/references/lark-drive-files-list.md +183 -0
  120. package/skills/lark-drive/references/lark-drive-import.md +178 -0
  121. package/skills/lark-drive/references/lark-drive-inspect.md +52 -0
  122. package/skills/lark-drive/references/lark-drive-list-comments.md +125 -0
  123. package/skills/lark-drive/references/lark-drive-member-add.md +66 -0
  124. package/skills/lark-drive/references/lark-drive-move.md +122 -0
  125. package/skills/lark-drive/references/lark-drive-permission-guide.md +53 -0
  126. package/skills/lark-drive/references/lark-drive-preview.md +87 -0
  127. package/skills/lark-drive/references/lark-drive-pull.md +137 -0
  128. package/skills/lark-drive/references/lark-drive-push.md +189 -0
  129. package/skills/lark-drive/references/lark-drive-reactions.md +113 -0
  130. package/skills/lark-drive/references/lark-drive-search.md +273 -0
  131. package/skills/lark-drive/references/lark-drive-secure-label.md +52 -0
  132. package/skills/lark-drive/references/lark-drive-status.md +135 -0
  133. package/skills/lark-drive/references/lark-drive-task-result.md +355 -0
  134. package/skills/lark-drive/references/lark-drive-upload.md +101 -0
  135. package/skills/lark-drive/references/lark-drive-version-delete.md +38 -0
  136. package/skills/lark-drive/references/lark-drive-version-get.md +71 -0
  137. package/skills/lark-drive/references/lark-drive-version-history.md +73 -0
  138. package/skills/lark-drive/references/lark-drive-version-revert.md +35 -0
  139. package/skills/lark-drive/references/lark-drive-workflow-knowledge-organize-analysis.md +249 -0
  140. package/skills/lark-drive/references/lark-drive-workflow-knowledge-organize-discovery.md +253 -0
  141. package/skills/lark-drive/references/lark-drive-workflow-knowledge-organize-execution.md +200 -0
  142. package/skills/lark-drive/references/lark-drive-workflow-knowledge-organize-planning.md +336 -0
  143. package/skills/lark-drive/references/lark-drive-workflow-knowledge-organize-rollback.md +308 -0
  144. package/skills/lark-drive/references/lark-drive-workflow-knowledge-organize.md +232 -0
  145. package/skills/lark-drive/references/lark-drive-workflow-permission-governance-commands.md +168 -0
  146. package/skills/lark-drive/references/lark-drive-workflow-permission-governance-outputs.md +424 -0
  147. package/skills/lark-drive/references/lark-drive-workflow-permission-governance.md +207 -0
  148. package/skills/lark-drive/references/lark-drive-workflow.md +131 -0
  149. package/skills/lark-event/SKILL.md +155 -0
  150. package/skills/lark-event/references/lark-event-approval.md +170 -0
  151. package/skills/lark-event/references/lark-event-im.md +87 -0
  152. package/skills/lark-event/references/lark-event-minutes.md +54 -0
  153. package/skills/lark-event/references/lark-event-task.md +78 -0
  154. package/skills/lark-event/references/lark-event-vc.md +106 -0
  155. package/skills/lark-event/references/lark-event-whiteboard.md +67 -0
  156. package/skills/lark-im/SKILL.md +249 -0
  157. package/skills/lark-im/references/card/card-2.0-schema.md +107 -0
  158. package/skills/lark-im/references/card/components/button.md +63 -0
  159. package/skills/lark-im/references/card/components/chart.md +57 -0
  160. package/skills/lark-im/references/card/components/checker.md +38 -0
  161. package/skills/lark-im/references/card/components/collapsible_panel.md +46 -0
  162. package/skills/lark-im/references/card/components/column_set.md +53 -0
  163. package/skills/lark-im/references/card/components/date_picker.md +34 -0
  164. package/skills/lark-im/references/card/components/div.md +36 -0
  165. package/skills/lark-im/references/card/components/form.md +51 -0
  166. package/skills/lark-im/references/card/components/header.md +34 -0
  167. package/skills/lark-im/references/card/components/hr.md +17 -0
  168. package/skills/lark-im/references/card/components/img.md +34 -0
  169. package/skills/lark-im/references/card/components/img_combination.md +30 -0
  170. package/skills/lark-im/references/card/components/input.md +43 -0
  171. package/skills/lark-im/references/card/components/interactive_container.md +46 -0
  172. package/skills/lark-im/references/card/components/markdown.md +56 -0
  173. package/skills/lark-im/references/card/components/multi_select_person.md +40 -0
  174. package/skills/lark-im/references/card/components/multi_select_static.md +40 -0
  175. package/skills/lark-im/references/card/components/overflow.md +36 -0
  176. package/skills/lark-im/references/card/components/person.md +30 -0
  177. package/skills/lark-im/references/card/components/person_list.md +31 -0
  178. package/skills/lark-im/references/card/components/picker_datetime.md +34 -0
  179. package/skills/lark-im/references/card/components/picker_time.md +34 -0
  180. package/skills/lark-im/references/card/components/recycling_container.md +35 -0
  181. package/skills/lark-im/references/card/components/select_img.md +42 -0
  182. package/skills/lark-im/references/card/components/select_person.md +39 -0
  183. package/skills/lark-im/references/card/components/select_static.md +43 -0
  184. package/skills/lark-im/references/card/components/table.md +53 -0
  185. package/skills/lark-im/references/card/lark-im-card-create.md +180 -0
  186. package/skills/lark-im/references/card/lark-im-card-style.md +281 -0
  187. package/skills/lark-im/references/card/resource/colors.md +34 -0
  188. package/skills/lark-im/references/card/resource/icons.md +38 -0
  189. package/skills/lark-im/references/lark-im-card-action-reply.md +175 -0
  190. package/skills/lark-im/references/lark-im-chat-create.md +162 -0
  191. package/skills/lark-im/references/lark-im-chat-identity.md +55 -0
  192. package/skills/lark-im/references/lark-im-chat-list.md +166 -0
  193. package/skills/lark-im/references/lark-im-chat-members-list.md +83 -0
  194. package/skills/lark-im/references/lark-im-chat-messages-list.md +157 -0
  195. package/skills/lark-im/references/lark-im-chat-search.md +142 -0
  196. package/skills/lark-im/references/lark-im-chat-update.md +84 -0
  197. package/skills/lark-im/references/lark-im-feed-group-list-item.md +68 -0
  198. package/skills/lark-im/references/lark-im-feed-group-list.md +65 -0
  199. package/skills/lark-im/references/lark-im-feed-group-query-item.md +44 -0
  200. package/skills/lark-im/references/lark-im-feed-groups.md +452 -0
  201. package/skills/lark-im/references/lark-im-feed-shortcut-create.md +97 -0
  202. package/skills/lark-im/references/lark-im-feed-shortcut-list.md +103 -0
  203. package/skills/lark-im/references/lark-im-feed-shortcut-remove.md +48 -0
  204. package/skills/lark-im/references/lark-im-flag-cancel.md +67 -0
  205. package/skills/lark-im/references/lark-im-flag-create.md +67 -0
  206. package/skills/lark-im/references/lark-im-flag-list.md +100 -0
  207. package/skills/lark-im/references/lark-im-message-enrichment.md +54 -0
  208. package/skills/lark-im/references/lark-im-messages-mget.md +99 -0
  209. package/skills/lark-im/references/lark-im-messages-reply.md +277 -0
  210. package/skills/lark-im/references/lark-im-messages-resources-download.md +94 -0
  211. package/skills/lark-im/references/lark-im-messages-search.md +234 -0
  212. package/skills/lark-im/references/lark-im-messages-send.md +279 -0
  213. package/skills/lark-im/references/lark-im-reactions.md +299 -0
  214. package/skills/lark-im/references/lark-im-threads-messages-list.md +115 -0
  215. package/skills/lark-mail/SKILL.md +290 -0
  216. package/skills/lark-mail/assets/templates/job-application--resume.html +33 -0
  217. package/skills/lark-mail/assets/templates/newsletter--weekly-brief.html +50 -0
  218. package/skills/lark-mail/assets/templates/research--market-report.html +256 -0
  219. package/skills/lark-mail/assets/templates/weekly--personal-report.html +43 -0
  220. package/skills/lark-mail/assets/templates/weekly--team-report.html +9 -0
  221. package/skills/lark-mail/references/lark-mail-calendar-invite.md +36 -0
  222. package/skills/lark-mail/references/lark-mail-decline-receipt.md +115 -0
  223. package/skills/lark-mail/references/lark-mail-draft-create.md +127 -0
  224. package/skills/lark-mail/references/lark-mail-draft-edit.md +404 -0
  225. package/skills/lark-mail/references/lark-mail-forward.md +239 -0
  226. package/skills/lark-mail/references/lark-mail-html.md +333 -0
  227. package/skills/lark-mail/references/lark-mail-lint-html.md +243 -0
  228. package/skills/lark-mail/references/lark-mail-message-modify.md +48 -0
  229. package/skills/lark-mail/references/lark-mail-message-trash.md +41 -0
  230. package/skills/lark-mail/references/lark-mail-message.md +233 -0
  231. package/skills/lark-mail/references/lark-mail-messages.md +108 -0
  232. package/skills/lark-mail/references/lark-mail-recall.md +66 -0
  233. package/skills/lark-mail/references/lark-mail-recipient-search.md +59 -0
  234. package/skills/lark-mail/references/lark-mail-reply-all.md +213 -0
  235. package/skills/lark-mail/references/lark-mail-reply.md +249 -0
  236. package/skills/lark-mail/references/lark-mail-rules.md +31 -0
  237. package/skills/lark-mail/references/lark-mail-send-as.md +44 -0
  238. package/skills/lark-mail/references/lark-mail-send-receipt.md +120 -0
  239. package/skills/lark-mail/references/lark-mail-send-status.md +46 -0
  240. package/skills/lark-mail/references/lark-mail-send.md +222 -0
  241. package/skills/lark-mail/references/lark-mail-share-to-chat.md +87 -0
  242. package/skills/lark-mail/references/lark-mail-signature.md +98 -0
  243. package/skills/lark-mail/references/lark-mail-template-create.md +129 -0
  244. package/skills/lark-mail/references/lark-mail-template-update.md +150 -0
  245. package/skills/lark-mail/references/lark-mail-template.md +54 -0
  246. package/skills/lark-mail/references/lark-mail-thread.md +111 -0
  247. package/skills/lark-mail/references/lark-mail-triage.md +131 -0
  248. package/skills/lark-mail/references/lark-mail-watch.md +94 -0
  249. package/skills/lark-markdown/SKILL.md +70 -0
  250. package/skills/lark-markdown/references/lark-markdown-create.md +114 -0
  251. package/skills/lark-markdown/references/lark-markdown-diff.md +156 -0
  252. package/skills/lark-markdown/references/lark-markdown-fetch.md +79 -0
  253. package/skills/lark-markdown/references/lark-markdown-overwrite.md +85 -0
  254. package/skills/lark-markdown/references/lark-markdown-patch.md +160 -0
  255. package/skills/lark-minutes/SKILL.md +207 -0
  256. package/skills/lark-minutes/references/lark-minutes-detail.md +62 -0
  257. package/skills/lark-minutes/references/lark-minutes-download.md +135 -0
  258. package/skills/lark-minutes/references/lark-minutes-search.md +202 -0
  259. package/skills/lark-minutes/references/lark-minutes-speaker-replace.md +107 -0
  260. package/skills/lark-minutes/references/lark-minutes-summary.md +120 -0
  261. package/skills/lark-minutes/references/lark-minutes-todo.md +136 -0
  262. package/skills/lark-minutes/references/lark-minutes-update.md +39 -0
  263. package/skills/lark-minutes/references/lark-minutes-upload.md +104 -0
  264. package/skills/lark-note/SKILL.md +94 -0
  265. package/skills/lark-note/references/lark-note-detail.md +26 -0
  266. package/skills/lark-note/references/lark-note-transcript.md +23 -0
  267. package/skills/lark-okr/SKILL.md +122 -0
  268. package/skills/lark-okr/references/lark-okr-alignments.md +180 -0
  269. package/skills/lark-okr/references/lark-okr-batch-create.md +106 -0
  270. package/skills/lark-okr/references/lark-okr-contentblock.md +427 -0
  271. package/skills/lark-okr/references/lark-okr-cycle-detail.md +91 -0
  272. package/skills/lark-okr/references/lark-okr-cycle-list.md +93 -0
  273. package/skills/lark-okr/references/lark-okr-entities.md +329 -0
  274. package/skills/lark-okr/references/lark-okr-image-upload.md +116 -0
  275. package/skills/lark-okr/references/lark-okr-indicator-update.md +80 -0
  276. package/skills/lark-okr/references/lark-okr-indicators.md +223 -0
  277. package/skills/lark-okr/references/lark-okr-patch.md +104 -0
  278. package/skills/lark-okr/references/lark-okr-progress-create.md +85 -0
  279. package/skills/lark-okr/references/lark-okr-progress-delete.md +47 -0
  280. package/skills/lark-okr/references/lark-okr-progress-get.md +93 -0
  281. package/skills/lark-okr/references/lark-okr-progress-list.md +80 -0
  282. package/skills/lark-okr/references/lark-okr-progress-update.md +85 -0
  283. package/skills/lark-okr/references/lark-okr-reorder.md +81 -0
  284. package/skills/lark-okr/references/lark-okr-weight.md +96 -0
  285. package/skills/lark-openapi-explorer/SKILL.md +153 -0
  286. package/skills/lark-shared/SKILL.md +211 -0
  287. package/skills/lark-shared/references/lark-wiki-token-routing.md +42 -0
  288. package/skills/lark-sheets/SKILL.md +234 -0
  289. package/skills/lark-sheets/references/lark-sheets-batch-update.md +200 -0
  290. package/skills/lark-sheets/references/lark-sheets-changeset.md +105 -0
  291. package/skills/lark-sheets/references/lark-sheets-chart.md +332 -0
  292. package/skills/lark-sheets/references/lark-sheets-conditional-format.md +181 -0
  293. package/skills/lark-sheets/references/lark-sheets-filter-view.md +137 -0
  294. package/skills/lark-sheets/references/lark-sheets-filter.md +130 -0
  295. package/skills/lark-sheets/references/lark-sheets-float-image.md +159 -0
  296. package/skills/lark-sheets/references/lark-sheets-formula-translation.md +276 -0
  297. package/skills/lark-sheets/references/lark-sheets-formula-verify.md +77 -0
  298. package/skills/lark-sheets/references/lark-sheets-history.md +93 -0
  299. package/skills/lark-sheets/references/lark-sheets-pivot-table.md +171 -0
  300. package/skills/lark-sheets/references/lark-sheets-range-operations.md +297 -0
  301. package/skills/lark-sheets/references/lark-sheets-read-data.md +235 -0
  302. package/skills/lark-sheets/references/lark-sheets-search-replace.md +111 -0
  303. package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +212 -0
  304. package/skills/lark-sheets/references/lark-sheets-sparkline.md +149 -0
  305. package/skills/lark-sheets/references/lark-sheets-visual-standards.md +205 -0
  306. package/skills/lark-sheets/references/lark-sheets-workbook.md +420 -0
  307. package/skills/lark-sheets/references/lark-sheets-write-cells.md +575 -0
  308. package/skills/lark-sheets/scripts/sheets_df.py +32 -0
  309. package/skills/lark-skill-maker/SKILL.md +85 -0
  310. package/skills/lark-slides/SKILL.md +285 -0
  311. package/skills/lark-slides/references/asset-planning.md +135 -0
  312. package/skills/lark-slides/references/examples.md +91 -0
  313. package/skills/lark-slides/references/iconpark-index.json +41901 -0
  314. package/skills/lark-slides/references/iconpark.md +46 -0
  315. package/skills/lark-slides/references/lark-slides-create.md +156 -0
  316. package/skills/lark-slides/references/lark-slides-edit-workflows.md +144 -0
  317. package/skills/lark-slides/references/lark-slides-media-upload.md +127 -0
  318. package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +89 -0
  319. package/skills/lark-slides/references/lark-slides-replace-pages.md +95 -0
  320. package/skills/lark-slides/references/lark-slides-replace-slide.md +240 -0
  321. package/skills/lark-slides/references/lark-slides-screenshot.md +97 -0
  322. package/skills/lark-slides/references/lark-slides-whiteboard.md +331 -0
  323. package/skills/lark-slides/references/lark-slides-xml-get.md +100 -0
  324. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +125 -0
  325. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +110 -0
  326. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +189 -0
  327. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +99 -0
  328. package/skills/lark-slides/references/planning-layer.md +246 -0
  329. package/skills/lark-slides/references/slide-templates.md +201 -0
  330. package/skills/lark-slides/references/slides_chart_demo.xml +1 -0
  331. package/skills/lark-slides/references/slides_demo.xml +226 -0
  332. package/skills/lark-slides/references/slides_xml_schema_definition.xml +3054 -0
  333. package/skills/lark-slides/references/troubleshooting.md +45 -0
  334. package/skills/lark-slides/references/validation-checklist.md +119 -0
  335. package/skills/lark-slides/references/visual-planning.md +255 -0
  336. package/skills/lark-slides/references/xml-format-guide.md +433 -0
  337. package/skills/lark-slides/references/xml-schema-quick-ref.md +249 -0
  338. package/skills/lark-slides/scripts/iconpark_tool.py +362 -0
  339. package/skills/lark-slides/scripts/iconpark_tool_test.py +177 -0
  340. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +1220 -0
  341. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +1170 -0
  342. package/skills/lark-task/SKILL.md +168 -0
  343. package/skills/lark-task/references/lark-task-assign.md +38 -0
  344. package/skills/lark-task/references/lark-task-comment.md +28 -0
  345. package/skills/lark-task/references/lark-task-complete.md +27 -0
  346. package/skills/lark-task/references/lark-task-create.md +70 -0
  347. package/skills/lark-task/references/lark-task-followers.md +35 -0
  348. package/skills/lark-task/references/lark-task-get-my-tasks.md +61 -0
  349. package/skills/lark-task/references/lark-task-get-related-tasks.md +53 -0
  350. package/skills/lark-task/references/lark-task-reminder.md +36 -0
  351. package/skills/lark-task/references/lark-task-reopen.md +27 -0
  352. package/skills/lark-task/references/lark-task-search.md +41 -0
  353. package/skills/lark-task/references/lark-task-set-ancestor.md +32 -0
  354. package/skills/lark-task/references/lark-task-tasklist-create.md +35 -0
  355. package/skills/lark-task/references/lark-task-tasklist-members.md +36 -0
  356. package/skills/lark-task/references/lark-task-tasklist-search.md +38 -0
  357. package/skills/lark-task/references/lark-task-tasklist-task-add.md +38 -0
  358. package/skills/lark-task/references/lark-task-update.md +37 -0
  359. package/skills/lark-task/references/lark-task-upload-attachment.md +59 -0
  360. package/skills/lark-vc/SKILL.md +205 -0
  361. package/skills/lark-vc/references/lark-vc-detail.md +44 -0
  362. package/skills/lark-vc/references/lark-vc-recording.md +152 -0
  363. package/skills/lark-vc/references/lark-vc-search.md +163 -0
  364. package/skills/lark-vc/references/vc-domain-boundaries.md +196 -0
  365. package/skills/lark-vc-agent/SKILL.md +201 -0
  366. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-events.md +315 -0
  367. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-join.md +141 -0
  368. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-leave.md +105 -0
  369. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-list-active.md +91 -0
  370. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-message-send.md +134 -0
  371. package/skills/lark-whiteboard/SKILL.md +47 -0
  372. package/skills/lark-whiteboard/elements/connectors.md +102 -0
  373. package/skills/lark-whiteboard/elements/content.md +40 -0
  374. package/skills/lark-whiteboard/elements/image.md +80 -0
  375. package/skills/lark-whiteboard/elements/layout.md +374 -0
  376. package/skills/lark-whiteboard/elements/schema.md +357 -0
  377. package/skills/lark-whiteboard/elements/style.md +318 -0
  378. package/skills/lark-whiteboard/elements/typography.md +73 -0
  379. package/skills/lark-whiteboard/references/lark-whiteboard-query.md +60 -0
  380. package/skills/lark-whiteboard/references/lark-whiteboard-update.md +122 -0
  381. package/skills/lark-whiteboard/references/lark-whiteboard-workflow.md +97 -0
  382. package/skills/lark-whiteboard/routes/dsl.md +107 -0
  383. package/skills/lark-whiteboard/routes/mermaid.md +27 -0
  384. package/skills/lark-whiteboard/routes/svg-edit.md +85 -0
  385. package/skills/lark-whiteboard/routes/svg.md +54 -0
  386. package/skills/lark-whiteboard/scenes/architecture.md +433 -0
  387. package/skills/lark-whiteboard/scenes/bar-chart.md +187 -0
  388. package/skills/lark-whiteboard/scenes/comparison.md +135 -0
  389. package/skills/lark-whiteboard/scenes/fishbone.md +238 -0
  390. package/skills/lark-whiteboard/scenes/flowchart.md +185 -0
  391. package/skills/lark-whiteboard/scenes/flywheel.md +195 -0
  392. package/skills/lark-whiteboard/scenes/funnel.md +101 -0
  393. package/skills/lark-whiteboard/scenes/line-chart.md +214 -0
  394. package/skills/lark-whiteboard/scenes/mermaid.md +130 -0
  395. package/skills/lark-whiteboard/scenes/milestone.md +139 -0
  396. package/skills/lark-whiteboard/scenes/organization.md +173 -0
  397. package/skills/lark-whiteboard/scenes/photo-showcase.md +126 -0
  398. package/skills/lark-whiteboard/scenes/pyramid.md +99 -0
  399. package/skills/lark-whiteboard/scenes/swimlane.md +371 -0
  400. package/skills/lark-whiteboard/scenes/treemap.md +216 -0
  401. package/skills/lark-wiki/SKILL.md +114 -0
  402. package/skills/lark-wiki/references/lark-wiki-delete-space.md +205 -0
  403. package/skills/lark-wiki/references/lark-wiki-member-add.md +67 -0
  404. package/skills/lark-wiki/references/lark-wiki-member-list.md +76 -0
  405. package/skills/lark-wiki/references/lark-wiki-member-remove.md +61 -0
  406. package/skills/lark-wiki/references/lark-wiki-move-to-drive.md +122 -0
  407. package/skills/lark-wiki/references/lark-wiki-move.md +185 -0
  408. package/skills/lark-wiki/references/lark-wiki-node-copy.md +72 -0
  409. package/skills/lark-wiki/references/lark-wiki-node-create.md +127 -0
  410. package/skills/lark-wiki/references/lark-wiki-node-delete.md +62 -0
  411. package/skills/lark-wiki/references/lark-wiki-node-get.md +57 -0
  412. package/skills/lark-wiki/references/lark-wiki-node-list.md +95 -0
  413. package/skills/lark-wiki/references/lark-wiki-space-create.md +46 -0
  414. package/skills/lark-wiki/references/lark-wiki-space-list.md +68 -0
  415. package/skills/lark-workflow-meeting-summary/SKILL.md +122 -0
  416. package/skills/lark-workflow-standup-report/SKILL.md +122 -0
@@ -0,0 +1,130 @@
1
+ # Lark Sheet Filter
2
+
3
+ ## 真对象硬约束 + 数量校验
4
+
5
+ 1. **真对象**:当用户要求"筛选 / 只看 / 仅保留 X"时,**必须**通过 `+filter-{create|update|delete}` 创建真实的筛选器对象。**禁止**用"删除不符合条件的行" / "新建子表只放符合条件的行" / 用 `+cells-set` 覆盖原表来代替——这些做法会让原数据丢失或不可恢复。
6
+ 2. **筛选数量必校**:执行筛选后**必须**回读,断言 `len(visible_rows) == expected_count`。`expected_count` 来自先用本地脚本在源数据上独立复现该筛选条件得到的结果数。两者不一致时禁止交付,需排查筛选条件 / 数据列类型问题。
7
+ 3. **混合文本列禁止字面比较**:筛选 key 是公式文本(如 `1000+200=1200`)或带单位的混合文本时,先在辅助列里抽出纯数值再筛选;不能直接用文本比较。
8
+
9
+ ## 使用场景
10
+
11
+ 读写筛选器对象。本 reference 覆盖 4 个 shortcut:
12
+
13
+ | 操作需求 | 使用工具 | 说明 |
14
+ |---------|---------|------|
15
+ | 查看已有筛选器 | `+filter-list` | 获取筛选器的范围、规则和条件配置 |
16
+ | 创建/更新/删除筛选器 | `+filter-{create|update|delete}` | 对筛选器执行写入操作 |
17
+
18
+ 典型工作流:先读取现有筛选器了解配置 → 执行创建/更新/删除 → **必须再次读取验证结果**。
19
+
20
+ **只读场景例外**:用户只是想知道哪些数据满足条件、并不要求修改表格展示时,可以走 `lark-sheets-read-data` 读后文本回答,不必创建筛选器。
21
+
22
+ **常见配置错误(必须注意)**:
23
+ - **筛选范围必须覆盖表头行**:筛选器的 range 必须从表头行开始(如 `A1:F100`),不能只包含数据行。缺少表头会导致筛选条件无法正确匹配列
24
+ - **更新已有筛选器前先读取**:如果子表上已存在筛选器,直接创建会报错或覆盖原有配置。应先用 `+filter-list` 查看是否存在筛选器,存在时使用 update 而非 create
25
+ - **筛选条件的列索引要精确**:筛选条件中的列标识必须与实际数据列精确对应,不要凭猜测填写
26
+ - **”调整筛选逻辑”要先读旧配置**:用户说”调整筛选”时,先读取现有筛选器的完整配置,理解当前规则后再修改,不要从零创建
27
+ - **创建后必须验证**:调用 `+filter-list` 确认筛选器配置正确且生效
28
+ - **筛选不支持正则表达式**:飞书表格筛选器不支持正则表达式,传入正则会当成普通文本处理。
29
+
30
+ ## Shortcuts
31
+
32
+ | Shortcut | Risk | 分组 |
33
+ | --- | --- | --- |
34
+ | `+filter-list` | read | 对象 |
35
+ | `+filter-create` | write | 对象 |
36
+ | `+filter-update` | write | 对象 |
37
+ | `+filter-delete` | high-risk-write | 对象 |
38
+
39
+ ## Flags
40
+
41
+ ### `+filter-list`
42
+
43
+ _公共四件套 · 系统:`--dry-run`_
44
+
45
+ _仅含公共 / 系统 flag。_
46
+
47
+ ### `+filter-create`
48
+
49
+ _公共四件套 · 系统:`--dry-run`_
50
+
51
+ | Flag | Type | 必填 | 说明 |
52
+ | --- | --- | --- | --- |
53
+ | `--range` | string | required | 筛选范围(A1 表示法,含表头行,如 `A1:F1000`);不要重复写入 `--properties` 中的 range 字段 |
54
+ | `--properties` | string + File + Stdin(复合 JSON) | optional | 筛选规则 JSON:`rules`(列级筛选规则数组)+ `filtered_columns?`(激活列索引提示)。`--properties` 整体可选——传它时 `rules` 不可为空;不传则只在 `--range` 上建立空筛选器(无列条件)。`range` 是独立 flag(不要再放此 JSON 里) |
55
+
56
+ ### `+filter-update`
57
+
58
+ _公共四件套 · 系统:`--dry-run`_
59
+
60
+ | Flag | Type | 必填 | 说明 |
61
+ | --- | --- | --- | --- |
62
+ | `--properties` | string + File + Stdin(复合 JSON) | required | 筛选规则 JSON,含 `rules` 和 `filtered_columns?`;update 是整组覆盖式(传空 `rules: []` 清空)。`range` 已拎为独立 flag |
63
+ | `--range` | string | required | 筛选作用的单元格范围(A1 表示法,如 `A1:F1000`);优先级高于 `--properties` 中同名字段 |
64
+
65
+ ### `+filter-delete`
66
+
67
+ _公共四件套 · 系统:`--yes`、`--dry-run`_
68
+
69
+ _仅含公共 / 系统 flag。_
70
+
71
+ ## Schemas
72
+
73
+ > 复合 JSON flag 字段速查(只列顶层 + 一层嵌套)。深层结构看下方 `## Examples`,或用 `--print-schema` 读完整 JSON Schema(用法见 SKILL.md「公共 flag 速查」与「Agent 使用提示」)。
74
+
75
+ ### `+filter-create` `--properties` / `+filter-update` `--properties`
76
+
77
+ _创建/更新的筛选器属性_
78
+
79
+ **顶层字段**:
80
+ - `range` (string) — 筛选对象作用的单元格范围(A1 表示法) — ⚠️ 已拎为独立 flag `--range`,请勿在此 JSON 内重复填写(同名以独立 flag 为准)
81
+ - `rules` (array<object>) — 列级筛选规则列表,每一项对应一个具体列的筛选条件 each: { column_index: string, conditions: array<oneOf>, filtered_rows?: array<number> }
82
+ - `filtered_columns` (array<string>?) — 可选
83
+
84
+ ## Examples
85
+
86
+ 公共四件套:所有 shortcut 顶部排列 `--url` / `--spreadsheet-token` / `--sheet-id` / `--sheet-name`(XOR)。`filter_id` 等同于 `sheet_id`(每个工作表至多一个筛选器)。
87
+
88
+ ### `+filter-list`
89
+
90
+ ```bash
91
+ # 查看当前 sheet 的筛选器配置(filter_id 等于 sheet_id)
92
+ lark-cli sheets +filter-list --url "..." --sheet-id "$SID"
93
+ ```
94
+
95
+ ### `+filter-create`
96
+
97
+ `--range` 是独立 flag(含表头行);`rules` 走 `--properties`:
98
+
99
+ ```bash
100
+ lark-cli sheets +filter-create --url "..." --sheet-id "$SID" \
101
+ --range "A1:F1000" \
102
+ --properties '{"rules":[{"column_index":"B","conditions":[{"type":"multiValue","compare_type":"equal","values":["北京","上海"]}]}]}'
103
+ ```
104
+
105
+ **`conditions[].type` × `compare_type` 取值**(`type` 决定可用的 `compare_type`;两者均必填):
106
+
107
+ | `type` | 可用 `compare_type` | `values` |
108
+ |---|---|---|
109
+ | `text` | `contains` / `doesNotContain` / `beginsWith` / `doesNotBeginWith` / `endsWith` / `doesNotEndWith` / `equals` / `notEquals` | 字符串数组 |
110
+ | `number` | `equal` / `notEqual` / `greaterThan` / `greaterThanOrEqual` / `lessThan` / `lessThanOrEqual` / `between` / `notBetween` | 数值(或数值字符串)数组;`between` / `notBetween` 传两个边界 |
111
+ | `multiValue` | `equal` / `notEqual` | 字符串数组(精确匹配其中任一值) |
112
+ | `color` | `backgroundColor` / `foregroundColor` | 不传 `values`(按单元格颜色筛选) |
113
+
114
+ > ⚠️ `text` 用 `equals` / `notEquals`(**带 s**),`number` / `multiValue` 用 `equal` / `notEqual`(**不带 s**)——别混。完整 schema 跑 `+filter-create --print-schema --flag-name properties`。
115
+
116
+ ### `+filter-update`
117
+
118
+ > ⚠️ update 是覆盖式:`--properties` 中传新 `rules` 会替换旧组。如只想加一条,要带上已有的全部条件再追加。必填 `--range`。
119
+
120
+ ### `+filter-delete`
121
+
122
+ ```bash
123
+ lark-cli sheets +filter-delete --url "..." --sheet-id "$SID" --yes
124
+ ```
125
+
126
+ ### Validate / DryRun / Execute 约束
127
+
128
+ - `Validate`:XOR 公共四件套;`+filter-create` 校验 `--range` 至少 2 行(表头 + 至少 1 行数据);`+filter-update` 必须先 `+filter-list` 确认目标存在;`+filter-delete` 强制 `--yes` 或 `--dry-run`。
129
+ - `DryRun`:输出"将要 POST/PATCH/DELETE 的 filter 请求模板"。
130
+ - `Execute`:写后不自动回读;如需确认,自行调用 `+filter-list` 查看当前筛选条件 + 已过滤行数。
@@ -0,0 +1,159 @@
1
+ # Lark Sheet Float Image
2
+
3
+ > **选浮动图还是单元格图?只看一条**:这张图是不是**属于某条记录、要随那行一起排序 / 筛选 / 增删**?
4
+ > - **是 → 单元格图片**(不在本 reference):嵌进单元格、随行走。用 `+cells-set-image`(或 `+cells-set` 的 `rich_text` + `type: "embed-image"`,见 lark-sheets-write-cells)。典型:凭证 / 证件照 / 商品图 / 头像 / 二维码 / 每行配图;话里带「对应 / 每行 / 每条 / 这列」等绑定词即属此类。
5
+ > - **否 → 浮动图片**(本 reference):自由摆放、不绑数据的装饰 / 标识(logo / 水印 / 封面大图 / banner)。
6
+ > - ⚠️ 别凭"浮动图位置尺寸更好控制 / 更熟"就选它——那是按操作便利选,不是按场景选;用浮动图承载"对应某记录"的图会在增删行 / 排序后错位。
7
+
8
+ ## 真对象硬约束
9
+
10
+ 当用户要求"插入图片 / 添加 logo / 放一张图"时,**必须**通过 `+float-image-{create|update|delete}`(浮动图片)或 `+cells-set-image` / `+cells-set` 的 `embed-image`(单元格图片)创建真实的图片对象。**禁止**只在文本回复中给出图片链接 / 描述图片内容代替插入。判断标准:交付后 `+float-image-list` 或单元格 `rich_text` 必须能读到该图片对象。
11
+
12
+ ## 使用场景
13
+
14
+ 读写**浮动图片**对象(悬浮在单元格上方的图片,不属于单元格内容)。本 reference 覆盖 4 个 shortcut:
15
+
16
+ | 操作需求 | 使用工具 | 说明 |
17
+ |---------|---------|------|
18
+ | 查看已有浮动图片 | `+float-image-list` | 获取浮动图片的位置、大小和层级配置 |
19
+ | 创建/更新/删除浮动图片 | `+float-image-{create|update|delete}` | 对浮动图片执行写入操作 |
20
+
21
+ 典型工作流:先读取现有浮动图片了解配置 → 执行创建/更新/删除 → **必须再次读取验证结果**。
22
+
23
+ **常见配置错误(必须注意)**:
24
+ - **单元格图片 vs 浮动图片选择错误(最易选错)**:图与某条记录一一对应、要随行排序 / 筛选 / 增删时,应走 `+cells-set-image`(见顶部判别),用浮动图会错位。
25
+ - **图片位置参数要精确**:锚点单元格的行列索引和偏移量决定了图片位置,设置不当会导致图片遮挡数据
26
+ - **创建后必须验证**:调用 `+float-image-list` 确认图片位置和大小正确
27
+
28
+ 图片来源有三种方式,`+float-image-create` 上三者 **XOR、必给其一**(`--image` / `--image-token` / `--image-uri`):
29
+
30
+ - **`--image <本地路径>`(首选,最省事)**:直接给本地图片文件路径(PNG/JPEG/GIF/BMP/HEIC 等)。CLI 会自动把它以 `parent_type=sheet_image` 上传,拿到 file_token 后创建浮动图,**不用你手动上传 / 取 token**。路径规则同其它本地文件 flag:必须是当前工作目录内的相对路径(绝对路径会被 Validate 拒,`--dry-run` 也会拦)。
31
+ - `--image-token`:复用**已存在**的图片 file_token。常见来源:① `+float-image-list` 返回的 `image_token`(适合"换皮不换位置"复用同一张图);② `+cells-set-image` 成功返回里的 `file_token`(它也是 `sheet_image` 上传句柄)。适合"同一张图复用到多处",省去重复上传。
32
+ - `--image-uri`:图片 URI(上传链路返回的句柄),**非**表内对象 reference_id;由系统自动转 file_token。
33
+
34
+ > ⚠️ **`--image` 仅 `+float-image-create` 支持**。`+float-image-update` 换图仍只接受 `--image-token` / `--image-uri`,而且**图片源是 update 唯一可省的部分**——三者全不传则保留原图。但 `--image-name` / `--position-{row,col}` / `--size-{width,height}` 在 update 时和 create 一样**必填**(`+float-image-update` 强制要求这套核心字段,且 `+float-image-list` 不回传 `image_name` 供 CLI 回填)。要在 update 里换一张本地新图,先用 `+cells-set-image` 上传到任意临时单元格、从返回取 `file_token`,再把它传给 update 的 `--image-token`;用完清除该临时单元格,避免残留多余图片。
35
+
36
+ ## Shortcuts
37
+
38
+ | Shortcut | Risk | 分组 |
39
+ | --- | --- | --- |
40
+ | `+float-image-list` | read | 对象 |
41
+ | `+float-image-create` | write | 对象 |
42
+ | `+float-image-update` | write | 对象 |
43
+ | `+float-image-delete` | high-risk-write | 对象 |
44
+
45
+ ## Flags
46
+
47
+ ### `+float-image-list`
48
+
49
+ _公共四件套 · 系统:`--dry-run`_
50
+
51
+ | Flag | Type | 必填 | 说明 |
52
+ | --- | --- | --- | --- |
53
+ | `--float-image-id` | string | optional | 按 id 过滤;省略时列工作表全部 |
54
+
55
+ ### `+float-image-create`
56
+
57
+ _公共四件套 · 系统:`--dry-run`_
58
+
59
+ | Flag | Type | 必填 | 说明 |
60
+ | --- | --- | --- | --- |
61
+ | `--image-name` | string | required | 图片名称,含扩展名(如 `logo.png`) |
62
+ | `--image-token` | string | xor | 图片 file_token(与 `--image-uri` 二选一)。常见来源:`+float-image-list` 返回的 `image_token` |
63
+ | `--image-uri` | string | xor | 图片 URI(上传链路返回的句柄,非表内对象 reference_id;与 `--image-token` 二选一);系统自动转换为 file_token |
64
+ | `--position-row` | int | required | 图片左上角所在行(0-based) |
65
+ | `--position-col` | string | required | 图片左上角所在列(列字母,如 `A` / `B`) |
66
+ | `--size-width` | int | required | 图片宽度(像素) |
67
+ | `--size-height` | int | required | 图片高度(像素) |
68
+ | `--offset-row` | int | optional | 在 `--position-row` 基础上的行内偏移(像素) |
69
+ | `--offset-col` | int | optional | 在 `--position-col` 基础上的列内偏移(像素) |
70
+ | `--z-index` | int | optional | 图片 Z 轴层级,控制重叠顺序 |
71
+ | `--image` | string | xor | 本地图片路径(PNG/JPEG 等);CLI 自动上传为 sheet_image 并用返回的 file_token,省去手动拿 token(与 --image-token / --image-uri 三选一) |
72
+
73
+ ### `+float-image-update`
74
+
75
+ _公共四件套 · 系统:`--dry-run`_
76
+
77
+ | Flag | Type | 必填 | 说明 |
78
+ | --- | --- | --- | --- |
79
+ | `--float-image-id` | string | required | 目标图片 id |
80
+ | `--image-name` | string | required | 图片名称,含扩展名(如 `logo.png`) |
81
+ | `--image-token` | string | optional | 可选图片 file_token;与 `--image-uri` 互斥,二者均省略时保留原图。常见来源:`+float-image-list` 返回的 `image_token` |
82
+ | `--image-uri` | string | optional | 可选图片 URI(上传链路返回的句柄,非表内对象 reference_id);与 `--image-token` 互斥,二者均省略时保留原图;系统自动转换为 file_token |
83
+ | `--position-row` | int | required | 图片左上角所在行(0-based) |
84
+ | `--position-col` | string | required | 图片左上角所在列(列字母,如 `A` / `B`) |
85
+ | `--size-width` | int | required | 图片宽度(像素) |
86
+ | `--size-height` | int | required | 图片高度(像素) |
87
+ | `--offset-row` | int | optional | 在 `--position-row` 基础上的行内偏移(像素) |
88
+ | `--offset-col` | int | optional | 在 `--position-col` 基础上的列内偏移(像素) |
89
+ | `--z-index` | int | optional | 图片 Z 轴层级,控制重叠顺序 |
90
+
91
+ ### `+float-image-delete`
92
+
93
+ _公共四件套 · 系统:`--yes`、`--dry-run`_
94
+
95
+ | Flag | Type | 必填 | 说明 |
96
+ | --- | --- | --- | --- |
97
+ | `--float-image-id` | string | required | 目标图片 id |
98
+
99
+ ## Examples
100
+
101
+ 公共四件套:所有 shortcut 顶部排列 `--url` / `--spreadsheet-token` / `--sheet-id` / `--sheet-name`(XOR)。浮动图片是 sheet 级对象——和单元格内嵌图片不同(后者走 `+cells-set`)。
102
+
103
+ ### `+float-image-list`
104
+
105
+ ```bash
106
+ lark-cli sheets +float-image-list --url "..." --sheet-id "$SID"
107
+ ```
108
+
109
+ ### `+float-image-create`
110
+
111
+ 所有字段拍平为独立 flag:图片来源 `--image` / `--image-token` / `--image-uri`(三选一 XOR)/ `--image-name` / `--position-{row,col}` / `--size-{width,height}` / `--offset-{row,col}` / `--z-index`。
112
+
113
+ ```bash
114
+ # 首选:直接给本地图片路径,CLI 自动上传(无需手动拿 token)
115
+ # 注意:--image-name 是 required(即使路径 basename 已经是 logo.png 也要显式传)
116
+ lark-cli sheets +float-image-create --url "..." --sheet-id "$SID" \
117
+ --image ./logo.png --image-name "logo.png" \
118
+ --position-row 2 --position-col B --size-width 300 --size-height 200 --z-index 1
119
+
120
+ # 用已有 file_token(从 +float-image-list 的 image_token 或 +cells-set-image 返回的 file_token)
121
+ lark-cli sheets +float-image-create --url "..." --sheet-id "$SID" \
122
+ --image-name "logo.png" --image-token "$TOKEN" \
123
+ --position-row 0 --position-col A --size-width 200 --size-height 150
124
+
125
+ # 用 image URI(上传链路返回的句柄,非表内对象 reference_id;与 --image-token 二选一)
126
+ lark-cli sheets +float-image-create --url "..." --sheet-id "$SID" \
127
+ --image-name "logo.png" --image-uri "$IMAGE_URI" \
128
+ --position-row 2 --position-col B --size-width 300 --size-height 200 --z-index 1
129
+ ```
130
+
131
+ ### `+float-image-update`
132
+
133
+ > **update ≈ create,只有图片源可省**:`+float-image-update` 的 update 要求和 create 相同的核心字段——`--image-name`、`--position-{row,col}`、`--size-{width,height}` **全部必填**;唯一区别是**图片源(`--image-token` / `--image-uri`)可以全省**,省略即保留原图。这**不是**"只发改动字段"的 patch:缺任一核心字段会被拒绝(`+float-image-list` 不回传 `image_name`,CLI 无法替你回填)。
134
+ >
135
+ > 推荐流程:先 `+float-image-list --float-image-id <id>` 回读当前 position / size,再带上 `--image-name` 和完整的 position / size 调一次 `+float-image-update`。
136
+
137
+ ```bash
138
+ # 调整位置 + 尺寸,保留原图(不传图片源)
139
+ lark-cli sheets +float-image-update --url "..." --sheet-id "$SID" \
140
+ --float-image-id "$IMG_ID" --image-name "logo.png" \
141
+ --position-row 5 --position-col C --size-width 300 --size-height 200
142
+
143
+ # 换图:额外带 --image-token,核心字段同样要给全
144
+ lark-cli sheets +float-image-update --url "..." --sheet-id "$SID" \
145
+ --float-image-id "$IMG_ID" --image-name "new-logo.png" --image-token "$NEW_TOKEN" \
146
+ --position-row 5 --position-col C --size-width 300 --size-height 200
147
+ ```
148
+
149
+ ### `+float-image-delete`
150
+
151
+ ```bash
152
+ lark-cli sheets +float-image-delete --url "..." --sheet-id "$SID" --float-image-id "$IMG_ID" --yes
153
+ ```
154
+
155
+ ### Validate / DryRun / Execute 约束
156
+
157
+ - `Validate`:XOR 公共四件套;`+float-image-create` 要求 `--image` / `--image-token` / `--image-uri` **恰好给一个**,`--position-row/col` 与 `--size-width/height` 必填且为合法整数;传 `--image` 时还会校验路径安全(绝对路径 / 越出工作目录会被拒,`--dry-run` 同样拦)。`+float-image-update` 必须 `--float-image-id`,并和 create 一样必填 `--image-name` / `--position-{row,col}` / `--size-{width,height}`(缺任一核心字段本地直接报错,不会静默发 0);图片源 `--image-token` / `--image-uri` 可省(省略保留原图),给则二选一;`+float-image-delete` 强制 `--yes` 或 `--dry-run`。
158
+ - `DryRun`:写操作输出"将要 POST/PATCH/DELETE 的 float_image 请求模板";传 `--image` 时会多打印一步本地图片上传(`POST /open-apis/drive/v1/medias/upload_all`,`parent_type=sheet_image`)。
159
+ - `Execute`:写后不自动回读;如需确认,自行调用 `+float-image-list --float-image-id <id>` 比对新位置 / 尺寸。
@@ -0,0 +1,276 @@
1
+ # 飞书表格公式生成规则
2
+
3
+ > **本文定位**:飞书公式正确性的**唯一权威**——书写任何飞书公式、或把 Excel 公式迁移到飞书前,先读本文。涵盖公式书写约定(绝对引用、范围语法)、投影 vs spill、ARRAYFORMULA / 数组语义、高风险引用函数、日期差、不支持函数清单。
4
+ > **边界**:本文只讲"公式怎么写对";公式**怎么写入表格**(`+cells-set` / 模板单元格 + `--copy-to-range` / 容错回读)见 `lark-sheets-write-cells`。**公式写入完成后的强制收尾**见 `lark-sheets-formula-verify`:不要把"翻译对了"误当成"已经交付完成"。本文不含 shortcut,通用编辑准则见主 SKILL.md「飞书表格编辑准则」。
5
+
6
+ **核心原则:飞书不像 Excel 365 那样默认 spill(溢出展开)。飞书普通公式遇到区域时默认"投影"(只取当前行/列对应的单个值),必须显式使用 `ARRAYFORMULA` 或原生数组函数才能逐项展开。**
7
+
8
+ ## 公式书写约定(写任何公式都先满足)
9
+
10
+ - **绝对引用 `$`**:向下 / 向右填充前判断哪些引用要锁定——用户指定的固定 cell(`$C$3`)、要固定的数据范围(`$A$2:$B$5`)、锁列不锁行(`$A2`)、锁行不锁列(`B$1`)。填充前检查是否需固定汇率 / 税率 / 查找表 / 权重表,以及同列 / 同行公式结构是否一致。
11
+ - **公式字符串用飞书范围语法**:写 `H:H`、`A2:B5`,**禁止** `H2:H` / `2:2`。要在公式里引用整行,用显式范围(如 `$A2:$Z2`)替代禁用的 `2:2`。这与 CLI 工具参数(如 `--range` / `--copy-to-range`)的 A1 表示法写法不同:参数侧合法的 `D3:D`、`1:1`、`3:6` 在公式串里反而非法。**公式串 ≠ CLI 参数**,两套规则别互相照搬,混用会导致调用失败或公式报错。
12
+
13
+ ## 翻译后必做:代码复现校验
14
+
15
+ 公式语法翻译完之后,**必须**用本地脚本在源数据上独立复现一份"等价计算结果"再写入。流程:
16
+
17
+ 1. **挑 3-5 个代表性输入行**(首行 / 中段 / 末行 / 含空值 / 含异常格式各一)
18
+ 2. **用 Python 复现 Excel 原公式的语义**(不是飞书译文的语义,而是用户原本想要的结果)
19
+ 3. **写入飞书译文公式后回读这几行的实际值**
20
+ 4. **三方对照**:`Excel 原公式语义 == Python 复现 == 飞书译文回读值`,全部一致才交付;不一致先排查(数组语义?日期差?范围引用?)
21
+
22
+ **理由**:Excel→飞书的语法翻译很容易在 spill / 数组 / 日期差 / 范围引用上出现等价性偏差,仅靠语法转换通过不足以保证业务结果正确。
23
+
24
+ ## 落表后的默认交接
25
+
26
+ 本文解决的是"公式怎么写对",不是"写进表里后一定能零错误运行"。因此:
27
+
28
+ 1. 按本文完成公式改写后,用 `lark-sheets-write-cells` / `lark-sheets-batch-update` 把公式真实写入表格。
29
+ 2. 公式一旦落表,就默认进入 `lark-sheets-formula-verify` 的收尾阶段。
30
+ 3. 最终必须跑 `+formula-verify` 收敛到 `status='success'`;`errors_found` / `partial` 都不算完成。
31
+
32
+ ## 决策流程
33
+
34
+ 1. 最终结果是**标量**(单值)→ 通常不需要 `ARRAYFORMULA`
35
+ 2. 最终结果是**一维或二维数组**:
36
+ - 公式中**包含**飞书原生数组函数(如 FILTER、XLOOKUP、MAP 等)→ 无需加 `ARRAYFORMULA`,数组语义会自动传播到整个公式,包括原生数组函数外层接的标量运算(如 `+1`、`*100`)
37
+ - 公式中**不包含**任何原生数组函数,但在对区域做标量计算 → 加 `ARRAYFORMULA(<整个表达式>)`
38
+ 3. Excel 依赖 `ROW(range)` 逐项驱动 `SUBTOTAL/INDIRECT/OFFSET` → 改用 `MAP(ARRAYFORMULA(ROW(...)), LAMBDA(r, ...))`
39
+ 4. 内层 `INDEX/INDIRECT/OFFSET` 返回范围,外层 `SUMIF/COUNTIF/SUMIFS` 还要继续吃这些范围 → 改用 `MAP(..., LAMBDA(...))` 或 `REDUCE(..., LAMBDA(...))`
40
+ 5. 公式意图是"对多个区域分别计算再汇总"(例如用 INDIRECT/OFFSET 对每行生成一个范围,再对所有范围聚合)→ 飞书不能直接返回"区域的列表",必须明确降维:用 `VSTACK` 垂直合并、`HSTACK` 水平合并、`TOCOL/TOROW` 展平,或 `REDUCE` 归约成标量
41
+ 6. 算日期差 → 不要写 `DAY(end-start)`,用 `DAYS`、`DATEDIF` 或直接 `end-start`
42
+
43
+ ## 飞书的投影行为(不是默认 spill)
44
+
45
+ 飞书普通公式对引用区域默认"投影"而不是"spill":
46
+
47
+ - 单列区域 → 按当前公式所在行取值
48
+ - 单行区域 → 按当前公式所在列取值
49
+ - 二维区域 → 只有当前公式位置能映射到该区域时才取值,否则报错
50
+ - 数组常量 `{...}` 或函数返回矩阵,在普通标量上下文里通常只取左上角
51
+
52
+ 因此:
53
+ - `=A1:A2` 在飞书普通公式里不会 spill,只会投影到当前行
54
+ - `=ABS(A2:B2)` 不会得到一整行,要写 `=ARRAYFORMULA(ABS(A2:B2))`
55
+ - `=TRUNC({1.1111,2.222},{1,2})` 要得到一整行,写 `=ARRAYFORMULA(TRUNC({1.1111,2.222},{1,2}))`
56
+
57
+ ## ARRAYFORMULA 使用规则
58
+
59
+ **前提:以下规则适用于公式中没有任何原生数组函数的情况。** 若公式中已有原生数组函数(如 FILTER、XLOOKUP、MAP 等),数组语义会自动传播到整个公式的求值过程,后续标量运算无需额外包 `ARRAYFORMULA`(见下一节)。
60
+
61
+ 需要加 `ARRAYFORMULA` 的典型场景(公式中无原生数组函数时):
62
+
63
+ - 算术运算:`+ - * / ^ %`
64
+ - 比较运算:`= <> > >= < <=`
65
+ - 标量数学函数:`ABS ROUND INT TRUNC MOD LOG LN SQRT SIN COS TAN ...`
66
+ - 文本函数:`LEN LEFT RIGHT MID UPPER LOWER TRIM TEXT VALUE ...`
67
+ - 日期函数:`YEAR MONTH DAY DATE TIME EDATE EOMONTH ...`
68
+ - 条件函数:`IF IFS IFERROR IFNA NOT ISNUMBER ISTEXT ISBLANK ...`
69
+ - 引用函数(高风险):`INDEX OFFSET COLUMN ROW MATCH`
70
+
71
+ ### 公式中有原生数组函数时,整个公式已进入数组模式
72
+
73
+ 飞书的数组语义会在整个公式求值过程中累积传播:一旦某个原生数组函数运行,后续所有运算符和函数也会自动逐元素处理,无论它们出现在哪一层。
74
+
75
+ 因此,以下写法**无需**额外包 `ARRAYFORMULA`:
76
+
77
+ - `=FILTER(A2:A10,B2:B10="x")+1` ✓
78
+ - `=XLOOKUP(E2:E10,A2:A10,B2:B10)*100` ✓
79
+ - `=ABS(FILTER(A2:A10,B2:B10>0))` ✓
80
+ - `=MAP(A2:A10,LAMBDA(x,x*2))-1` ✓
81
+
82
+ 对比:**没有原生数组函数**时必须加:
83
+
84
+ - `=A2:A100*B2:B100` → `=ARRAYFORMULA(A2:A100*B2:B100)` ✓
85
+ - `=IF(A2:A100>0,B2:B100,"")` → `=ARRAYFORMULA(IF(A2:A100>0,B2:B100,""))` ✓
86
+
87
+ ## 飞书原生数组函数清单
88
+
89
+ 以下函数按数组语义工作,通常**不需要额外包 `ARRAYFORMULA`**:
90
+
91
+ `ARRAYFORMULA` `ARRAY_CONSTRAIN` `BYCOL` `BYROW` `CELL` `CHOOSECOLS` `CHOOSEROWS` `DROP` `EXPAND` `FILTER` `FLATTEN` `FREQUENCY` `GROWTH` `HSTACK` `IMPORTDATA` `IMPORTFEED` `IMPORTHTML` `IMPORTRANGE` `IMPORTXML` `LINEST` `LOGEST` `LOOKUP` `MAKEARRAY` `MAP` `MINVERSE` `MMULT` `MUNIT` `QUERY` `RANDARRAY` `REDUCE` `REGEXEXTRACT` `SCAN` `SEQUENCE` `SORT` `SORTBY` `SORTN` `SPLIT` `SUMPRODUCT` `SWITCH` `TAKE` `TEXTSPLIT` `TOCOL` `TOROW` `TRANSPOSE` `TREND` `UNIQUE` `VSTACK` `WRAPCOLS` `WRAPROWS` `XLOOKUP`
92
+
93
+ > **注意:`SWITCH` 在飞书里被当作原生数组函数处理,这与 Excel 行为不同,不需要额外包 `ARRAYFORMULA`。**
94
+
95
+ ## IMPORTRANGE 跨工作簿引用限制
96
+
97
+ 用 `IMPORTRANGE` 跨电子表格引用数据时有两条硬上限:
98
+
99
+ - **嵌套最多 5 层**:被引用的表里若又用 `IMPORTRANGE` 继续引下一张表,整条引用链最多 5 层。
100
+ - **每个工作表最多 100 个 `IMPORTRANGE` 引用**。
101
+
102
+ 超限会让引用失效或报错。设计大量跨表汇总前先估算引用数,必要时先把数据落地到本表再计算。
103
+
104
+ ## INDEX / OFFSET / COLUMN / ROW / MATCH 是高风险函数
105
+
106
+ 这组函数容易让人误以为会自动把多值铺开,但在飞书里不能这样假设。
107
+
108
+ **高风险信号:**
109
+
110
+ - 行号 / 列号 / 偏移量本身是数组
111
+ - 结果本来应该是一行或一块二维区域
112
+ - 外层还有算术、比较、`IF` 等继续处理它
113
+
114
+ 更稳的写法:
115
+
116
+ - `=ARRAYFORMULA(INDEX(...))`
117
+ - `=ARRAYFORMULA(OFFSET(...))`
118
+ - `=ARRAYFORMULA(COLUMN(...))`
119
+ - `=ARRAYFORMULA(ROW(...))`
120
+
121
+ **例外:** 如果返回值只是立刻交给聚合函数消费,不需要额外包:
122
+
123
+ - `=SUM(INDEX(A1:B2,0,1))` ✓
124
+
125
+ ## Excel 隐式逐项求值,飞书里要显式写 MAP
126
+
127
+ **典型特征:**
128
+
129
+ - 外层是 `SUMPRODUCT`、`SUM` 等聚合
130
+ - 内层用了 `SUBTOTAL`、`INDIRECT`、`OFFSET` 等更偏"单值/单引用"的函数
131
+ - Excel 会把中间结果逐项带进去算
132
+ - 飞书里直接照抄,往往不能得到同样的逐项语义
133
+
134
+ 同类本质也包括:`INDEX/INDIRECT/OFFSET` 先返回范围,外层再把这些范围交给 `SUMIF`、`COUNTIF`、`AVERAGEIF`、`SUMIFS` 等范围感知函数 —— 飞书里这些外层函数不会自动二次展开内层范围。
135
+
136
+ 这时不要只会补 `ARRAYFORMULA`,要显式写"遍历"。最常用模板:
137
+
138
+ ```excel
139
+ =SUMPRODUCT(
140
+ MAP(
141
+ ARRAYFORMULA(ROW(目标范围)),
142
+ LAMBDA(r, 单行计算逻辑)
143
+ )
144
+ )
145
+ ```
146
+
147
+ 同类场景也优先考虑 `MAP`:
148
+
149
+ - `INDIRECT("A"&ROW(...))`
150
+ - `OFFSET(...,ROW(...)-ROW(...),...)`
151
+ - `SUBTOTAL(...)`
152
+ - `SUMIF(内层返回范围, ...)`
153
+ - `COUNTIF(内层返回范围, ...)`
154
+ - `SUMIFS(内层返回范围, ...)`
155
+ - 任何"希望对每一行 / 每一列各算一次"的模式
156
+
157
+ ## 多层范围结果与三维以上结果
158
+
159
+ 飞书公式结果只能是二维区域,不能是"数组的数组"。
160
+
161
+ ### 多层范围不能自动二次展开
162
+
163
+ 内层 `INDEX/INDIRECT/OFFSET` 返回的是二维范围,外层还想继续对这些范围做范围计算时,不要假设飞书会"再展开一层"。改用:
164
+
165
+ - `MAP(..., LAMBDA(...))` 显式逐项算
166
+ - `REDUCE(..., LAMBDA(...))` 显式累加/归约
167
+
168
+ ### 真正的三维或更高维结果不能直接返回
169
+
170
+ 典型触发场景:想把多个不同区域或不同条件的结果合并展示,例如:
171
+ - 对 A 列、B 列、C 列分别做 FILTER,想把三列结果并排展示
172
+ - 对多个月份分别生成数据行,想把所有月份上下堆叠展示
173
+
174
+ 飞书无法直接返回"多个区域的集合",必须先决定降维方式:
175
+
176
+ - 上下堆叠:`=VSTACK(slice1, slice2, slice3)`
177
+ - 左右拼接:`=HSTACK(slice1, slice2, slice3)`
178
+ - 压成单列:`=TOCOL(...)`
179
+ - 压成单行:`=TOROW(...)`
180
+ - 只保留聚合值:`=REDUCE(slice1, {slice2,slice3}, LAMBDA(acc,x,acc+x))`
181
+
182
+ 不要替用户"偷定"第三维展示方式;如果用户没有明确说明怎么展示,至少先把结果改写成可见的二维形状。
183
+
184
+ ## 不能机械照抄的 Excel 语法
185
+
186
+ ### `@` 隐式交叉
187
+
188
+ Excel:`=@A1:A10`(强制单值,取当前行对应的值)
189
+
190
+ 飞书没有 `@` 运算符。飞书普通公式对引用区域默认就有投影语义,去掉 `@` 即可:
191
+
192
+ - Excel: `=@A1:A10`
193
+ - 飞书: `=A1:A10`
194
+
195
+ ### `#` spill range
196
+
197
+ Excel:`=A1#`(引用 A1 公式溢出的整片区域)
198
+
199
+ 飞书没有此语法,迁移方式:
200
+
201
+ - spill 区域已知 → 改成明确范围
202
+ - spill 区域未知 → 回到源公式重写,或用 `TAKE` / `DROP` / `ARRAY_CONSTRAIN`
203
+
204
+ ### 结构化引用
205
+
206
+ Excel:`=SUM(Table1[Amount])`
207
+
208
+ 飞书不支持结构化引用,改成显式 A1 区域:`=SUM(A2:A100)`
209
+
210
+ ### 老式 CSE 花括号
211
+
212
+ Excel:`{=A1:A10*B1:B10}`(Ctrl+Shift+Enter 输入)
213
+
214
+ 飞书改为:`=ARRAYFORMULA(A1:A10*B1:B10)`
215
+
216
+ ## 日期序列与日期差
217
+
218
+ 飞书日期序列:`0 = 1899-12-30`,`1 = 1899-12-31`,没有 Excel 的 1900 年闰年兼容问题。
219
+
220
+ **错误写法(不要用):**
221
+
222
+ - `=DAY(B2-A2)` ✗ — 差值会被当成日期序列号再拆字段
223
+ - `=MONTH(B2-A2)` ✗
224
+ - `=YEAR(B2-A2)` ✗
225
+
226
+ **正确写法:**
227
+
228
+ - 天数差:`=DAYS(B2,A2)` 或 `=DATEDIF(A2,B2,"D")` 或 `=B2-A2`
229
+ - 月份差:`=DATEDIF(A2,B2,"M")`
230
+ - 年份差:`=DATEDIF(A2,B2,"Y")`
231
+ - 工作日差:`=NETWORKDAYS(A2,B2)`
232
+
233
+ ## 飞书不支持的函数
234
+
235
+ > 本段是"飞书不支持函数"的**唯一权威清单**。以下函数在飞书里不存在或被禁用,禁止主动使用;用户明确要求时应拒绝并提供替代方案:
236
+
237
+ - `STOCKHISTORY` — 实时股票数据,飞书无等价函数,需手动导入数据
238
+ - `WEBSERVICE` — 外部 HTTP 请求,飞书无等价函数
239
+ - CUBE 系列(`CUBEVALUE`、`CUBEMEMBER`、`CUBESET`、`CUBERANK` 等)— OLAP cube 函数,飞书不支持
240
+ - `GOOGLEFINANCE`、`GOOGLETRANSLATE` 等 Google 特有函数 — 无等价函数
241
+ - `FORECAST.ETS` 系列(`FORECAST.ETS`、`FORECAST.ETS.STAT` 等)— 飞书不支持
242
+ - `INFO`、`RTD` — 系统信息 / 实时数据函数,飞书不支持
243
+ - `PIVOT` — 用 `+pivot-{create|update|delete}` 透视表对象替代
244
+ - `AMORDEGRC`、`PHONETIC`、`DETECTLANGUAGE` — 飞书不支持
245
+ - `LET`、命名自定义函数(名称管理器里定义的 LAMBDA)、独立调用的 `LAMBDA`(如 `=LAMBDA(x,x+1)(5)`)— 会报 `#NAME?`;改用嵌套 IF / 辅助列。**例外**:`LAMBDA` 作为 `MAP` / `REDUCE` / `BYROW` / `BYCOL` / `SCAN` / `MAKEARRAY` 的内联参数时**支持**(见上方「飞书原生数组函数清单」)
246
+
247
+ ## 代表性改写示例
248
+
249
+ - 基础逐项计算
250
+ - Excel: `=A2:A100*B2:B100`
251
+ - 飞书: `=ARRAYFORMULA(A2:A100*B2:B100)`
252
+ - 条件判断
253
+ - Excel: `=IF(A2:A100>0,B2:B100,"")`
254
+ - 飞书: `=ARRAYFORMULA(IF(A2:A100>0,B2:B100,""))`
255
+ - 原生数组函数(无需改动)
256
+ - Excel: `=FILTER(A2:C100,B2:B100="East")`
257
+ - 飞书: `=FILTER(A2:C100,B2:B100="East")`
258
+ - 原生数组函数 + 标量运算(无需改动,数组语义自动传播)
259
+ - Excel: `=XLOOKUP(E2:E10,A2:A10,B2:B10)*100`
260
+ - 飞书: `=XLOOKUP(E2:E10,A2:A10,B2:B10)*100`
261
+ - 高风险引用函数
262
+ - Excel: `=INDEX(A1:D2,{2,1},0)`
263
+ - 飞书: `=ARRAYFORMULA(INDEX(A1:D2,{2,1},0))`
264
+ - 日期差
265
+ - 错误: `=DAY(B2-A2)`
266
+ - 推荐: `=DAYS(B2,A2)` 或 `=DATEDIF(A2,B2,"D")` 或 `=B2-A2`
267
+ - Excel 隐式逐项求值
268
+ - Excel: `=SUMPRODUCT(SUBTOTAL(103,INDIRECT("E"&ROW($E$16:$E$387))))`
269
+ - 飞书: `=SUMPRODUCT(MAP(ARRAYFORMULA(ROW($E$16:$E$387)),LAMBDA(row,SUBTOTAL(103,INDIRECT("E"&row)))))`
270
+ - 多层范围 / 二次展开
271
+ - 错误思路: `=SUMIF(INDIRECT("E"&ROW($E$16:$E$387)),">0")`
272
+ - 飞书: `=MAP(ARRAYFORMULA(ROW($E$16:$E$387)),LAMBDA(r,SUMIF(INDIRECT("E"&r),">0")))`
273
+ - 三维降二维(保留所有层)
274
+ - 飞书: `=VSTACK(slice1,slice2,slice3)` 或 `=HSTACK(slice1,slice2,slice3)`
275
+ - 三维降二维(只保留聚合值)
276
+ - 飞书: `=REDUCE(slice1,{slice2,slice3},LAMBDA(acc,x,acc+x))`
@@ -0,0 +1,77 @@
1
+ # Lark Sheet Formula Verify(+formula-verify)
2
+
3
+ > **本文定位**:飞书表格"公式写入后是否真的零错误"的自检入口,也是所有写公式任务的**强制收尾步骤**。公式的书写规则与 Excel→飞书迁移的语义规则一律以 `lark-sheets-formula-translation` 为唯一权威,本文不重复;本文聚焦"写完了之后怎么用一次调用确认 zero-error"。
4
+ >
5
+ > **边界**:本文不讲公式怎么写(去 `lark-sheets-formula-translation`),也不讲公式怎么写入表格(去 `lark-sheets-write-cells` / `lark-sheets-batch-update`)。本文只讲一件事:**只要任务里发生了公式落表、批量填充公式、`--copy-to-range` 扩展公式、导入含公式 workbook,收尾就必须用 `+formula-verify` 自检到 zero-error 才能交付**。
6
+
7
+ ## 为什么需要自检
8
+
9
+ 飞书在线表格已经实时算好结果,但"算出来"和"算对了"是两件事。常见缺口:
10
+
11
+ - 公式编译失败 → 单元格落成文本(写入类 shortcut 返回的 `formula_errors[]` 是**编译失败**信号)。
12
+ - 公式编译成功但**运行时错误**:`#REF!` / `#DIV/0!` / `#VALUE!` / `#NAME?` / `#NULL!` / `#NUM!` / `#N/A`——这一类只看 `formula_errors[]` 看不到,必须扫单元格值。
13
+
14
+ `+formula-verify` 把两路信号合并成一份统一 JSON:一次调用聚合全表错误清单 + 编译失败清单 + 每类错误的定位与样本,AI 一眼就能定位修复,链路也能据 `status` 强制收敛到 `success`。
15
+
16
+ ## 调用契约
17
+
18
+ 最小调用形态:
19
+
20
+ | 入参 | 含义 |
21
+ |---|---|
22
+ | `--url` / `--spreadsheet-token` | 表格定位(XOR 二选一,必填) |
23
+ | `--sheet-id` / `--sheet-name` | 限定子表(mutually exclusive;省略则扫全部可见子表) |
24
+ | `--range` | 限定 A1 范围;省略则用各 sheet 的 `current_region` |
25
+ | `--max-locations` | 每类错误样本上限,默认 20 |
26
+ | `--exit-on-error` | `status='errors_found'` 时返回非 0 退出码(CI 网关用) |
27
+
28
+ 返回核心字段:
29
+
30
+ - `status` ∈ `success` / `errors_found` / `partial`——**唯一可机读的健康度判据**。
31
+ - `total_errors` / `total_formulas` / `scanned_cells`——本次扫描规模指标。
32
+ - `has_more`——为 true 表示扫描被内部上限截断(详见后文「截断与续读」),未覆盖完整范围。
33
+ - `error_summary[<错误类型>]`——每类错误的 `count` / `locations[]` / `samples[].{address,formula,depends_on}`。
34
+ - `compile_errors[]`——合并最近一次写入留下的编译失败清单,与运行时错误并存时同时出现。
35
+ - `warning_message`——仅在 `has_more=true` 时出现,告知调用方需要缩小 `--range` / 拆 `--sheet-id` 续读。
36
+
37
+ ## 写入收尾收敛规则
38
+
39
+ 任何批量公式 / 含公式列写入完成后调用 `+formula-verify` 直到 `status='success'` 才能交付。不要等用户显式说"校验一下公式"才想到这里;**只要任务动作包含写公式,这一步默认就该做**。触发场景:
40
+
41
+ - `+cells-set` / `+csv-put`
42
+ - `+cells-set --copy-to-range` / 模板单元格向整列或整块扩展公式
43
+ - `+workbook-import`
44
+ - `+batch-update` 中含写入子操作
45
+ - `+table-put`(任意列含公式时)
46
+ - `+workbook-import`(导入的 xlsx 含公式时)
47
+
48
+ 收敛规则:
49
+
50
+ 1. `status='success'` → 通过;可以把链路标完成。
51
+ 2. `status='partial'` → 扫描被内部上限截断。先缩小 `--range` 或拆 `--sheet-id` 续扫,**不允许**把 `partial` 当作 `success`。
52
+ 3. `status='errors_found'` 且 `compile_errors[]` 非空 → **先解决编译失败**:根据 `compile_errors[].reason` 修正公式语法(飞书函数名 / 范围语法 / 引用样式),用 `+cells-set` 重写后再调一次 `+formula-verify`。
53
+ 4. `status='errors_found'` 且只剩运行时错误 → 按 `error_summary` 的 `samples[].formula` + `depends_on` 排查根因(零除?空值参与运算?引用越界?日期差写法?数组语义?),修复后重新自检。
54
+ 5. 同一处错误连续修复 3 次仍未通过 → 改用 `IFERROR` 包裹兜底,或退回纯值写入;不要在 `errors_found` 状态下扩展 `+cells-set --copy-to-range`、追加批量写入。
55
+
56
+ 注意:
57
+
58
+ - 在 `status='errors_found'` 的状态下调用 `+cells-set --copy-to-range` 继续扩展会把错误复制放大。
59
+ - "编译失败但运行时无报错"不是 zero-error(编译失败的单元格此刻是文本不是公式,源数据一变就再也算不出值)。
60
+ - 跳过自检直接交付、靠肉眼读首末 5 行确认是不可靠的——表中段、隐藏行、合并区里的错误这样根本看不到。
61
+
62
+ ## 截断与续读
63
+
64
+ 后端有一个内部硬上限对总扫描单元格数做截断(不暴露给调用方),超过后立即返回 `has_more=true` + `warning_message`,`error_summary` / `compile_errors` 仅覆盖已扫描部分。处理路径:
65
+
66
+ - 把工作簿按 `--sheet-id` / `--sheet-name` 拆成多次调用。
67
+ - 同 sheet 内按 `--range` 切片(如先 `A1:Z200` 再 `AA1:AZ200`),逐块自检。
68
+ - 每块都跑到 `has_more=false` 且 `status='success'` 才算通过。
69
+
70
+ ## 常见陷阱
71
+
72
+ | 坑 | 应对 |
73
+ |---|---|
74
+ | 错误字符串本地化 | 后端按内部 `error_kind` / `compute_status` 字段识别错误类别,不走字符串匹配;调用方拿到的 7 类英文错误代码由后端统一规范输出,与 locale 无关。 |
75
+ | `formatted_value` 可能隐藏错误 | 某些条件格式 / 自定义数字格式会把 `#DIV/0!` 显示成空白。后端直接读 cell `error_kind`,不依赖 `formatted_value`,绕开此类被遮蔽。 |
76
+ | 把 `partial` 当 `success` | `partial` 仅表示**已扫描部分**无错误,剩余区域未知。必须续扫直到 `has_more=false` 且 `status='success'` 才能算通过。 |
77
+ | 编译失败 vs 运行时错误 | 同一份报告里 `compile_errors[]` 与 `error_summary` 并存。语义层先解决 `compile_errors[]`、再做运行时自检。 |