@amaster.ai/pi-lark 0.1.2-beta.41 → 0.1.2-beta.43
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.
- package/package.json +3 -3
- package/skills/lark-apps/SKILL.md +18 -10
- package/skills/lark-apps/references/lark-apps-access-scope-set.md +1 -1
- package/skills/lark-apps/references/lark-apps-automation.md +164 -0
- package/skills/lark-apps/references/lark-apps-db-execute.md +185 -1
- package/skills/lark-apps/references/lark-apps-db.md +1 -1
- package/skills/lark-apps/references/lark-apps-get.md +43 -0
- package/skills/lark-apps/references/lark-apps-html-publish.md +7 -2
- package/skills/lark-apps/references/lark-apps-init.md +1 -2
- package/skills/lark-apps/references/lark-apps-openapi-key.md +1 -1
- package/skills/lark-apps/references/lark-apps-release-create.md +3 -1
- package/skills/lark-apps/references/lark-apps-role.md +133 -0
- package/skills/lark-base/SKILL.md +2 -2
- package/skills/lark-base/references/dashboard-block-data-config.md +28 -2
- package/skills/lark-base/references/lark-base-cell-value.md +9 -4
- package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +7 -7
- package/skills/lark-base/references/lark-base-dashboard.md +11 -2
- package/skills/lark-base/references/lark-base-data-query.md +9 -7
- package/skills/lark-base/references/lark-base-field-create.md +4 -2
- package/skills/lark-base/references/lark-base-field-json.md +52 -15
- package/skills/lark-base/references/lark-base-field-update.md +4 -2
- package/skills/lark-calendar/references/lark-calendar-create.md +1 -0
- package/skills/lark-doc/references/lark-doc-xml-extended-blocks.md +2 -1
- package/skills/lark-drive/SKILL.md +14 -6
- package/skills/lark-drive/references/lark-drive-comment-location.md +16 -4
- package/skills/lark-drive/references/lark-drive-comments-guide.md +16 -8
- package/skills/lark-drive/references/lark-drive-delete.md +23 -11
- package/skills/lark-drive/references/lark-drive-export.md +39 -10
- package/skills/lark-drive/references/lark-drive-list-comments.md +125 -0
- package/skills/lark-drive/references/lark-drive-member-add.md +1 -1
- package/skills/lark-drive/references/lark-drive-move.md +5 -3
- package/skills/lark-drive/references/lark-drive-pull.md +3 -3
- package/skills/lark-drive/references/lark-drive-push.md +1 -1
- package/skills/lark-drive/references/lark-drive-status.md +12 -14
- package/skills/lark-drive/references/lark-drive-task-result.md +58 -5
- package/skills/lark-im/SKILL.md +5 -4
- package/skills/lark-im/references/lark-im-messages-reply.md +1 -1
- package/skills/lark-im/references/lark-im-messages-send.md +1 -1
- package/skills/lark-minutes/SKILL.md +19 -4
- package/skills/lark-minutes/references/lark-minutes-todo.md +2 -2
- package/skills/lark-shared/SKILL.md +9 -9
- package/skills/lark-sheets/SKILL.md +98 -29
- package/skills/lark-sheets/references/lark-sheets-batch-update.md +18 -9
- package/skills/lark-sheets/references/lark-sheets-changeset.md +105 -0
- package/skills/lark-sheets/references/lark-sheets-chart.md +4 -2
- package/skills/lark-sheets/references/lark-sheets-conditional-format.md +2 -0
- package/skills/lark-sheets/references/lark-sheets-filter-view.md +1 -1
- package/skills/lark-sheets/references/lark-sheets-float-image.md +6 -6
- package/skills/lark-sheets/references/lark-sheets-formula-translation.md +12 -3
- package/skills/lark-sheets/references/lark-sheets-formula-verify.md +77 -0
- package/skills/lark-sheets/references/lark-sheets-history.md +93 -0
- package/skills/lark-sheets/references/lark-sheets-pivot-table.md +7 -2
- package/skills/lark-sheets/references/lark-sheets-range-operations.md +44 -14
- package/skills/lark-sheets/references/lark-sheets-read-data.md +3 -3
- package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +4 -4
- package/skills/lark-sheets/references/lark-sheets-visual-standards.md +4 -4
- package/skills/lark-sheets/references/lark-sheets-workbook.md +29 -4
- package/skills/lark-sheets/references/lark-sheets-write-cells.md +21 -11
- package/skills/lark-slides/SKILL.md +29 -18
- package/skills/lark-slides/references/asset-planning.md +0 -1
- package/skills/lark-slides/references/examples.md +57 -227
- package/skills/lark-slides/references/iconpark.md +2 -2
- package/skills/lark-slides/references/lark-slides-create.md +21 -2
- package/skills/lark-slides/references/lark-slides-media-upload.md +0 -1
- package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +89 -0
- package/skills/lark-slides/references/lark-slides-replace-pages.md +1 -1
- package/skills/lark-slides/references/lark-slides-replace-slide.md +1 -1
- package/skills/lark-slides/references/lark-slides-screenshot.md +11 -8
- package/skills/lark-slides/references/lark-slides-xml-get.md +100 -0
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +9 -7
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +4 -4
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +12 -10
- package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +14 -13
- package/skills/lark-slides/references/planning-layer.md +1 -1
- package/skills/lark-slides/references/slides_xml_schema_definition.xml +7 -2
- package/skills/lark-slides/references/troubleshooting.md +7 -25
- package/skills/lark-slides/references/validation-checklist.md +18 -9
- package/skills/lark-slides/references/visual-planning.md +4 -3
- package/skills/lark-slides/references/xml-format-guide.md +20 -0
- package/skills/lark-slides/references/xml-schema-quick-ref.md +6 -2
- package/skills/lark-slides/scripts/xml_text_overlap_lint.py +647 -52
- package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +529 -0
- package/skills/lark-task/SKILL.md +1 -0
- package/skills/lark-vc-agent/SKILL.md +11 -4
- package/skills/lark-vc-agent/references/lark-vc-agent-meeting-events.md +1 -1
- package/skills/lark-vc-agent/references/lark-vc-agent-meeting-leave.md +1 -1
- package/skills/lark-vc-agent/references/lark-vc-agent-meeting-list-active.md +2 -2
- package/skills/lark-wiki/SKILL.md +4 -2
- package/skills/lark-wiki/references/lark-wiki-move-to-drive.md +122 -0
- package/skills/lark-wiki/references/lark-wiki-move.md +5 -3
- package/skills/lark-sheets/references/lark-sheets-core-operations.md +0 -103
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +0 -220
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
2. **批次完成后必须回读校验**:整个 `+batch-update` 执行成功后,用 `+csv-get` 或 `+cells-get` 抽样回读受影响区域,至少校验 3-5 个代表性单元格(首 / 中 / 末),与本地脚本预先计算的预期值对照。
|
|
9
9
|
3. **预期条数前置断言**:涉及"批量填充 N 行"或"对 M 个区域分别写入"时,先把 N、M 硬编码进代码,回读后断言实际等于预期;不一致就再发一轮 `+batch-update` 补齐,禁止交付半成品。
|
|
10
10
|
|
|
11
|
+
若本次 `+batch-update` 的任一子操作写入了公式、复制了公式模板、或导入了含公式的数据块,**回读校验之后还必须继续执行 `+formula-verify`**。`+batch-update` 的原子提交只保证“写入动作都执行了”,不保证整批公式运行结果 zero-error。
|
|
12
|
+
|
|
11
13
|
## 使用场景
|
|
12
14
|
|
|
13
15
|
写入。批量执行多个写入工具操作。将多个工具调用合并为一次请求,按顺序依次执行。适合需要连续执行多个写入操作的场景(如先修改结构再写入数据)。注意:不支持嵌套 `+batch-update`。
|
|
@@ -16,12 +18,18 @@
|
|
|
16
18
|
|
|
17
19
|
**⚠️ 何时必须使用 `+batch-update`(硬性要求)**:
|
|
18
20
|
- 需要对**多个**不同区域执行 `+cells-{merge|unmerge}` 时(如按分组合并多列相同内容)
|
|
19
|
-
- 需要对**多个**不同区域执行 `+rows-resize / +cols-resize` 时(如统一调整多列列宽或多行行高)
|
|
20
21
|
- 需要先插入行列再写入数据时(`+dim-{insert|delete|hide|unhide|freeze|group|ungroup}` + `+cells-set`)
|
|
21
22
|
- 需要对多个区域执行不同写入操作时(多次 `+cells-set` + `+cells-clear` 等组合)
|
|
22
23
|
|
|
24
|
+
**行高列宽批量不走这里**:多行 / 多列不同尺寸直接用 `+rows-resize --heights` / `+cols-resize --widths` 的 map 形态(如 `--widths '{"A":100,"C:E":120}'`,见 `lark-sheets-range-operations`),一次调用原子完成;map 形态不可作为 `--operations` 子操作嵌入(子操作里仍可用单区间形态 `range` + `height`/`width`)。
|
|
25
|
+
|
|
23
26
|
当同一工具需要对多个区域重复调用时,**必须**改用 `+batch-update` 合并为单次请求——`+batch-update` 是原子提交(要么全成功要么整批回滚);逐个调用非原子,中途失败会留下半成品。
|
|
24
27
|
|
|
28
|
+
**公式相关批处理的默认闭环**:
|
|
29
|
+
- 写前:先读 `lark-sheets-formula-translation`,把公式改写成飞书可执行语义。
|
|
30
|
+
- 写时:用 `+batch-update` 一次性完成插行/写公式/复制模板等原子动作。
|
|
31
|
+
- 写后:抽样回读之外,继续跑 `lark-sheets-formula-verify`,直到 `+formula-verify` 返回 `status='success'`。
|
|
32
|
+
|
|
25
33
|
**`+dropdown-update` 的选项模式(`--options` / `--source-range` 二选一)+ 配色规则**(`--colors` 长度可短不能长、必须配 `--highlight=true` 才生效、不传按内置 10 色色板循环补色)见 [`lark-sheets-write-cells`](./lark-sheets-write-cells.md) 的「Dropdown 选项 + 配色」节,本文不重复。`+dropdown-delete` 不涉及这些 flag。
|
|
26
34
|
|
|
27
35
|
## Shortcuts
|
|
@@ -51,9 +59,10 @@ _公共:URL/token(无 sheet 定位) · 系统:`--dry-run`_
|
|
|
51
59
|
|
|
52
60
|
| Flag | Type | 必填 | 说明 |
|
|
53
61
|
| --- | --- | --- | --- |
|
|
54
|
-
| `--ranges` | string + File + Stdin(简单 JSON) | required | 目标范围 JSON
|
|
62
|
+
| `--ranges` | string + File + Stdin(简单 JSON) | required | 目标范围 JSON 数组(最多 100 个),每项必须带 sheet 前缀(如 `["Sheet1!A1:B2","Sheet2!D1:D10"]`,前缀裸写不加引号);前缀必须与 sheet 真实显示名完全一致(含大小写),不接受 sheet reference_id;支持跨 sheet;所有 range 应用同一组 style |
|
|
55
63
|
| `--background-color` | string | optional | 背景颜色(十六进制,如 `#ffffff`) |
|
|
56
64
|
| `--font-color` | string | optional | 字体颜色(十六进制,如 `#000000`) |
|
|
65
|
+
| `--font-family` | string | optional | 字体名称(如 `Arial`、`微软雅黑`) |
|
|
57
66
|
| `--font-size` | float64 | optional | 字体大小(px,例:10、12、14) |
|
|
58
67
|
| `--font-style` | string | optional | 字体样式(可选值:`normal` / `italic`) |
|
|
59
68
|
| `--font-weight` | string | optional | 字重(可选值:`normal` / `bold`) |
|
|
@@ -70,7 +79,7 @@ _公共:URL/token(无 sheet 定位) · 系统:`--dry-run`_
|
|
|
70
79
|
|
|
71
80
|
| Flag | Type | 必填 | 说明 |
|
|
72
81
|
| --- | --- | --- | --- |
|
|
73
|
-
| `--ranges` | string + File + Stdin(简单 JSON) | required | 目标范围 JSON
|
|
82
|
+
| `--ranges` | string + File + Stdin(简单 JSON) | required | 目标范围 JSON 数组(最多 100 个,如 `["Sheet1!A2:A100","Sheet1!C2:C100"]`,前缀裸写不加引号),每项必须带 sheet 前缀;前缀必须与 sheet 真实显示名完全一致(含大小写),不接受 sheet reference_id |
|
|
74
83
|
| `--options` | string + File + Stdin(复合 JSON) | xor | 下拉选项 JSON 数组,例如 `["opt1","opt2"]`。服务端不限制选项数量,也不限制单个选项长度;含逗号的选项可以接受(写入时会自动转义)。大量选项建议改用 `--source-range`。 |
|
|
75
84
|
| `--colors` | string + File + Stdin(简单 JSON) | optional | 下拉胶囊背景色,RGB hex 数组(如 `["#1FB6C1","#F006C2"]`)。长度可短不可长——超长 Validate 拦截(`--colors length (N) must not exceed dropdown source size (M)`),未指定项按内置 10 色色板循环补色。**单独传即生效**;`--highlight=false` 时被忽略。 |
|
|
76
85
|
| `--multiple` | bool | optional | 启用多选 |
|
|
@@ -83,7 +92,7 @@ _公共:URL/token(无 sheet 定位) · 系统:`--yes`、`--dry-run`_
|
|
|
83
92
|
|
|
84
93
|
| Flag | Type | 必填 | 说明 |
|
|
85
94
|
| --- | --- | --- | --- |
|
|
86
|
-
| `--ranges` | string + File + Stdin(简单 JSON) | required | 目标范围 JSON 数组(最多 100 个,如 `["
|
|
95
|
+
| `--ranges` | string + File + Stdin(简单 JSON) | required | 目标范围 JSON 数组(最多 100 个,如 `["Sheet1!E2:E6"]`,前缀裸写不加引号),每项必须带 sheet 前缀;前缀必须与 sheet 真实显示名完全一致(含大小写),不接受 sheet reference_id |
|
|
87
96
|
|
|
88
97
|
### `+cells-batch-clear`
|
|
89
98
|
|
|
@@ -91,7 +100,7 @@ _公共:URL/token(无 sheet 定位) · 系统:`--yes`、`--dry-run`_
|
|
|
91
100
|
|
|
92
101
|
| Flag | Type | 必填 | 说明 |
|
|
93
102
|
| --- | --- | --- | --- |
|
|
94
|
-
| `--ranges` | string + File + Stdin(简单 JSON) | required | 目标范围 JSON
|
|
103
|
+
| `--ranges` | string + File + Stdin(简单 JSON) | required | 目标范围 JSON 数组(最多 100 个),每项必须带 sheet 前缀(如 `["Sheet1!A2:Z1000","Sheet2!A2:Z1000"]`,前缀裸写不加引号);前缀必须与 sheet 真实显示名完全一致(含大小写),不接受 sheet reference_id;支持跨 sheet;对所有 range 执行同一 scope 的清除 |
|
|
95
104
|
| `--scope` | string | optional | 清除范围 enum:`content`(默认,仅清内容)/ `formats`(仅清格式)/ `all`(清内容 + 格式)(可选值:`content` / `formats` / `all`) |
|
|
96
105
|
|
|
97
106
|
## Schemas
|
|
@@ -137,7 +146,7 @@ lark-cli sheets +batch-update --url "https://example.feishu.cn/sheets/shtXXX" --
|
|
|
137
146
|
|
|
138
147
|
# ops.json (array<{shortcut, input}>,shortcut 用 CLI 名):
|
|
139
148
|
# [
|
|
140
|
-
# {"shortcut": "+dim-insert", "input": {"sheet_id":"...","
|
|
149
|
+
# {"shortcut": "+dim-insert", "input": {"sheet_id":"...","position":10,"count":3}},
|
|
141
150
|
# {"shortcut": "+cells-set", "input": {"sheet_id":"...","range":"A11:B12","cells":[[{"value":"a"},{"value":"b"}],[{"value":"c"},{"value":"d"}]]}}
|
|
142
151
|
# ]
|
|
143
152
|
```
|
|
@@ -145,7 +154,7 @@ lark-cli sheets +batch-update --url "https://example.feishu.cn/sheets/shtXXX" --
|
|
|
145
154
|
> ⚠️ **子操作定位规则**:
|
|
146
155
|
> - spreadsheet 定位(`--url` / `--spreadsheet-token`)**只在顶层给一次**;`+batch-update` 顶层**没有** `--sheet-id` / `--sheet-name`,在顶层传不生效。
|
|
147
156
|
> - **每个子操作的子表定位 `sheet_id`(或 `sheet_name`)写进它自己的 `input`**(见上方 ops.json 每个 item)。
|
|
148
|
-
> - `input` 的键是该 shortcut 的 flag **展平**成 JSON(`"range":"A11:B12"`、`"
|
|
157
|
+
> - `input` 的键是该 shortcut 的 flag **展平**成 JSON(`"range":"A11:B12"`、`"position":11`),不要把整组 `--operations` 再套一层嵌套 JSON。
|
|
149
158
|
|
|
150
159
|
> **常见组合:插列 + 写表头 + 整列回填**——一次原子提交,不要拆成 N 次独立调用。批量回填同一列 **只需一次** `+cells-set`(range 写整列范围、cells 写 N×1 矩阵),不需要逐行循环。
|
|
151
160
|
>
|
|
@@ -153,9 +162,9 @@ lark-cli sheets +batch-update --url "https://example.feishu.cn/sheets/shtXXX" --
|
|
|
153
162
|
> // 在 C 列前插入新列 → 写表头 C1 → 回填 C2:C100 共 99 行
|
|
154
163
|
> [
|
|
155
164
|
> {"shortcut": "+dim-insert",
|
|
156
|
-
> "input": {"
|
|
165
|
+
> "input": {"sheet_name": "Sheet1", "position": "C", "count": 1}},
|
|
157
166
|
> {"shortcut": "+cells-set",
|
|
158
|
-
> "input": {"
|
|
167
|
+
> "input": {"sheet_name": "Sheet1", "range": "C1:C100",
|
|
159
168
|
> "cells": [[{"value":"score"}], [{"value":95}], [{"value":87}], /* ... 97 more rows ... */ ]}}
|
|
160
169
|
> ]
|
|
161
170
|
> ```
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Lark Sheet Changeset
|
|
2
|
+
|
|
3
|
+
## 使用场景
|
|
4
|
+
|
|
5
|
+
读取两个版本之间的 **changeset(变更操作清单)**,用于**复核某次编辑(尤其是 AI 编辑)是否真实满足用户诉求**。
|
|
6
|
+
|
|
7
|
+
典型场景:AI agent 对表格做了一批编辑后,想确认它"说做的"和"真正落到表格上的"是否一致——拉取编辑前版本到编辑后版本之间的 changeset,逐条核对 action 是否覆盖了用户要求的修改、有没有多改 / 漏改。
|
|
8
|
+
|
|
9
|
+
## 版本(revision)语义
|
|
10
|
+
|
|
11
|
+
- 这里的"版本"指表格的 **CS revision**(每次提交单调递增的修订号),不是文档历史里的命名版本。
|
|
12
|
+
- `--start-revision` 是复核基线,即你认定的"编辑前"版本。
|
|
13
|
+
- `--end-revision` 是"编辑后"版本;**省略时默认取最新 revision**,返回从 start 到最新的全部 changeset。
|
|
14
|
+
- **版本差上限 20**:`end - start + 1 ≤ 20`,超出会被拒绝(服务端同样以 20 兜底)。复核大跨度变更时请分段拉取。
|
|
15
|
+
|
|
16
|
+
## Shortcuts
|
|
17
|
+
|
|
18
|
+
| Shortcut | Risk | 分组 |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| `+changeset-get` | read | 变更记录 |
|
|
21
|
+
|
|
22
|
+
## Flags
|
|
23
|
+
|
|
24
|
+
### `+changeset-get`
|
|
25
|
+
|
|
26
|
+
_公共:URL/token(无 sheet 定位)_
|
|
27
|
+
|
|
28
|
+
| Flag | Type | 必填 | 说明 |
|
|
29
|
+
| --- | --- | --- | --- |
|
|
30
|
+
| `--start-revision` | int | required | 起始版本(编辑前基线,>= 1) |
|
|
31
|
+
| `--end-revision` | int | optional | 结束版本(省略取最新) |
|
|
32
|
+
|
|
33
|
+
## 返回结构
|
|
34
|
+
|
|
35
|
+
返回一个 JSON 对象,`changesets` 数组按版本顺序排列,每个元素是一次提交的**原始 action 列表**与元信息:
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"spreadsheet_token": "shtcnXXXX",
|
|
40
|
+
"latest_revision": 142,
|
|
41
|
+
"start_revision": 120,
|
|
42
|
+
"end_revision": 135,
|
|
43
|
+
"changesets": [
|
|
44
|
+
{
|
|
45
|
+
"revision": 121,
|
|
46
|
+
"create_time": "2026-06-12T10:00:00Z",
|
|
47
|
+
"actions": [
|
|
48
|
+
{ "action": "setCellRange", "sheetId": "...", "value": { /* ... */ } }
|
|
49
|
+
],
|
|
50
|
+
"is_self_edit": false,
|
|
51
|
+
"is_ai_edit": true
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
- 最外层 `latest_revision` 是**当前表格的最新版本号**(与查询区间无关),便于判断表格当前停在哪个版本、`--start-revision` 该取多少。
|
|
58
|
+
- `actions` 是**未经语义渲染的原始操作对象**,按提交内的执行顺序排列。复核时逐条比对:每个 action 改了哪个 sheet、哪个区域、改成什么,是否对应用户的诉求。
|
|
59
|
+
- `revision` / `create_time` 用于判断"这次改动属于哪个版本、什么时候做的"。
|
|
60
|
+
- `is_self_edit` 表示该 changeset 是否由当前请求用户提交(committer 与请求用户相同),即"是不是我自己提交的编辑"。
|
|
61
|
+
- `is_ai_edit` 表示该 changeset 是否由 AI 客户端提交(`member_id` 为 10 / 11)。复核时 `is_ai_edit=true` 即为 AI 写入的编辑(而非用户手动编辑),是核对 AI 是否完成诉求的主要对象。
|
|
62
|
+
|
|
63
|
+
## 复核工作流(判断 AI 是否真实完成诉求)
|
|
64
|
+
|
|
65
|
+
1. 记下 AI 开始编辑前的 revision(编辑前 `+workbook-info` 或上一次工具返回的 revision 即可作为 `--start-revision`)。
|
|
66
|
+
2. AI 编辑完成后,跑 `+changeset-get --url <表格> --start-revision <编辑前版本>`(不传 end → 取到最新)。
|
|
67
|
+
3. 遍历 `changesets[].actions`,核对:
|
|
68
|
+
- 用户要求的每一处修改是否都有对应 action;
|
|
69
|
+
- 有没有越权 / 多余的修改(动了用户没让动的 sheet / 区域);
|
|
70
|
+
- action 的目标区域、值是否与诉求一致。
|
|
71
|
+
4. 若版本跨度可能 > 20,分段拉取(如 `start..start+19`、`start+20..` …)。
|
|
72
|
+
|
|
73
|
+
## 注意
|
|
74
|
+
|
|
75
|
+
- `+changeset-get` 是**只读**操作,不改动表格。
|
|
76
|
+
- 大跨度 / 大批量编辑的 changeset 可能体积较大;输出在传输层已 gzip。必要时缩小版本区间。
|
|
77
|
+
- 该工具走只读 scope `sheets:spreadsheet:read`,需要对表格有查看权限。
|
|
78
|
+
|
|
79
|
+
## Examples
|
|
80
|
+
|
|
81
|
+
### `+changeset-get`
|
|
82
|
+
|
|
83
|
+
公共:`--url` / `--spreadsheet-token`(二选一,无 sheet 定位)。changeset 是工作簿级历史,不接受 sheet 定位 flag。
|
|
84
|
+
|
|
85
|
+
示例:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# 只传起始版本 → 返回从该版本到最新的全部 changeset(最常用:复核 AI 编辑前后的差异)
|
|
89
|
+
lark-cli sheets +changeset-get --url "https://example.feishu.cn/sheets/shtXXX" --start-revision 120
|
|
90
|
+
|
|
91
|
+
# 传起始 + 结束版本(版本差 end-start+1 ≤ 20)
|
|
92
|
+
lark-cli sheets +changeset-get --spreadsheet-token shtXXX --start-revision 120 --end-revision 135
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
输出契约(envelope.data):
|
|
96
|
+
|
|
97
|
+
- `latest_revision` — 当前表格最新版本号(与查询区间无关)
|
|
98
|
+
- `start_revision` / `end_revision` — 实际查询区间(省略 `--end-revision` 时 `end_revision` = 最新版本)
|
|
99
|
+
- `changesets[]` — 按版本顺序排列;每项含 `revision` / `create_time` / `actions`(原始操作列表)/ `is_self_edit` / `is_ai_edit`
|
|
100
|
+
|
|
101
|
+
### Validate / DryRun / Execute 约束
|
|
102
|
+
|
|
103
|
+
- `Validate` 阶段只做 XOR 检查(`--url` / `--spreadsheet-token` 二选一)与版本上限校验(`--start-revision ≥ 1`,传了 `--end-revision` 时 `end ≥ start` 且 `end - start + 1 ≤ 20`);**禁止**联网。
|
|
104
|
+
- `DryRun` 输出请求模板,不实际拉取 changeset。
|
|
105
|
+
- `Execute` 阶段才发起 changeset 查询;省略 `--end-revision` 时由服务端解析为最新 revision。
|
|
@@ -31,7 +31,9 @@
|
|
|
31
31
|
|
|
32
32
|
**常见配置错误(必须注意)**:
|
|
33
33
|
- **图表类型选择错误**:用户说"堆积柱形图/百分比堆积"时,应在 `properties.snapshot.plotArea.plot.extra.stack` 中配置堆叠;百分比堆叠需在该 stack 下设置 `percentage: true`。用户说"占比/比例"时,优先考虑饼图或百分比堆积图。注意区分 `column`(柱形图,纵向)与 `bar`(条形图,横向)是两个不同的 type 取值,"对比/各 XX" 类纵向柱默认用 `column`
|
|
34
|
-
-
|
|
34
|
+
- **数据标签开关**:`plotArea.plot.labels` 对象的**存在性即开关**——
|
|
35
|
+
- 用户需要看到具体数值/类别时:传入 `labels` 并配置 `value` / `category` / `series` / `percentage` 等显示位。
|
|
36
|
+
- 用户明确说"不要数据标签 / 关掉标签"时:**整个 `labels` 字段省略**。不要用 `labels: { value: false, category: false, series: false }` 这种"全部置 false"的写法关闭——只要传了 `labels`,系统就会显示数据标签(且默认兜底显示 value)。
|
|
35
37
|
- **数据源范围与系列名来源要对齐**:
|
|
36
38
|
- **默认情况(inline 模式)**:`refs` 范围**应包含表头行**(首行/首列即系列名),且范围要精确覆盖目标数据,不要多选或少选。
|
|
37
39
|
- **合并标题行要跳过**:如果表格在表头上方存在合并的标题行(如"员工统计表"横跨多列的大标题),`refs` 必须跳过标题行、从真正的列标题行开始。例如表头在第 3 行、数据在第 4-20 行,则 `refs` 应为 `A3:G20` 而非 `A1:G20`。包含合并标题行会导致列名识别错误、表头被当作数据参与聚合计算。
|
|
@@ -122,7 +124,7 @@ _公共四件套 · 系统:`--dry-run`_
|
|
|
122
124
|
|
|
123
125
|
| Flag | Type | 必填 | 说明 |
|
|
124
126
|
| --- | --- | --- | --- |
|
|
125
|
-
| `--properties` | string + File + Stdin(复合 JSON) | required | 图表完整配置 JSON。顶层字段为 `position` / `offset` / `size` / `snapshot`(无顶层 `data`,也无再嵌一层 `properties`);图表数据配置在 `snapshot.data` 下(含 `refs` / `headerMode` / `dim1` / `dim2
|
|
127
|
+
| `--properties` | string + File + Stdin(复合 JSON) | required | 图表完整配置 JSON。顶层字段为 `position` / `offset` / `size` / `snapshot`(无顶层 `data`,也无再嵌一层 `properties`);图表数据配置在 `snapshot.data` 下(含 `refs` / `headerMode` / `dim1` / `dim2`);必须至少含 `snapshot.data.dim1.serie.index` 或 `dim2.series[].index` 之一,否则 server 拒。结构嵌套深,完整结构跑 `--print-schema --flag-name properties` |
|
|
126
128
|
|
|
127
129
|
### `+chart-update`
|
|
128
130
|
|
|
@@ -50,7 +50,7 @@ _公共四件套 · 系统:`--dry-run`_
|
|
|
50
50
|
| --- | --- | --- | --- |
|
|
51
51
|
| `--properties` | string + File + Stdin(复合 JSON) | required | 筛选视图规则 JSON,含 `rules?`(列级筛选规则数组)和 `filtered_columns?`。`range` 和 `view_name` 是独立 flag |
|
|
52
52
|
| `--range` | string | required | 筛选视图作用的单元格范围(A1 表示法,如 `A1:F1000`);优先级高于 `--properties` 中同名字段;create 必填,必须覆盖表头行 |
|
|
53
|
-
| `--view-name` | string | optional |
|
|
53
|
+
| `--view-name` | string | optional | 筛选视图名称;不传时系统自动分配;优先级高于 `--properties` 中同名字段 |
|
|
54
54
|
|
|
55
55
|
### `+filter-view-update`
|
|
56
56
|
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
|
|
30
30
|
- **`--image <本地路径>`(首选,最省事)**:直接给本地图片文件路径(PNG/JPEG/GIF/BMP/HEIC 等)。CLI 会自动把它以 `parent_type=sheet_image` 上传,拿到 file_token 后创建浮动图,**不用你手动上传 / 取 token**。路径规则同其它本地文件 flag:必须是当前工作目录内的相对路径(绝对路径会被 Validate 拒,`--dry-run` 也会拦)。
|
|
31
31
|
- `--image-token`:复用**已存在**的图片 file_token。常见来源:① `+float-image-list` 返回的 `image_token`(适合"换皮不换位置"复用同一张图);② `+cells-set-image` 成功返回里的 `file_token`(它也是 `sheet_image` 上传句柄)。适合"同一张图复用到多处",省去重复上传。
|
|
32
|
-
- `--image-uri`:图片 reference_id
|
|
32
|
+
- `--image-uri`:图片 URI(上传链路返回的句柄),**非**表内对象 reference_id;由系统自动转 file_token。
|
|
33
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
|
|
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
35
|
|
|
36
36
|
## Shortcuts
|
|
37
37
|
|
|
@@ -60,7 +60,7 @@ _公共四件套 · 系统:`--dry-run`_
|
|
|
60
60
|
| --- | --- | --- | --- |
|
|
61
61
|
| `--image-name` | string | required | 图片名称,含扩展名(如 `logo.png`) |
|
|
62
62
|
| `--image-token` | string | xor | 图片 file_token(与 `--image-uri` 二选一)。常见来源:`+float-image-list` 返回的 `image_token` |
|
|
63
|
-
| `--image-uri` | string | xor | 图片 reference_id
|
|
63
|
+
| `--image-uri` | string | xor | 图片 URI(上传链路返回的句柄,非表内对象 reference_id;与 `--image-token` 二选一);系统自动转换为 file_token |
|
|
64
64
|
| `--position-row` | int | required | 图片左上角所在行(0-based) |
|
|
65
65
|
| `--position-col` | string | required | 图片左上角所在列(列字母,如 `A` / `B`) |
|
|
66
66
|
| `--size-width` | int | required | 图片宽度(像素) |
|
|
@@ -78,8 +78,8 @@ _公共四件套 · 系统:`--dry-run`_
|
|
|
78
78
|
| --- | --- | --- | --- |
|
|
79
79
|
| `--float-image-id` | string | required | 目标图片 id |
|
|
80
80
|
| `--image-name` | string | required | 图片名称,含扩展名(如 `logo.png`) |
|
|
81
|
-
| `--image-token` | string |
|
|
82
|
-
| `--image-uri` | string |
|
|
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
83
|
| `--position-row` | int | required | 图片左上角所在行(0-based) |
|
|
84
84
|
| `--position-col` | string | required | 图片左上角所在列(列字母,如 `A` / `B`) |
|
|
85
85
|
| `--size-width` | int | required | 图片宽度(像素) |
|
|
@@ -122,7 +122,7 @@ lark-cli sheets +float-image-create --url "..." --sheet-id "$SID" \
|
|
|
122
122
|
--image-name "logo.png" --image-token "$TOKEN" \
|
|
123
123
|
--position-row 0 --position-col A --size-width 200 --size-height 150
|
|
124
124
|
|
|
125
|
-
# 用
|
|
125
|
+
# 用 image URI(上传链路返回的句柄,非表内对象 reference_id;与 --image-token 二选一)
|
|
126
126
|
lark-cli sheets +float-image-create --url "..." --sheet-id "$SID" \
|
|
127
127
|
--image-name "logo.png" --image-uri "$IMAGE_URI" \
|
|
128
128
|
--position-row 2 --position-col B --size-width 300 --size-height 200 --z-index 1
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# 飞书表格公式生成规则
|
|
2
2
|
|
|
3
3
|
> **本文定位**:飞书公式正确性的**唯一权威**——书写任何飞书公式、或把 Excel 公式迁移到飞书前,先读本文。涵盖公式书写约定(绝对引用、范围语法)、投影 vs spill、ARRAYFORMULA / 数组语义、高风险引用函数、日期差、不支持函数清单。
|
|
4
|
-
> **边界**:本文只讲"公式怎么写对";公式**怎么写入表格**(`+cells-set` / 模板单元格 + `--copy-to-range` / 容错回读)见 `lark-sheets-write-cells
|
|
4
|
+
> **边界**:本文只讲"公式怎么写对";公式**怎么写入表格**(`+cells-set` / 模板单元格 + `--copy-to-range` / 容错回读)见 `lark-sheets-write-cells`。**公式写入完成后的强制收尾**见 `lark-sheets-formula-verify`:不要把"翻译对了"误当成"已经交付完成"。本文不含 shortcut,通用编辑准则见主 SKILL.md「飞书表格编辑准则」。
|
|
5
5
|
|
|
6
6
|
**核心原则:飞书不像 Excel 365 那样默认 spill(溢出展开)。飞书普通公式遇到区域时默认"投影"(只取当前行/列对应的单个值),必须显式使用 `ARRAYFORMULA` 或原生数组函数才能逐项展开。**
|
|
7
7
|
|
|
8
8
|
## 公式书写约定(写任何公式都先满足)
|
|
9
9
|
|
|
10
10
|
- **绝对引用 `$`**:向下 / 向右填充前判断哪些引用要锁定——用户指定的固定 cell(`$C$3`)、要固定的数据范围(`$A$2:$B$5`)、锁列不锁行(`$A2`)、锁行不锁列(`B$1`)。填充前检查是否需固定汇率 / 税率 / 查找表 / 权重表,以及同列 / 同行公式结构是否一致。
|
|
11
|
-
- **公式字符串用飞书范围语法**:写 `H:H`、`A2:B5`,**禁止** `H2:H` / `2:2`。这与 CLI 工具参数(如 `--range`)的 A1
|
|
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
12
|
|
|
13
13
|
## 翻译后必做:代码复现校验
|
|
14
14
|
|
|
@@ -21,6 +21,14 @@
|
|
|
21
21
|
|
|
22
22
|
**理由**:Excel→飞书的语法翻译很容易在 spill / 数组 / 日期差 / 范围引用上出现等价性偏差,仅靠语法转换通过不足以保证业务结果正确。
|
|
23
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
|
+
|
|
24
32
|
## 决策流程
|
|
25
33
|
|
|
26
34
|
1. 最终结果是**标量**(单值)→ 通常不需要 `ARRAYFORMULA`
|
|
@@ -224,7 +232,7 @@ Excel:`{=A1:A10*B1:B10}`(Ctrl+Shift+Enter 输入)
|
|
|
224
232
|
|
|
225
233
|
## 飞书不支持的函数
|
|
226
234
|
|
|
227
|
-
> 本段是"飞书不支持函数"
|
|
235
|
+
> 本段是"飞书不支持函数"的**唯一权威清单**。以下函数在飞书里不存在或被禁用,禁止主动使用;用户明确要求时应拒绝并提供替代方案:
|
|
228
236
|
|
|
229
237
|
- `STOCKHISTORY` — 实时股票数据,飞书无等价函数,需手动导入数据
|
|
230
238
|
- `WEBSERVICE` — 外部 HTTP 请求,飞书无等价函数
|
|
@@ -234,6 +242,7 @@ Excel:`{=A1:A10*B1:B10}`(Ctrl+Shift+Enter 输入)
|
|
|
234
242
|
- `INFO`、`RTD` — 系统信息 / 实时数据函数,飞书不支持
|
|
235
243
|
- `PIVOT` — 用 `+pivot-{create|update|delete}` 透视表对象替代
|
|
236
244
|
- `AMORDEGRC`、`PHONETIC`、`DETECTLANGUAGE` — 飞书不支持
|
|
245
|
+
- `LET`、命名自定义函数(名称管理器里定义的 LAMBDA)、独立调用的 `LAMBDA`(如 `=LAMBDA(x,x+1)(5)`)— 会报 `#NAME?`;改用嵌套 IF / 辅助列。**例外**:`LAMBDA` 作为 `MAP` / `REDUCE` / `BYROW` / `BYCOL` / `SCAN` / `MAKEARRAY` 的内联参数时**支持**(见上方「飞书原生数组函数清单」)
|
|
237
246
|
|
|
238
247
|
## 代表性改写示例
|
|
239
248
|
|
|
@@ -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[]`、再做运行时自检。 |
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Lark Sheet History
|
|
2
|
+
|
|
3
|
+
## 概念回顾
|
|
4
|
+
|
|
5
|
+
每张飞书电子表格保留一串历史版本(`minor_histories`)。每个版本由 `history_version_id` 标识,并附带创建时间(`create_time`)、动作(`action`)与块修订信息(`all_block_revision`)。历史是**工作簿级**的(针对整张电子表格,不针对单个子表)。
|
|
6
|
+
|
|
7
|
+
回滚(revert)把电子表格的当前内容覆盖回某个历史版本——这是一个**高风险写入**操作,且为**异步**:发起后立即返回受理标识,真正的回滚在后台进行,需通过状态查询轮询最终结果(进行中 / 成功 / 失败)。
|
|
8
|
+
|
|
9
|
+
`+history-list` 读取版本列表以挑选目标;`+history-revert` 发起回滚;`+history-revert-status` 轮询回滚结果。若只是想拿**当前文档版本号(revision)**当作 recover / undo / `+changeset-get` 的起点锚点,直接用 `+revision-get` 更轻量。
|
|
10
|
+
|
|
11
|
+
## 使用场景
|
|
12
|
+
|
|
13
|
+
读取历史版本、发起回滚、查询回滚状态。本 reference 覆盖 3 个 shortcut:
|
|
14
|
+
|
|
15
|
+
| 操作需求 | 使用工具 | 说明 |
|
|
16
|
+
|---------|---------|------|
|
|
17
|
+
| 查看历史版本列表 | `+history-list` | 返回 `minor_histories`,每条含 `history_version_id` / `create_time` / `action` / `all_block_revision` 四个字段;支持向前分页(可选 `--end-version`) |
|
|
18
|
+
| 回滚到指定历史版本 | `+history-revert` | 传入 `--history-version-id`;异步受理,返回可查询标识 |
|
|
19
|
+
| 查询回滚状态 | `+history-revert-status` | 传入 `--transaction-id`(取自 `+history-revert` 的异步受理标识);轮询某次回滚的进行中 / 成功 / 失败状态 |
|
|
20
|
+
|
|
21
|
+
典型工作流:`+history-list` 拿到目标版本的 `history_version_id`(必要时翻页拉取更早历史)→ `+history-revert` 发起回滚并取回 `transaction_id` → `+history-revert-status --transaction-id <transaction_id>` 轮询直到成功或失败。
|
|
22
|
+
|
|
23
|
+
**注意事项(必须了解)**:
|
|
24
|
+
- **回滚是高风险写入操作**:会用历史版本内容覆盖当前表格,执行前应明确告知用户影响。
|
|
25
|
+
- **回滚是异步的**:`+history-revert` 返回的是 `transaction_id`(受理标识),不代表回滚已完成;必须用 `+history-revert-status --transaction-id <transaction_id>` 确认最终结果。
|
|
26
|
+
- **`history_version_id` 与 `transaction_id` 不是同一个**:`history_version_id` 用于 `+history-revert`(取自 `+history-list`);`transaction_id` 用于 `+history-revert-status`(取自 `+history-revert` 的输出)。
|
|
27
|
+
- **历史是工作簿级**:定位只需 `--url` / `--spreadsheet-token`(XOR),不需要子表选择器。
|
|
28
|
+
- **`+history-list` 倒序分页**:首次查省略 `--end-version`,返回最新一页;若响应里附带 `next_end_version` 与 `has_more=true`,把 `next_end_version` 作为下一次的 `--end-version` 即可继续向更早翻页;当响应**不包含**这两个字段时表示已到最早一页,不必再翻。
|
|
29
|
+
|
|
30
|
+
## Shortcuts
|
|
31
|
+
|
|
32
|
+
| Shortcut | Risk | 分组 |
|
|
33
|
+
| --- | --- | --- |
|
|
34
|
+
| `+history-list` | read | 历史版本 |
|
|
35
|
+
| `+history-revert` | high-risk-write | 历史版本 |
|
|
36
|
+
| `+history-revert-status` | read | 历史版本 |
|
|
37
|
+
|
|
38
|
+
## Flags
|
|
39
|
+
|
|
40
|
+
### `+history-list`
|
|
41
|
+
|
|
42
|
+
_公共:URL/token(无 sheet 定位) · 系统:`--dry-run`_
|
|
43
|
+
|
|
44
|
+
| Flag | Type | 必填 | 说明 |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
| `--end-version` | int | optional | 分页查询的最大版本(倒序);首次查询省略,下一页传上一页返回的 next_end_version。 |
|
|
47
|
+
|
|
48
|
+
### `+history-revert`
|
|
49
|
+
|
|
50
|
+
_公共:URL/token(无 sheet 定位) · 系统:`--dry-run`_
|
|
51
|
+
|
|
52
|
+
| Flag | Type | 必填 | 说明 |
|
|
53
|
+
| --- | --- | --- | --- |
|
|
54
|
+
| `--history-version-id` | string | required | 要回滚到的历史版本(取自 +history-list) |
|
|
55
|
+
|
|
56
|
+
### `+history-revert-status`
|
|
57
|
+
|
|
58
|
+
_公共:URL/token(无 sheet 定位) · 系统:`--dry-run`_
|
|
59
|
+
|
|
60
|
+
| Flag | Type | 必填 | 说明 |
|
|
61
|
+
| --- | --- | --- | --- |
|
|
62
|
+
| `--transaction-id` | string | required | 异步回滚的受理标识(取自 +history-revert) |
|
|
63
|
+
|
|
64
|
+
## Examples
|
|
65
|
+
|
|
66
|
+
公共定位:所有 shortcut 顶部排列 `--url` / `--spreadsheet-token`(XOR,二选一)。`+history-revert` 用 `--history-version-id`(取自 `+history-list`);`+history-revert-status` 用 `--transaction-id`(取自 `+history-revert` 的异步受理标识)。
|
|
67
|
+
|
|
68
|
+
### `+history-list`
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# 列出某张电子表格的最新一页历史版本
|
|
72
|
+
lark-cli sheets +history-list --url "https://sample.feishu.cn/sheets/SHTxxxxxx"
|
|
73
|
+
|
|
74
|
+
# 用原始 spreadsheet token 定位
|
|
75
|
+
lark-cli sheets +history-list --spreadsheet-token "SHTxxxxxx"
|
|
76
|
+
|
|
77
|
+
# 翻到下一页:把上次响应里的 next_end_version 作为 --end-version 传入
|
|
78
|
+
lark-cli sheets +history-list --url "https://sample.feishu.cn/sheets/SHTxxxxxx" --end-version 12345
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### `+history-revert`
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# 回滚到指定历史版本(异步受理)
|
|
85
|
+
lark-cli sheets +history-revert --url "https://sample.feishu.cn/sheets/SHTxxxxxx" --history-version-id "<id-from-history-list>"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### `+history-revert-status`
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# 查询某次回滚的当前状态(进行中 / 成功 / 失败)
|
|
92
|
+
lark-cli sheets +history-revert-status --url "https://sample.feishu.cn/sheets/SHTxxxxxx" --transaction-id "<transaction-id-from-history-revert>"
|
|
93
|
+
```
|
|
@@ -32,9 +32,10 @@
|
|
|
32
32
|
**常见配置错误(必须注意)**:
|
|
33
33
|
- **数据源范围必须精确**:透视表的数据源范围必须包含表头行,且精确覆盖全部数据行列。范围过大(包含空行/空列)或过小(遗漏数据列)都会导致透视表结果错误
|
|
34
34
|
- **行列字段选择要匹配用户意图**:用户说"按商品统计金额"→ 行字段=商品,值字段=金额(`summarize_by: "sum"`)。不要把行列字段搞反
|
|
35
|
-
- **聚合类型要匹配**:用户说"统计数量"→ `summarize_by: "count"`;"统计总额"→ `"sum"`;"统计平均"→ `"average"`。完整合法值:`sum` / `count` / `average` / `max` / `min` / `product` / `countNums` / `stdDev` / `stdDevp` / `var` / `varp` / `distinct` / `median
|
|
35
|
+
- **聚合类型要匹配**:用户说"统计数量"→ `summarize_by: "count"`;"统计总额"→ `"sum"`;"统计平均"→ `"average"`。完整合法值:`sum` / `count` / `average` / `max` / `min` / `product` / `countNums` / `stdDev` / `stdDevp` / `var` / `varp` / `distinct` / `median`。按用户意图选聚合方式,不要拿 `count` 顶替 `sum`
|
|
36
36
|
- **参数长度限制**:如果透视表配置 JSON 过长(数据源范围跨越大量行列),可能导致工具调用失败。此时应先确认数据范围的精确边界,避免传入过大的 range
|
|
37
|
-
-
|
|
37
|
+
- **落点不能覆盖任何已有数据(不只是 `--source` 范围)**:透视表创建后会向右下**展开**,展开区域哪怕只盖到一个已有单元格(即便已避开源数据),也会报「目标位置不能与数据源重叠」并产生 `#REF!`。创建前无法精确预知展开尺寸,故**强烈优先默认策略**(不传 `--target-sheet-id/-name` 与 `--target-position`/`--range`,后端自动新建空白子表),零覆盖风险;非要落到已有子表,必须挑一片足够大的纯空白区
|
|
38
|
+
- **创建后必须校验(用 `info` 读取展开后的真实占用区域)**:创建后调用 `+pivot-list` 读 `info.error_state` 与 `info.content_range`/`page_range`——`error_state` 非 `None`(如 `Cover` 盖到其它内容 / `Shrink` 展不开)说明落点冲突,应删除后重建到空白区;`content_range`/`page_range` 是展开后**实际占用区域**,可用 `+csv-get` 抽查其边缘外有没有盖掉原有数据,确认结构正确
|
|
38
39
|
|
|
39
40
|
## Shortcuts
|
|
40
41
|
|
|
@@ -120,6 +121,10 @@ _创建/更新的透视表属性_
|
|
|
120
121
|
lark-cli sheets +pivot-list --url "..." --sheet-id "$SID"
|
|
121
122
|
```
|
|
122
123
|
|
|
124
|
+
> **返回值含 `info`(展开后的占用区域与状态)**:每个透视表对象除 `position` / `snapshot` 外,还返回 `info`,标明它在 sheet 上的平铺区域与状态——`info.page_range`(筛选/分页区 A1)、`info.content_range`(主体数据区 A1)、`info.span_range`(空表合并区 A1)、`info.error_state`(错误状态,如 `None`/`Cover`/`Shrink`/`Loading`)、`info.is_empty` / `info.is_hidden`、`info.row`/`info.col`(锚点)等。
|
|
125
|
+
> **用途 1(判断改值还是改配置)**:当用户描述某个单元格要改动时,先 `+pivot-list` 拿到 `info`,判断该单元格是否落在 `page_range` / `content_range` 内——**落在区域内 = 属于透视表,应走 `+pivot-update` 改配置**(透视表单元格不能直接 `+cells-set` 改值);**落在区域外 = 普通单元格,正常 `+cells-set` 改值**。
|
|
126
|
+
> **用途 2(创建后校验覆盖)**:建完透视表用 `info.error_state` 判断有没有冲突(非 `None` 即落点/展开区与已有数据重叠或展不开),用 `info.content_range`/`page_range` 拿到展开后真实占用区域再核对是否盖到原有数据。
|
|
127
|
+
|
|
123
128
|
### `+pivot-create`
|
|
124
129
|
|
|
125
130
|
> 数据源 `--source` 必须从表头行开始;空行 / 汇总行会被当作数据参与聚合,需提前用 `+csv-get` 确认起止边界。`--source` 和 `--range` 是独立 flag(不要再放 `--properties`);`rows` / `columns` / `values` 等数组字段走 `--properties`。
|