@amaster.ai/pi-lark 0.1.2-beta.72 → 0.1.2-beta.74
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 +4 -4
- package/skills/lark-apps/SKILL.md +1 -0
- package/skills/lark-apps/references/lark-apps-export.md +62 -0
- package/skills/lark-base/SKILL.md +3 -3
- package/skills/lark-base/references/lark-base-dashboard-block-config.md +20 -2
- package/skills/lark-base/references/lark-base-view.md +109 -0
- package/skills/lark-base/references/lark-base-workflow-schema.md +22 -12
- package/skills/lark-sheets/SKILL.md +58 -173
- package/skills/lark-sheets/references/lark-sheets-batch-update.md +10 -10
- package/skills/lark-sheets/references/lark-sheets-chart.md +5 -5
- package/skills/lark-sheets/references/lark-sheets-conditional-format.md +4 -4
- package/skills/lark-sheets/references/lark-sheets-filter-view.md +1 -1
- package/skills/lark-sheets/references/lark-sheets-filter.md +2 -2
- package/skills/lark-sheets/references/lark-sheets-float-image.md +2 -2
- package/skills/lark-sheets/references/lark-sheets-formula-translation.md +90 -4
- package/skills/lark-sheets/references/lark-sheets-formula-verify.md +49 -13
- package/skills/lark-sheets/references/lark-sheets-pivot-table.md +13 -13
- package/skills/lark-sheets/references/lark-sheets-range-operations.md +12 -9
- package/skills/lark-sheets/references/lark-sheets-read-data.md +14 -12
- package/skills/lark-sheets/references/lark-sheets-search-replace.md +3 -3
- package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +8 -4
- package/skills/lark-sheets/references/lark-sheets-sparkline.md +2 -2
- package/skills/lark-sheets/references/lark-sheets-styles-put.md +2 -2
- package/skills/lark-sheets/references/lark-sheets-visual-standards.md +16 -16
- package/skills/lark-sheets/references/lark-sheets-workbook.md +22 -7
- package/skills/lark-sheets/references/lark-sheets-write-cells.md +66 -57
- package/skills/lark-sheets/scripts/lark_chart_quality_check.py +42 -26
- package/skills/lark-sheets/scripts/lark_chart_size_advisor.py +2 -1
- package/skills/lark-sheets/scripts/lark_inspect_workbook.py +37 -9
- package/skills/lark-sheets/scripts/lark_sheet_read_cli.py +53 -0
- package/skills/lark-sheets/scripts/{sheets_df.py → lark_sheets_df.py} +1 -1
- package/skills/lark-slides/SKILL.md +11 -18
- package/skills/lark-slides/references/cli/lark-slides-create.md +3 -3
- package/skills/lark-slides/references/cli/lark-slides-delete-slide.md +1 -1
- package/skills/lark-slides/references/cli/lark-slides-history.md +1 -8
- package/skills/lark-slides/references/cli/lark-slides-media-upload.md +5 -10
- package/skills/lark-slides/references/cli/lark-slides-replace-slide.md +14 -15
- package/skills/lark-slides/references/cli/lark-slides-update-slide.md +2 -2
- package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md +3 -108
- package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md +6 -183
- package/skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md +26 -143
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +3 -3
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +2 -2
- package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +2 -2
- package/skills/lark-slides/references/workflow/error-handling.md +3 -3
- package/skills/lark-slides/references/workflow/slides-editing.md +10 -11
- package/skills/lark-sheets/references/lark-sheets-legacy-command-migration.md +0 -152
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Lark Sheet Styles Put(+styles-put)
|
|
2
2
|
|
|
3
|
-
> **本文定位**:对**已有**表格做美化收尾的默认入口——样式 / 边框 / 合并 / 行高列宽 / 冻结写成一份声明式规格,一次调用交付。样式**取什么值**(配色 / 字号 / 对齐 / 数字格式标准)以 `lark-sheets-visual-standards` 为唯一权威,本文只讲**怎么落地**。
|
|
3
|
+
> **本文定位**:对**已有**表格做美化收尾的默认入口——样式 / 边框 / 合并 / 行高列宽 / 冻结写成一份声明式规格,一次调用交付。样式**取什么值**(配色 / 字号 / 对齐 / 数字格式标准)以 `references/lark-sheets-visual-standards.md` 为唯一权威,本文只讲**怎么落地**。
|
|
4
4
|
>
|
|
5
5
|
> **边界(三分流判定,按操作组合选入口)**:目标是**样式 / 合并 / 行高列宽 / 冻结**的任意组合 → 本命令;**同一个写操作**打多个区域(如多区域清除、批量下拉)→ 用该命令自身的复数形态(`--ranges` / map 入参);操作链**跨类型且有顺序依赖**(如插列 → 写表头 → 回填数据)→ `+batch-update`。美化收尾不需要也不应该拼 `--operations` 子操作数组。
|
|
6
6
|
|
|
7
7
|
## 使用场景
|
|
8
8
|
|
|
9
|
-
写入。对存量表格的多个子表批量应用视觉规格:新表美化、加汇总行后统一版式、按分组合并同类单元格、调列宽行高、冻结表头。整份规格展开为一次批量提交按序执行,与 `+batch-update` 同为 **fail-fast**——失败后哪些子操作已生效不做统一假设,先回读确认再补发(语义同 `lark-sheets-batch-update`「执行语义」)。
|
|
9
|
+
写入。对存量表格的多个子表批量应用视觉规格:新表美化、加汇总行后统一版式、按分组合并同类单元格、调列宽行高、冻结表头。整份规格展开为一次批量提交按序执行,与 `+batch-update` 同为 **fail-fast**——失败后哪些子操作已生效不做统一假设,先回读确认再补发(语义同 `references/lark-sheets-batch-update.md`「执行语义」)。
|
|
10
10
|
|
|
11
11
|
⚠️ **失败后不要照抄报错里的 `operations[N]` 去续发**:那个数组是 CLI 从 `--styles` 展开出来的(相邻同样式的 `cell_styles` 还会被合并成更大的矩形),下标与你写的 spec 项没有对应关系,也不是你能直接重发的东西。正确做法:回读受影响区域(`+cells-get --include style` / `+sheet-info`)确认哪些已生效,再重发没落上的部分。样式 / 行高列宽 / 冻结是幂等盖章(整份重发无副作用,这通常就是最省事的解法),只有 `cell_merges` 需要挑出未生效的部分单独发。
|
|
12
12
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# 飞书表格样式与配色规范
|
|
2
2
|
|
|
3
3
|
> **本文定位**:飞书表格"正确视觉输出"的取值标准与美化决策流——配色、表头、对齐、数值格式、斑马纹、列宽行高、图表展示,以及新增 / 继承 / 美化已有区域三类场景的做法。
|
|
4
|
-
> **边界**:本文只讲"样式长什么样、怎么决策";**怎么调用工具写入样式**(`cell_styles` / `border_styles` 字段、合并、resize 等参数)见 `lark-sheets-write-cells` / `lark-sheets-range-operations` / `lark-sheets-batch-update`。**条件格式**(高亮 / 标红 / 数据条 / 色阶)见 `lark-sheets-conditional-format`。本文不含 shortcut,通用编辑准则见主 SKILL.md「飞书表格编辑准则」。
|
|
4
|
+
> **边界**:本文只讲"样式长什么样、怎么决策";**怎么调用工具写入样式**(`cell_styles` / `border_styles` 字段、合并、resize 等参数)见 `references/lark-sheets-write-cells.md` / `references/lark-sheets-range-operations.md` / `references/lark-sheets-batch-update.md`。**条件格式**(高亮 / 标红 / 数据条 / 色阶)见 `references/lark-sheets-conditional-format.md`。本文不含 shortcut,通用编辑准则见主 SKILL.md「飞书表格编辑准则」。
|
|
5
5
|
|
|
6
6
|
## 最高优先级原则
|
|
7
7
|
|
|
@@ -11,18 +11,18 @@
|
|
|
11
11
|
- **美化只动样式属性,不动数据**:对**已有区域**做美化时,**只能**修改 `font` / `fill` / `border` / `alignment` / `number_format` 这 5 类样式属性。**禁止**改动原始单元格的 `value` / `formula`、合并区域、行列结构、Sheet 名称。如果美化需求需要改变数据布局(例如"汇总行加进表里"),必须把"加汇总行"和"美化"拆成两步,前者属于编辑动作、需另行得到用户授权。
|
|
12
12
|
- **不可见视觉属性也属保护对象**:原表的**合并范围、对齐方式(H-Align/V-Align)、行高列宽、数字格式**是用户能感知但不一定会明示的视觉属性。即使用户没说"保留这些",**禁止**因写入新内容而修改它们;写公式 / 写值 / 写新列时只传 `value` / `formula`,不要重置 `alignment` / `number_format` 等字段为默认值(重置等同于改动)。**例外**:用户明示要修改这些属性时(如"调整对齐 / 合并 / 列宽")才能动;用户**点名美化**("美化 / 让表清晰 / 适合打印")视同授权下节 checklist 的全部 5 个维度(含列宽行高)。
|
|
13
13
|
- **标红 / 高亮默认用背景色**:用户说"标红 / 标出来 / 高亮"时,默认改**背景色**(可叠加字体色)——背景色在人工核对与导出后都更醒目;仅当用户明确说"字体标红"才只改字体色。
|
|
14
|
-
- **打印 / 下载类任务的完成标准是导出后也无遮挡**:涉及"适合打印 / 下载 / 导出"
|
|
15
|
-
- **美化范围必须覆盖所有用户语义目标**:用户说"给表格加边框 / 美化整个表"时,范围 = 实际数据区域**含所有数据行**(含汇总行、总计行、表尾备注行),不能停在"看起来主体内容结束"的地方。落地前先用 `current_region` + 末尾 5~10 行核对真实末行(同 `lark-sheets-read-data` 的「确定数据范围的正确流程」),再设置美化范围。范围漏掉用户提到的目标行 /
|
|
14
|
+
- **打印 / 下载类任务的完成标准是导出后也无遮挡**:涉及"适合打印 / 下载 / 导出"时,飞书表格调整完行高列宽后,导出 xlsx 再检查一次无截断、无 `####`、无溢出;长文本列给足列宽并设明确行高兜底值,不要只依赖 auto。
|
|
15
|
+
- **美化范围必须覆盖所有用户语义目标**:用户说"给表格加边框 / 美化整个表"时,范围 = 实际数据区域**含所有数据行**(含汇总行、总计行、表尾备注行),不能停在"看起来主体内容结束"的地方。落地前先用 `current_region` + 末尾 5~10 行核对真实末行(同 `references/lark-sheets-read-data.md` 的「确定数据范围的正确流程」),再设置美化范围。范围漏掉用户提到的目标行 / 列视为未完成,需补齐后再交付。
|
|
16
16
|
|
|
17
17
|
## 美化任务 5 维度 checklist(用户**点名美化**——"美化 / 让表更清晰 / 适合打印"时必做;"整理"默认指数据整理,不触发本节)
|
|
18
18
|
|
|
19
|
-
当用户**点名美化**("美化 / 让表清晰 / 适合打印 / 调整样式"——"整理"不算,那是数据整理)时,**必须**遍历以下 5
|
|
19
|
+
当用户**点名美化**("美化 / 让表清晰 / 适合打印 / 调整样式"——"整理"不算,那是数据整理)时,**必须**遍历以下 5 个维度逐一落地,只做一项(如只加边框)就交付是不完整的。**已有表点名美化时,5 个维度的取值先沿用原表色系 / 对齐(继承原则优先),checklist 只补原表缺失的维度**:
|
|
20
20
|
|
|
21
21
|
1. **表头格式区分**:表头行加粗 + 背景色填充(与数据行有色差)+ 居中对齐;多行表头时全部行同步处理
|
|
22
22
|
2. **对齐方式**:文本列左对齐、数值 / 货币 / 百分比列右对齐、日期 / 分类列居中;垂直方向统一居中
|
|
23
23
|
3. **数值格式**:每列统一小数位 + 千分位(用 `number_format`);金额列统一货币符号;同一列内**禁止**出现 0 位 / 1 位 / 2 位小数混杂
|
|
24
24
|
4. **边框**:覆盖范围按上方「美化范围必须覆盖所有用户语义目标」规则(含汇总 / 总计 / 表尾说明行),内外框线清晰
|
|
25
|
-
5. **列宽 + 行高 + 自动换行**:详细规则见 `lark-sheets-range-operations` 的「写入后列宽自适应」章节(按最长字符数扩列宽 / 长文本设置 `cell_styles.word_wrap="auto-wrap"` + 调高行高 / 长数字设置 `number_format` 防科学计数法)
|
|
25
|
+
5. **列宽 + 行高 + 自动换行**:详细规则见 `references/lark-sheets-range-operations.md` 的「写入后列宽自适应」章节(按最长字符数扩列宽 / 长文本设置 `cell_styles.word_wrap="auto-wrap"` + 调高行高 / 长数字设置 `number_format` 防科学计数法)
|
|
26
26
|
|
|
27
27
|
**差异化标注场景**:用户要求"重复行 / 异常值 / 重要项视觉区分"时,标注列 / 行必须设置与普通数据**显著不同**的 `cell_styles`(背景色 + 加粗 + 字体色至少改一项),不能与普通数据格式完全一致。
|
|
28
28
|
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
|
|
58
58
|
### 4. 整体结构
|
|
59
59
|
|
|
60
|
-
-
|
|
60
|
+
- 数据行超过一屏的长表 / 宽表,收尾冻住表头(表头上方还有标题 / 说明行时一并冻住):`+dim-freeze` 或 `+styles-put` 的 `freeze` 一次给全行列(整份状态覆盖,拆两次只留最后一次的轴),再 `+sheet-info` 回读确认。原表已有冻结设置的不动。
|
|
61
61
|
- **长文本处理**:启用自动换行,行高合理调整以确保阅读舒适,添加适当垂直留白,目标是清晰、专业、不拥挤的布局。
|
|
62
62
|
- 保持表格简洁,合理分组(可用合并单元格展示分组),在适当位置添加合计或汇总行。
|
|
63
63
|
- **区域分隔**:多阶段或多类别时,使用柔和背景色块进行逻辑分区,而非简单边框。
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
5. 若工作表已无足够空间,优先向下方空白区域放置,保持图表间至少 1 行或 1 列的间距。
|
|
95
95
|
|
|
96
96
|
> 飞书表格中颜色需带 `#` 前缀(如 `#0070C0`),与 openpyxl 的无前缀写法不同。
|
|
97
|
-
> 具体工具调用参数格式,请读取对应工具 skill(`lark-sheets-write-cells`、`lark-sheets-conditional-format`、`lark-sheets-range-operations` 等)。
|
|
97
|
+
> 具体工具调用参数格式,请读取对应工具 skill(`references/lark-sheets-write-cells.md`、`references/lark-sheets-conditional-format.md`、`references/lark-sheets-range-operations.md` 等)。
|
|
98
98
|
|
|
99
99
|
---
|
|
100
100
|
|
|
@@ -145,22 +145,22 @@
|
|
|
145
145
|
- 至少读 2 行(末行 + 倒数第二行)才能判断是否有斑马纹交替色
|
|
146
146
|
- 若倒数两行背景色不同(如 #FFFFFF 与 #F3F4F6),新行按奇偶延续,不要固定一个色
|
|
147
147
|
|
|
148
|
-
> 具体继承哪些字段、怎么采样与写入(`+cells-get` 读源行 `cell_styles` + `border_styles`、`+sheet-info --include row_heights,merges` 读行高合并、带齐 6 类样式写入)见 `lark-sheets-write-cells` 的「新增列 / 新增行的样式继承」章节——`border_styles`
|
|
148
|
+
> 具体继承哪些字段、怎么采样与写入(`+cells-get` 读源行 `cell_styles` + `border_styles`、`+sheet-info --include row_heights,merges` 读行高合并、带齐 6 类样式写入)见 `references/lark-sheets-write-cells.md` 的「新增列 / 新增行的样式继承」章节——`border_styles` 四边易遗漏,以那里为准。
|
|
149
149
|
|
|
150
150
|
#### 2B. 基于模板区域的修改(copy 保留所有格式)
|
|
151
151
|
|
|
152
152
|
**核心思路:三步分层法**
|
|
153
153
|
|
|
154
154
|
```
|
|
155
|
-
Step 1 — 格式铺开:`+
|
|
155
|
+
Step 1 — 格式铺开:`+range-copy --paste-type formats`
|
|
156
156
|
└── 将模板行/区域的 **全部格式**(样式、边框、数字格式、数据验证等)复制到目标区域
|
|
157
|
-
└──
|
|
158
|
-
└── 若需连带公式平移填充(如公式列结构一致),改用 `+range-fill --series-type copy`
|
|
157
|
+
└── 即"格式刷"——只复制格式,目标值/公式保留
|
|
158
|
+
└── 若需连带公式平移填充(如公式列结构一致),改用 `+range-fill --series-type copy`
|
|
159
159
|
|
|
160
|
-
Step 2 — 内容覆写:`+
|
|
161
|
-
└──
|
|
160
|
+
Step 2 — 内容覆写:`+cells-set`(仅传 value/formula,不传任何样式)
|
|
161
|
+
└── 将每行实际数据写入,cell_styles 全部省略,因为格式已在 Step 1 中就位
|
|
162
162
|
|
|
163
|
-
Step 3 — 微调收尾:`+rows-resize --heights` / `+cols-resize --widths`(行高列宽 map 一次调用完成)、`+
|
|
163
|
+
Step 3 — 微调收尾:`+rows-resize --heights` / `+cols-resize --widths`(行高列宽 map 一次调用完成)、`+cells-{merge|unmerge}` 等
|
|
164
164
|
└── 调整行高列宽、处理合并单元格、扩展条件格式范围等边缘情况
|
|
165
165
|
```
|
|
166
166
|
|
|
@@ -172,7 +172,7 @@ Step 3 — 微调收尾:`+rows-resize --heights` / `+cols-resize --widths`(
|
|
|
172
172
|
|
|
173
173
|
**场景:纯"格式刷"(用户说"把 A 列样式应用到 B 列"、"格式复制过去"、"只刷格式不改数据")**
|
|
174
174
|
|
|
175
|
-
单步即可,无需三步分层:调用 `+range-copy --paste-type formats`,`--source-range` 为样式来源、`--target-range` 为目标起点。参数细节见 `lark-sheets-range-operations`。
|
|
175
|
+
单步即可,无需三步分层:调用 `+range-copy --paste-type formats`,`--source-range` 为样式来源、`--target-range` 为目标起点。参数细节见 `references/lark-sheets-range-operations.md`。
|
|
176
176
|
|
|
177
177
|
### 场景三:已有区域格式美化
|
|
178
178
|
|
|
@@ -207,4 +207,4 @@ Step 3 — 微调收尾:`+rows-resize --heights` / `+cols-resize --widths`(
|
|
|
207
207
|
- 美化表头/分组标题时,若需修改合并区域的范围或样式,遵循"先 `unmerge` → 修改 → 再 `merge`"顺序。
|
|
208
208
|
- 合并区域样式只写左上角,不要对合并内的其他单元格重复写入样式。
|
|
209
209
|
|
|
210
|
-
> 合并单元格完整的安全操作规则(含数据保护、样式占位等 5 条)见 `lark-sheets-range-operations` 的 `+cells-{merge|unmerge}` 章节。
|
|
210
|
+
> 合并单元格完整的安全操作规则(含数据保护、样式占位等 5 条)见 `references/lark-sheets-range-operations.md` 的 `+cells-{merge|unmerge}` 章节。
|
|
@@ -31,13 +31,15 @@
|
|
|
31
31
|
**常见配置错误(必须注意)**:
|
|
32
32
|
- **获取结构是第一步**:任何表格操作前必须先调用 `+workbook-info`,不要跳过直接操作。返回的行列数、子表列表是后续所有操作的基础
|
|
33
33
|
- **sheet_id 不要写错**:从 `+workbook-info` 返回值中精确获取 `sheet_id`,不要手动拼写或从 URL 中猜测
|
|
34
|
-
-
|
|
34
|
+
- **未点名网格目标**:默认候选仅 `resource_type=sheet && is_hidden=false` 的可见普通网格;唯一候选才自动选,多候选按用户给的表名/表头/内容匹配,仍不唯一则询问。禁止按 `index` 或猜 `Sheet1`;用户显式点名 hidden sheet 可操作,bitable / `#UNSUPPORTED_TYPE` 改走对应产品 API。
|
|
35
|
+
- **xlsx 验收触发边界**:普通在线交付不导出。只有用户明确要求本地 xlsx / 下载 / 打印时,才在 `--output-path` 导出后验收;本地 Excel 输入则直接验证导入前已有的本地文件,导入在线后不再导出回验。允许触发时确认文件存在、可重开,并核对公式错误值、样式和对象。
|
|
35
36
|
|
|
36
37
|
## Shortcuts
|
|
37
38
|
|
|
38
39
|
| Shortcut | Risk | 分组 |
|
|
39
40
|
| --- | --- | --- |
|
|
40
41
|
| `+workbook-info` | read | 工作簿 |
|
|
42
|
+
| `+sheet-list` | read | 工作簿 |
|
|
41
43
|
| `+revision-get` | read | 工作簿 |
|
|
42
44
|
| `+sheet-create` | write | 工作簿 |
|
|
43
45
|
| `+sheet-delete` | high-risk-write | 工作簿 |
|
|
@@ -61,6 +63,12 @@ _公共:URL/token(无 sheet 定位) · 系统:`--dry-run`_
|
|
|
61
63
|
|
|
62
64
|
_仅含公共 / 系统 flag。_
|
|
63
65
|
|
|
66
|
+
### `+sheet-list`
|
|
67
|
+
|
|
68
|
+
_公共:URL/token(无 sheet 定位) · 系统:`--dry-run`_
|
|
69
|
+
|
|
70
|
+
_仅含公共 / 系统 flag。_
|
|
71
|
+
|
|
64
72
|
### `+revision-get`
|
|
65
73
|
|
|
66
74
|
_公共:URL/token(无 sheet 定位) · 系统:`--dry-run`_
|
|
@@ -152,7 +160,7 @@ _系统:`--dry-run`_
|
|
|
152
160
|
| `--title` | string | required | 新 spreadsheet 标题 |
|
|
153
161
|
| `--folder-token` | string | optional | 目标文件夹 token;省略时放在云空间根目录 |
|
|
154
162
|
| `--values` | string + File + Stdin(简单 JSON) | optional | untyped 初始数据,一个 JSON 二维数组(表头并入第一行):`[["列A","列B"],["alice",95]]`;值原样写入、类型由飞书自动识别(日期 / 数字会落成文本,需类型保真改用 --sheets),走与 --sheets 相同的分批 `+cells-set`;配 --styles 控制格式/颜色/合并/行列尺寸 |
|
|
155
|
-
| `--sheets` | string + File + Stdin(复合 JSON) | optional | 建表后写入的 typed 表格协议 JSON(同 +table-put):顶层 `{"sheets":[...]}`,每个数组项是一张子表 `{name, start_cell?, mode?, header?, allow_overwrite?, columns:["colA","colB",...], data:[[...]], dtypes?:{colA:pandasDtype, ...}, formats?:{colA:numberFormat, ...}}` —— `name` 与外层 `sheets` 数组都不可省。Agents 用 `scripts/
|
|
163
|
+
| `--sheets` | string + File + Stdin(复合 JSON) | optional | 建表后写入的 typed 表格协议 JSON(同 +table-put):顶层 `{"sheets":[...]}`,每个数组项是一张子表 `{name, start_cell?, mode?, header?, allow_overwrite?, columns:["colA","colB",...], data:[[...]], dtypes?:{colA:pandasDtype, ...}, formats?:{colA:numberFormat, ...}}` —— `name` 与外层 `sheets` 数组都不可省。Agents 用 `scripts/lark_sheets_df.py` 的 `df_to_sheet(df, name)` 把 DataFrame 转成一项再包 `{"sheets":[...]}`。与 --values 互斥;新表默认子表复用为第一个子表,日期/数字类型保真。 |
|
|
156
164
|
| `--styles` | string + File + Stdin(复合 JSON) | optional | 建表时同时写入的视觉处理操作 JSON:顶层 `{styles:[...]}`,每项对应一个目标子表、含 `name`,并至少给 `cell_styles` / `row_sizes` / `col_sizes` / `cell_merges` 之一。`cell_styles` 用 A1 单元格 range + 扁平样式字段(字段同 +cells-set-style,含 number_format / 颜色 / 对齐 / border_styles);row/col sizes 用行/列范围 + type/size;merges 用单元格 range + 可选 merge_type。与 --sheets 搭配时 styles 数组长度/顺序/name 必须与 --sheets.sheets 对应;与 --values 搭配时只给一个 styles 项(其 name 忽略)。完整 cell_styles 字段结构跑 `+workbook-create --print-schema --flag-name styles`。 |
|
|
157
165
|
|
|
158
166
|
### `+workbook-export`
|
|
@@ -225,6 +233,8 @@ _一个或多个子表的 typed 数据,每个数组元素写入一张子表;
|
|
|
225
233
|
|
|
226
234
|
新建电子表格,可选预填数据。两种数据入口(untyped `--values` / typed `--sheets` JSON)**互斥**,按需选一——两者都走同一条分批写入:
|
|
227
235
|
|
|
236
|
+
> ⚠️ **`--title` 必填,且不会从数据里推断**:它是这张表在云空间里的名字,漏了会在建表之前就失败(`required flag(s) "title" not set`),数据一行都不会写。子表名写在 `--sheets` 的 `name` 字段里,两者是两码事——`--title "2026年Q3销售分析"` 配 `--sheets` 里的 `"name": "明细"`。
|
|
237
|
+
|
|
228
238
|
```bash
|
|
229
239
|
# 1) untyped:--values(一个二维数组,表头并入第一行;值原样写、类型由飞书自动识别,
|
|
230
240
|
# 日期会落成文本,配 --styles 控制格式)
|
|
@@ -245,8 +255,11 @@ lark-cli sheets +workbook-create --title "交易" --sheets '{
|
|
|
245
255
|
|
|
246
256
|
`--sheets` 协议与 `+table-put` 完全同构(字段含义见 lark-sheets-write-cells 的 `+table-put`,大 payload 走 stdin / `@file`)。关键差异:**新建工作簿的默认子表会被复用为第一个子表**(重命名后承载数据),不会残留空 `Sheet1`;其余子表按需新建。它把 `+table-put` 单独做不到的"建表 + typed 写入"合到一条命令,是「pandas 算完直接落地一张带真日期的新表」的首选。回读校验用 `+table-get`(与 `--sheets` 同构、可 round-trip)。
|
|
247
257
|
|
|
248
|
-
> 💡 pandas DataFrame 走 `--sheets`
|
|
258
|
+
> 💡 pandas DataFrame 走 `--sheets` 时直接 `from lark_sheets_df import df_to_sheet`([`scripts/lark_sheets_df.py`](../scripts/lark_sheets_df.py),与 `+table-put` 共用同一份 helper),多子表场景 helper 优势更明显:
|
|
249
259
|
> ```python
|
|
260
|
+
> import sys; sys.path.insert(0, "scripts") # cwd 不在 skill 根时改成 scripts/ 的实际路径
|
|
261
|
+
> from lark_sheets_df import df_to_sheet
|
|
262
|
+
>
|
|
250
263
|
> payload = {"sheets": [df_to_sheet(income, "Income Statement"),
|
|
251
264
|
> df_to_sheet(balance, "Balance Sheet"),
|
|
252
265
|
> df_to_sheet(cashflow, "Cash Flow")]}
|
|
@@ -332,9 +345,11 @@ lark-cli sheets +workbook-import --file ./report.csv --folder-token <FOLDER_TOKE
|
|
|
332
345
|
|
|
333
346
|
- **不接受任何 spreadsheet / sheet 定位 flag**(它是新建,不操作已有表):只有 `--file`(必填)/ `--folder-token` / `--name`。
|
|
334
347
|
- **`--file` 只接受当前工作目录内的相对路径**:先 `cd` 到文件所在目录(或 workspace),再传 `./file.xlsx` / `data/file.xlsx`;传 `/home/.../file.xlsx`、`C:\...\file.xlsx` 这类绝对路径会被判定 `unsafe file path` 拒绝。
|
|
335
|
-
-
|
|
348
|
+
- 导入成功后把新表链接通过宿主的产物交付工具交出去,并确认这次调用返回成功;只写进回复正文不算交付。
|
|
336
349
|
- 本地表格文件 → 飞书电子表格一律用本命令,**不要**用 `drive +import` 导电子表格——它是 sheets 之外的通用导入、还需额外指定 `--type`,绕路且更易错。只有要把本地表格导入成**多维表格**(bitable)时,才改用 `lark-cli drive +import --type bitable`。
|
|
337
|
-
- 返回 `token` / `url
|
|
350
|
+
- 返回 `token` / `url` / `ticket` / `ready` / `job_status`。只有 `ready=true` 且 `job_status=0` 才算导入完成;随后用新 URL 调 `+workbook-info`,有点名内容契约时再回读关键 sheet/range。`timed_out=true` 时按 `next_command` 续查,不能交付为成功。
|
|
351
|
+
- **值与公式保真,版式不保真**:走一圈后值、公式、数字格式、合并区、冻结、下拉校验都原样保留;行高列宽、边框、主题色填充(`fgColor theme=N`)、以及**跟随工作簿默认字体的格**(源表默认字体是中文字体时,这类格会回落到系统默认)则会变,与本轮做了什么无关。要求保留原版式时,导入后按源文件的值用 `+rows-resize` / `+cols-resize` 回写尺寸(飞书用像素、Excel 行高用磅,换算约 `px ≈ pt × 4/3`),其余版式差异回写不了,在交付说明里写明。
|
|
352
|
+
- 轮询是命令自己做的:本命令与其它异步 shortcut 都内置轮询,返回时状态已是最新,`next_command` 直接重跑即可,不必也不要加 `sleep` 等待。
|
|
338
353
|
|
|
339
354
|
### `+workbook-export`
|
|
340
355
|
|
|
@@ -354,7 +369,7 @@ lark-cli sheets +workbook-export --url "..." --output-path ./downloads/
|
|
|
354
369
|
lark-cli sheets +workbook-export --url "..." --file-extension csv --sheet-id "$SID" --output-path ./sheet.csv
|
|
355
370
|
```
|
|
356
371
|
|
|
357
|
-
> ⚠️ **默认不下载**:省略 `--output-path`
|
|
372
|
+
> ⚠️ **默认不下载**:省略 `--output-path` 时只创建并轮询导出任务。普通在线交付不得为了内部验证主动导出;只有用户明确要求本地 xlsx / 下载 / 打印时才给 `--output-path` 并验收。验收时确认文件存在、可重开,并核对公式错误值、样式和对象。
|
|
358
373
|
>
|
|
359
374
|
> **与 `drive +export --doc-type sheet` 的关系**:本 wrapper 是它的特化封装,固定 `--doc-type sheet`,并把 drive 的 `--output-dir` / `--file-name` / `--overwrite` 三 flag 折叠成单一 `--output-path` 简化常见用例。代价是默认值不同:`drive +export` 默认下载到当前目录、本 wrapper 默认不下载。需要细控目录/文件名/是否覆盖的,回退到 `drive +export --doc-type sheet`。
|
|
360
375
|
|
|
@@ -420,4 +435,4 @@ lark-cli sheets +sheet-hide-gridline --url "..." --sheet-id "$SID"
|
|
|
420
435
|
|
|
421
436
|
- `Validate`:XOR 公共四件套;`+sheet-create` 校验 `--title` 非空、`--row-count` ≤ 50000、`--col-count` ≤ 200;`+sheet-delete` 必须 `--yes` 或 `--dry-run`;`+workbook-create` 的 `--sheets` 与 `--values` **互斥**,给了 `--sheets` 则按 typed 协议校验 payload(其余约束同 `+table-put`)。
|
|
422
437
|
- `DryRun`:`+sheet-*` 写操作输出"将要 PATCH 的 sheet metadata";`--sheet-name` 在 dry-run 输出里生成为 `<resolve:Sheet1>` 占位符,不实际解析为 sheet-id。
|
|
423
|
-
- `Execute
|
|
438
|
+
- `Execute`:sheet create/rename/move/copy/hide/unhide/delete 后必须调用 `+workbook-info`,按稳定的 sheet_id 核对名称、顺序、可见性与数量;import 按上方 ready/job_status + workbook-info 闭环;需要本地文件的 export 按 output-path + 文件存在/可重开闭环。
|
|
@@ -4,30 +4,39 @@
|
|
|
4
4
|
|
|
5
5
|
1. **明确写入边界**:写入前建议能回答"目标 range 的起止行列号是多少?是否落在用户授权范围内?"。除用户明示要修改的区域外,避免扩张到原数据列以外或新建 Sheet。
|
|
6
6
|
2. **完整性断言**:批量写入前建议把"预期写入条数"硬编码到代码里(如要填 106 条翻译 → `expected = 106`),写完后回读比较 `actual == expected`。少于预期时优先补齐,补不齐则在交付说明里列出缺口。
|
|
7
|
-
3. **回读抽样校验**:写完关键值 /
|
|
7
|
+
3. **回读抽样校验**:写完关键值 / 普通公式后,用 `+csv-get` 或 `+cells-get` 重新读取写入区域,至少抽样 3-5 个代表性单元格(首 / 中 / 末),核对值与预期一致(与本地脚本计算的预期值对照)。AI 公式的计算状态不要先用 `+cells-get` 轮询,直接按 `references/lark-sheets-formula-verify.md` 的 `+formula-verify --ai-only --range` 全区间一次异步状态检查规则处理。公式特定的"先验证模板再 --copy-to-range / 修完再读回"细则见下方相关章节。
|
|
8
8
|
4. **护原表 · 派生产物落点(写排名 / 标记 / 汇总 / 改写列时易丢数据)**:派生结果优先写到**真实末列 +1 的全新空列**或新建子表,避免复用任何已有原数据列——哪怕该列看起来"空",也要先 `+csv-get` 回读确认整列无原始数据再写。三条准则:① 尽量不把新公式 / 新值写进原数据列(典型反例:把新算的排名公式写进了原本存放另一份原始数据的列,整列原始数据被覆盖丢失);② 尽量不改写、不合并原表头字段名(典型反例:把几个独立表头字段合并成一列,原字段名丢失);③ 慎用 `--allow-overwrite`:它一旦让写入区盖到相邻原始列 / 行就是不可逆数据丢失,加它之前建议用 `+sheet-info` / `+csv-get` 核清目标 range 不含任何原始数据。
|
|
9
9
|
|
|
10
10
|
## 新增列 / 新增行的样式继承(防止视觉风格不一致)
|
|
11
11
|
|
|
12
|
-
新增列 /
|
|
12
|
+
新增列 / 新增行时,先铺样式再写值,分两步——避免只传 `value` 期望默认样式与原表一致(飞书新单元格默认对齐通常是 `H:right, V:bottom`,与多数原表的 `H:center, V:middle` 不一致)。
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
**推荐做法(一步到位)**:用 `+range-copy --paste-type formats` 把相邻原列/原行的样式复制到目标区域,再写值。`--paste-type formats` 只复制样式不动值。目标区域尺寸由**源区域**推断,`--target-range` 只给目标左上角锚点单元格;要铺满整列,源区域就要覆盖整列(如 `C1:C100`)。命令要带完整定位(`--url`/`--spreadsheet-token` 与 `--sheet-id`/`--sheet-name` 各一):
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
```bash
|
|
17
|
+
# 新列 D — 把 C 列的样式铺到 D 列(源 100 行 → 目标从 D1 起 100 行)
|
|
18
|
+
lark-cli sheets +range-copy --url "<表格URL>" --sheet-name "<真实表名>" \
|
|
19
|
+
--source-range "C1:C100" --target-range "D1" --paste-type formats
|
|
20
|
+
|
|
21
|
+
# 新行 20 — 把第 19 行的样式铺到第 20 行
|
|
22
|
+
lark-cli sheets +range-copy --url "<表格URL>" --sheet-name "<真实表名>" \
|
|
23
|
+
--source-range "A19:Z19" --target-range "A20" --paste-type formats
|
|
24
|
+
```
|
|
22
25
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
|
|
26
|
+
目标锚点 + 源尺寸决定落区,无需在 `--target-range` 里写出完整范围。参数细节见 `references/lark-sheets-range-operations.md`。
|
|
27
|
+
|
|
28
|
+
**手动做法(需要精确控制时)**:先用 `+cells-get --include style` 读相邻单元格的完整样式作为模板,再在 `+cells-set` 的 `--cells` 里逐格携带 `cell_styles`。需要继承的字段清单:
|
|
29
|
+
|
|
30
|
+
1. `cell_styles.font_family` / `cell_styles.font_size` / `cell_styles.font_weight` / `cell_styles.font_color` / `cell_styles.font_style`
|
|
31
|
+
2. `cell_styles.horizontal_alignment` / `cell_styles.vertical_alignment` — 漏继承会导致新列对齐与原列不一致(常见)
|
|
32
|
+
3. `cell_styles.number_format` — 漏继承会导致同列数值格式混乱
|
|
33
|
+
4. `cell_styles.background_color`
|
|
34
|
+
5. `border_styles`
|
|
35
|
+
6. **`merged_cells`(合并范围)**——续写场景必查:用 `+sheet-info --include merges` 读原数据区域的合并信息。原行有跨列合并时,新行用 `+cells-{merge|unmerge}` 复制相同合并模式。仅传 cells 数组的样式不够——合并范围要单独靠 `+cells-{merge|unmerge}` 落地。
|
|
27
36
|
|
|
28
37
|
**反模式**(风险):
|
|
29
38
|
- 只传 `{"value": "四级菜单"}` 给 D1,不传 `cell_styles` → D1 默认非加粗、非居中,与 A1/B1/C1 风格断裂
|
|
30
|
-
- 新列 M5 写入 `=SUM(F5:L5)` 时只传 `formula
|
|
39
|
+
- 新列 M5 写入 `=SUM(F5:L5)` 时只传 `formula`,不传样式 → M 列对齐变 `H:right`,数字格式变默认
|
|
31
40
|
|
|
32
41
|
## 长数字防科学计数法(数值列写入必查)
|
|
33
42
|
|
|
@@ -45,14 +54,20 @@
|
|
|
45
54
|
|
|
46
55
|
> **数字还是文本,按"数据本质是量值还是标识符"二选一 —— 不看当下要不要计算**:金额 / 百分比 / 比率 / 计数 / 度量这类**本质是量值**的数据,优先以**数字类型**写入(百分比存小数 `0.54` 配 `number_format:"0%"`),避免设 `@` 文本格式。**这与"用户当下是否要排序 / 求和"无关**——数据类型由数据本质决定、不由当下用途决定:表格数据几乎总会被后续排序 / 图表 / 二次计算复用,`"54%"` 文本与数值列混排本就破坏一致性,且数字 + `number_format` 显示效果与文本**完全相同**,没有任何理由选文本。**最常见的误判就是"这只是 leaderboard / 报表 / 看板展示,又不用算,写成 `54%` 字符串就行"——这是错的,展示用途不改变"百分比是数值"的事实。**(`+table-put` 用 `dtypes` 声明 `int64` / `float64`;版式 `+table-put` 装不下时用 `+cells-set` 传数字 + `number_format`;都别在本地拼成带 `$` / `%` 的字符串走 `+csv-put`。)反过来,编号 `001`、规格 `3-1`、身份证 / 电话 / 单据号等**本质是标识符 / 标签**、要原样保留不被飞书自动解释的内容(否则 `001`→`1`、`3-1`→日期、点分日期 `12.10`→`12.1`(尾零丢失)、长号→科学计数),才以**字符串类型**写入(`dtypes` 设 `object`)并把 `number_format` 设为 `"@"`(文本格式),字面保真。
|
|
47
56
|
|
|
57
|
+
**typed 列必须显式声明类型**:金额、百分比、日期、布尔、计数,以及后续参与排序 / 聚合 / 图表的量值列,在 `+table-put` 的 `dtypes` 中逐列声明类型,并用 `formats` 控制显示;不要依赖字符串外观或自动猜型。纯文本/标识符表可全部声明 `object`。mixed 列先保留原值并新增清洗结果/失败标记,统计总数、成功、失败和空值;均值/比例必须说明分母,禁止静默把失败值丢掉后改变口径。
|
|
58
|
+
|
|
59
|
+
**追加数据**:普通表尾追加直接用 `+table-put` 的 `mode:"append"`,它会自动定位末行;只有用户明确要求在中间物理插行、继承模板区块或扩展合并结构时,才先用 `+dim-insert`。
|
|
60
|
+
|
|
48
61
|
## 使用场景
|
|
49
62
|
|
|
50
63
|
写入。向飞书表格的单元格区域写入值、公式、样式、批注、图片或下拉,也可批量写入 CSV / DataFrame。本 reference 覆盖 6 个 shortcut,按数据来源 + 内容形态选:
|
|
51
64
|
|
|
65
|
+
> ⚠️ **计算结果默认写公式,不写静态值**:需要计算得出的数字 / 统计量 / 排名 / 占比,默认写公式到单元格,不要用 Python 算好数值再硬编码写入。公式优先原则的例外:外部抓取数据、永不变化的常量、循环引用。
|
|
66
|
+
|
|
52
67
|
| 场景 | 用这个 shortcut | 原因 |
|
|
53
68
|
|------|----------------|------|
|
|
54
69
|
| 模型手里已经有 CSV 文本(小规模手动构造、从 `+csv-get` 取到后简单加工) | `+csv-put` | 直接传 CSV 文本 + `--start-cell`,不用自己拼二维 cells 数组;必要时自动扩容行列 |
|
|
55
|
-
| 列里有数值语义的数据(数字 / 金额 / 百分比 / 日期 / 计数)→ 飞书,要类型保真(来源不限:DataFrame、Counter、dict、list 都算) | `+table-put` | typed
|
|
70
|
+
| 列里有数值语义的数据(数字 / 金额 / 百分比 / 日期 / 计数)→ 飞书,要类型保真(来源不限:DataFrame、Counter、dict、list 都算) | `+table-put` | typed 协议每项必含 `name/columns/data`,可带 `start_cell/mode/header/allow_overwrite/dtypes/formats`;数值语义列显式声明 `dtypes`,`formats` 控制千分位 / 百分比 / 日期。date 落真日期、数值列可排序 / 求和 / 入图表,string 保前导零,多 sheet 一次写 |
|
|
56
71
|
| 写入含样式、批注、图片、数据校验等任意富写入 | `+cells-set` | 唯一支持完整富字段的 shortcut(公式 `+csv-put` 也能写) |
|
|
57
72
|
| 只改已有 cell 的样式,不动 value/formula | `+cells-set-style` | 拍平 10 个样式字段为独立 flag;不触发不必要的值写入 |
|
|
58
73
|
| 单 cell 嵌入图片 | `+cells-set-image` | 比 `+cells-set` 参数更简短 |
|
|
@@ -61,7 +76,7 @@
|
|
|
61
76
|
|
|
62
77
|
**选命令按内容形态分流(不设"默认首选")**:① 列有数值语义(金额 / 百分比 / 日期 / 计数)→ `+table-put`(`dtypes` 声明类型 + `formats` 设展示格式),版式装不下时 → `+cells-set` 传数字 + `number_format`;② 要样式 / 批注 / 图片 / 富文本 → `+cells-set`;③ **仅**全文本、无数值语义的内容平铺 → `+csv-put`(入参最短)。判据详见上方「数字还是文本」。
|
|
63
78
|
|
|
64
|
-
⚠️ `+csv-put` 可写值或公式:以 `=` 开头的单元格会被当作公式计算(读回时 `formula` 字段保留、`value` 为计算结果)。**公式内部含逗号 / 引号 / 换行时建议按 RFC 4180 转义**——含逗号的字段整格用双引号包裹、字段内部的引号再翻倍:如 `=COUNTIF(D5:D22,"及格")` 建议写成 `"=COUNTIF(D5:D22,""及格"")"
|
|
79
|
+
⚠️ `+csv-put` 可写值或公式:以 `=` 开头的单元格会被当作公式计算(读回时 `formula` 字段保留、`value` 为计算结果)。**公式内部含逗号 / 引号 / 换行时建议按 RFC 4180 转义**——含逗号的字段整格用双引号包裹、字段内部的引号再翻倍:如 `=COUNTIF(D5:D22,"及格")` 建议写成 `"=COUNTIF(D5:D22,""及格"")"`。漏转义会被 CSV 解析器按逗号拆列、整块写入区域错位。**因此含逗号 / 引号 / 换行的公式优先用 `+cells-set`**;`+table-put` 不支持公式字段。
|
|
65
80
|
|
|
66
81
|
⚠️ **`+csv-put` 会把数值落成文本**:把金额 / 百分比 / 计数等在本地拼成带 `$` / `%` / 千分位的字符串(如 `"$1,234.50"` / `"+30.5%"`)再 `+csv-put` 灌进去,单元格就是**文本**——丢失排序 / 求和 / 图表能力,且与数值列混排无法参与计算。数值该怎么写、何时 `+table-put`、版式装不下时何时退 `+cells-set` 传数字 + `number_format`,判据与分流见上方「数字还是文本」;核心一句:**准备把数字 format 成字符串再写时就是走错了路,数值一律以数字写入 + `number_format` 控制显示。**
|
|
67
82
|
|
|
@@ -73,16 +88,17 @@
|
|
|
73
88
|
|
|
74
89
|
> 以下是用 `+cells-set`(及 `+cells-set-style`)做富写入时的常用模式与准则;选哪个 shortcut 见上方「使用场景」。
|
|
75
90
|
|
|
76
|
-
`+cells-set` 为一块区域设置值 / 公式 / 批注 / 样式,也支持 `rich_text` 的 `type: "embed-image"` 嵌入单元格图片。**关键:`--cells` 恒为二维数组(行 × 格),单格也是 `[[{"value":…}]]
|
|
91
|
+
`+cells-set` 为一块区域设置值 / 公式 / 批注 / 样式,也支持 `rich_text` 的 `type: "embed-image"` 嵌入单元格图片。**关键:`--cells` 恒为二维数组(行 × 格),单格也是 `[[{"value":…}]]`;裸 `--range A1`(或 `--start-cell`)是左上角**锚点**,落区由 `--cells` 自身的行列数决定;写成矩形(`A1:B2`)则是**边界**——数组比它小会收窄,比它大会被拒绝,而不是写到范围之外**。
|
|
77
92
|
|
|
78
|
-
> **单元格图片 vs
|
|
93
|
+
> **单元格图片 vs 浮动图片**:图若**属于某条记录、要随那行排序 / 筛选 / 增删**(凭证 / 证件照 / 每行配图,话里带「对应 / 每行 / 这列」等绑定词)→ **单元格图片**(本工具):用 `+cells-set-image`(最短)或 `+cells-set` 的 `rich_text` + `type: "embed-image"`。只是自由摆放的装饰(logo / 水印 / 封面)→ 浮动图片,见 lark-sheets-float-image。别因「浮动图更好控制 / 更熟」默认选浮动图——它承载"对应某记录"的图会随增删行 / 排序错位。
|
|
79
94
|
|
|
80
95
|
常用模式(推荐,避免逐行写入替代):
|
|
81
96
|
|
|
82
97
|
- 整列公式:先在 `H2` 写一个公式,再用 `--copy-to-range "H2:H100"` 或 `--copy-to-range "H:H"` 向下填充。避免对每一行单独调用 `+cells-set` 写入相同结构的公式
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
-
|
|
98
|
+
- 整列样式:使用 `+cells-set-style` 或 `+styles-put` 指定目标 range;不要用 `--copy-to-range` 纯刷样式
|
|
99
|
+
- 首行样式:同上,直接对 `1:1` 或实际表头 range 设置样式
|
|
100
|
+
- 用户说”这列 / 整列 / 这行 / 首行 / 向下复制公式”时,值/公式填充用模板格 + `--copy-to-range`;只改样式用 `+cells-set-style` / `+styles-put`
|
|
101
|
+
- 多区域写入相同值/公式结构时,优先写一个模板,再用 `--copy-to-range` 复制;仅样式相同仍走样式命令
|
|
86
102
|
|
|
87
103
|
⚠️ **`--copy-to-range` 复制的是模板格的全部内容(值 + 公式 + 样式),不是只复制样式**:目标区域**已有值**时不要用它"刷样式"——会把整个区域的值覆盖成模板格的值(65 个格子全变成同一个数的事故就是这么来的)。只改样式、值 / 公式不动,用 `+cells-set-style` / `+cells-batch-set-style`;`--copy-to-range` 只用于目标区为空或本就要写同构公式 / 值的场景。
|
|
88
104
|
|
|
@@ -90,7 +106,7 @@
|
|
|
90
106
|
|
|
91
107
|
⚠️ **逐行写入公式是常见低效写法**:对每一行单独调用 `+cells-set` 写公式(如 26 次)既慢又易错,且不会自动平移公式引用。正确做法是 1 次模板写入 + 1 次 `--copy-to-range`(公式引用自动平移)。
|
|
92
108
|
|
|
93
|
-
💡 **多个不连续区域写入(批量修公式的正解)**:散布多处(可跨 sheet)的值 / 公式写入,用 `--writes` 一次批量交付(fail-fast,失败后先回读再补发)——每项 `{sheet_name, range, cells}
|
|
109
|
+
💡 **多个不连续区域写入(批量修公式的正解)**:散布多处(可跨 sheet)的值 / 公式写入,用 `--writes` 一次批量交付(fail-fast,失败后先回读再补发)——每项 `{sheet_name, range, cells}`(跨 sheet 的项把 sheet 定位写在项里,项内没写则取顶层 `--sheet-name` / `--sheet-id`),不要为此拼 `+batch-update` 的 `--operations`,也不要逐区域多次调用(多次往返、中途失败难恢复):
|
|
94
110
|
|
|
95
111
|
```bash
|
|
96
112
|
lark-cli sheets +cells-set --url "..." --writes - <<'JSON'
|
|
@@ -103,18 +119,9 @@ JSON
|
|
|
103
119
|
|
|
104
120
|
范围级统一样式不在 `--writes` 里做(cells 逐格 `cell_styles` 仅用于逐格差异化),写完接 `+styles-put`。
|
|
105
121
|
|
|
106
|
-
💡 **写入公式前先按迁移规则改写**:如果公式来自 Excel 或包含数组场景,先读取并遵循 `lark-sheets-formula-translation` 的规则完成改写,再把最终公式写入 `formula` 字段。
|
|
107
|
-
|
|
108
|
-
💡 **内容与样式分离写入(推荐)**:当需要同时写入内容和样式时,`cells` 中每个单元格都带上 `cell_styles` / `border_styles` 会导致入参非常冗长。由于同一区域的样式通常高度重复(如整列统一背景色、统一边框),推荐拆成两步:
|
|
109
|
-
1. **先写内容**:`+cells-set` 只传 `value` / `formula`,不带样式,`cells` 入参精简。⚠️ 这里"不带样式"指暂不带 `cell_styles`,**不是**降级用 `+csv-put` 铺文本——数值列(百分比 / 金额 / 计数)仍建议以数字写入(百分比传 `0.44`):样式能后补,数据类型不能后补(见上方「数字还是文本」)。
|
|
110
|
-
2. **再批量刷样式**:用 `+styles-put` 对整个区域声明统一样式(可与合并 / 行高列宽 / 冻结同一份规格交付,见 `lark-sheets-styles-put`)。**不要**在这一步用模板格 `--copy-to-range` 刷样式——第 1 步已写入的各行值会被模板格的值整片覆盖(见上方 ⚠️);`--copy-to-range` 只适用于目标区本就要写同构值 / 公式的场景
|
|
122
|
+
💡 **写入公式前先按迁移规则改写**:如果公式来自 Excel 或包含数组场景,先读取并遵循 `references/lark-sheets-formula-translation.md` 的规则完成改写,再把最终公式写入 `formula` 字段。
|
|
111
123
|
|
|
112
|
-
|
|
113
|
-
```
|
|
114
|
-
Step 1: `+cells-set` — range="A2:A100", cells 只含 value(无样式,入参短)
|
|
115
|
-
Step 2: `+styles-put` — 对 A2:A100 声明统一的 fill + border 样式
|
|
116
|
-
```
|
|
117
|
-
这比在 99 个单元格中都重复写样式 JSON 高效得多。
|
|
124
|
+
💡 **内容与样式分离写入**:当同一区域样式高度重复时,先按正确类型写内容,再用 `+cells-set-style` 或 `+styles-put` 对目标范围补样式;不要用 `--copy-to-range` 纯刷样式,它会连模板值 / 公式一起复制。只有目标区为空或本就要复制同构公式 / 值时,才使用模板单元格 + `--copy-to-range`。
|
|
118
125
|
|
|
119
126
|
💡 **样式更新是「部分合并」,不是整体覆盖**:`+cells-set-style` / `+styles-put`(以及 `+cells-set` 的 `cell_styles` / `border_styles`)只改你**显式传入**的样式属性,未传的属性保留原值。两个实用推论:
|
|
120
127
|
- **可分层叠加**:对同一区域先刷字体色、再单独刷背景色、再单独刷边框,后一步不会清掉前一步——美化已有区域时无需一次带齐所有字段,可拆成多次窄调用。
|
|
@@ -131,17 +138,18 @@ Step 2: `+styles-put` — 对 A2:A100 声明统一的 fill + border 样式
|
|
|
131
138
|
|
|
132
139
|
> 用户说"样式和原表一致 / 保持原表格式 / 边框继承"时同理:`cell_styles` 只覆盖字体和对齐、**不含边框**,边框建议用独立 `border_styles` 字段传——完整继承清单见上方「新增列 / 新增行的样式继承」。
|
|
133
140
|
|
|
134
|
-
⚠️
|
|
135
|
-
1.
|
|
136
|
-
2.
|
|
137
|
-
3.
|
|
138
|
-
4.
|
|
139
|
-
5.
|
|
140
|
-
6.
|
|
141
|
-
7.
|
|
142
|
-
8.
|
|
141
|
+
⚠️ **公式写入后必须完成验证(后端不会报全部语法 / 运行错误)**:`+cells-set` 写公式时,即便公式有括号不配对(如 `=IFERROR(VALUE(MID(D5,3,4))), 0)` 比 IFERROR 多一个 `)`)或用了飞书不支持的函数(如 `GOOGLETRANSLATE` / `CUBEVALUE`),**后端工具也可能返回 `updated_cells_count=N, rc=0` 的"成功"**——错误会静默写进单元格显示为 `#VALUE!` / `#NAME?` / `#REF!`。因此:
|
|
142
|
+
1. **写完立即回读**:`+cells-set` 后紧跟 `+csv-get`(或 `+cells-get`)读目标范围首、中、末及汇总行,检查错误值并核对 `formula`;AI 公式在这一步只做**一次**公式文本核对(`+cells-get --include formula` 看种子格 / 首格,确认引号 / 括号没在 shell / CSV / JSON 层被破坏、落进去的确实是 `=AI(...)`),不要用它轮询计算结果——计算状态走 `+formula-verify --ai-only`
|
|
143
|
+
2. **逐段运行诊断**:对本次新增 / 修改的公式范围调用 `+formula-verify --exit-on-error`;`partial` 拆小续扫,全部分段 `status='success'` 后才完成。AI 公式不套这条:改用 `+formula-verify --ai-only` 按全区间一次异步状态检查规则交付(`failed` / `unsupported` 先修,只剩 pending 可交付并说明后台仍在计算,详见 `references/lark-sheets-formula-verify.md`)
|
|
144
|
+
3. **看到 `#` 开头的错误值**立即修公式:`#NAME?` 多半是函数名拼错或用了飞书不支持的函数(如 `GOOGLETRANSLATE` / CUBE 系列;注意 `UNIQUE` / `FILTER` 飞书是支持的);`#VALUE!` 多半是类型不匹配或括号错位;`#REF!` 是引用错误;`~CIRCULAR~REF~` 是循环引用(公式引用了自身或会闭环)
|
|
145
|
+
4. **`--copy-to-range` 扩展前先验证模板**:模板单元格公式自己都算错,`--copy-to-range` 复制到 100 行就是 100 个错误
|
|
146
|
+
5. **去重 / 筛选函数**:飞书**支持** `UNIQUE` / `FILTER`(原生数组函数,详见 `references/lark-sheets-formula-translation.md`),可直接用;`DISTINCT` 不是飞书函数,去重用 `UNIQUE`。大数据量去重 / 分组也可用透视表(`+pivot-{create|update|delete}`,值字段聚合方式选 count)
|
|
147
|
+
6. **循环引用预检**:写聚合公式(SUM / AVERAGE / COUNT 等)前建议明确**引用范围不包含目标单元格自身或其传递依赖**。典型反例:在 C3 写 `=SUMIF(B:B,LEFT(B3,9)&"*",C:C)`,B 列匹配 B3 前 9 位时 C3 自己也命中,导致 C3 自引用 → `~CIRCULAR~REF~`。修法:用辅助列 / 显式排除自身(`SUMIFS(C:C, B:B, ..., A:A, "<>"&A3)`)/ 缩小范围避开自己
|
|
148
|
+
7. **文本提取公式的覆盖率验证**:用 `LEFT` / `MID` / `FIND` / `SUBSTITUTE` / `TEXTSPLIT` 等从文本里抠数据前,建议用本地脚本在**整列源数据**上跑一遍命中率统计(`df[col].str.contains(pattern).mean()`);命中率 < 100% 时优先补分支(IFS / 多个 IFERROR 串联)兜底,或改用本地脚本算好写静态值,**避免**只覆盖样本前 N 行就交付(典型反例:按"长123"这种带前缀的尺寸文本取数,对"宽×高"、"×"、"*"等其它写法直接漏匹配)
|
|
149
|
+
8. **公式范围与用户指令字面对齐**:用户说"对 F 至 L 列求和"优先写 `SUM(F2:L2)` 或 `F2+G2+H2+I2+J2+K2+L2`,**不能漏列、多列、错列**。写完用 `+cells-get` 拿回 `formula` 字符串,与用户原话逐字对照(参与求和的列名一致 / 起止列号一致 / 运算符一致),不一致就是风险
|
|
150
|
+
9. **量纲 / 单位换算 / 数量乘项预检(公式不报错但结果整体偏倍数)**:从文本提取数字做计算前,先核对**单位是否统一、是否漏乘数量、口径是否一致**——这类错误公式能跑通、无 `#` 报错,回读也看不出(值"像对的")。建议用本地脚本对 3–5 个代表行**离线手算一遍预期值**,与公式结果逐格比对量级:① 单位不一致先统一再算(典型反例:尺寸 `320CM*337CM` 直接取数相乘除以 1e6 得 0.11,正确是 CM→MM 换算后得 10.78,**差 100 倍**);② 按"单件×数量"的量建议乘数量列(典型反例:侧面板面积漏乘 F 列数量,F=2 的行只算了一半);③ 标准值口径对齐(典型反例:营养成分 mg/kg 与 g/100g 口径混用,整列放大 100 倍)。**口径 / 单位 / 数量任一项错,整列计算结果就是错的;这类错误公式不报错、回读也不易看出,建议靠离线手算对照。**
|
|
143
151
|
|
|
144
|
-
|
|
152
|
+
**公式写入后的诊断入口是 `+formula-verify`**:`+csv-get` / `+cells-get` 的抽样回读只能快速发现明显错误,覆盖不到整列中段、隐藏行、被条件格式遮蔽的错误,也看不到 `partial` 截断。只要本次 `+cells-set` / `--copy-to-range` / `+csv-put` 实际写入了公式,就按上方流程对目标范围逐段运行 `+formula-verify --exit-on-error`。AI 公式改走 `--ai-only` 的全区间一次异步状态检查,不按 `status='success'` 收敛。
|
|
145
153
|
|
|
146
154
|
⚠️ **收到 `formula_errors` 反馈后不建议只打补丁**:`+cells-set` 返回值里若出现 `formula_errors: [{cell, formula, error_type, detail}]`,说明某些 cell 公式编译失败(`error_type=compile_failed` 通常是函数语法错,如对数组结果直接写 `[1]` 下标取值——飞书不支持这种写法,取第 N 项要用 `INDEX(<数组表达式>, N)`;`non_formula` 是 `=` 开头但解析不通过)。此时**避免只聚焦修报错点的局部语法**(如仅把 `[1]` 换成 `INDEX(..,1)`),建议:
|
|
147
155
|
|
|
@@ -152,11 +160,11 @@ Step 2: `+styles-put` — 对 A2:A100 声明统一的 fill + border 样式
|
|
|
152
160
|
|
|
153
161
|
⚠️ **新增行的边框/样式避免用 `{}` 跳过**:`cells` 数组里 `{}` 的语义是"**此单元格不做任何修改、保留原状态**"。这在写入**已有行**时是安全的(原有边框/样式保持不变),但在写入**新行**(比如表尾追加汇总行、扩展行)时是灾难:新行底子里本来就没边框,`{}` 不修改 = 保留无边框状态,导致该 cell 视觉断裂。
|
|
154
162
|
|
|
155
|
-
⚠️ **"汇总行"识别 → 读 `lark-sheets-visual-standards` 拿完整样式规范**:下述双重条件**同时满足**才是汇总行,避免仅凭"有 AVERAGE"就判定:
|
|
163
|
+
⚠️ **"汇总行"识别 → 读 `references/lark-sheets-visual-standards.md` 拿完整样式规范**:下述双重条件**同时满足**才是汇总行,避免仅凭"有 AVERAGE"就判定:
|
|
156
164
|
- **语义信号**(二选一):用户 prompt 含"合计/汇总/总计/统计/各科平均分/最下面加一行算…/底部总计"等意图词;或上下文明确是"表尾追加一行做聚合"
|
|
157
165
|
- **结构信号**:新行全行都在做聚合(含 `=SUM/AVERAGE/COUNT/MAX/MIN/SUBTOTAL(...)`,支持 IFERROR 包裹),**不是**单个 cell 算个参考值或每行都算的派生列
|
|
158
166
|
|
|
159
|
-
满足上述时,**不要在本文里猜样式**,直接去读 `lark-sheets-visual-standards` 的「场景一 → 1A. 添加汇总行 / 表头行」章节,按那里的样式要点配齐 `font.bold / horizontal_alignment / background_color / border_styles`。
|
|
167
|
+
满足上述时,**不要在本文里猜样式**,直接去读 `references/lark-sheets-visual-standards.md` 的「场景一 → 1A. 添加汇总行 / 表头行」章节,按那里的样式要点配齐 `font.bold / horizontal_alignment / background_color / border_styles`。
|
|
160
168
|
|
|
161
169
|
反例(**不是**汇总行,避免自动加粗):
|
|
162
170
|
- 用户说"在 H5 帮我算个 AVERAGE 参考"→ 单 cell 计算
|
|
@@ -165,7 +173,7 @@ Step 2: `+styles-put` — 对 A2:A100 声明统一的 fill + border 样式
|
|
|
165
173
|
|
|
166
174
|
**正确做法**(二选一):
|
|
167
175
|
|
|
168
|
-
- **做法 A
|
|
176
|
+
- **做法 A(推荐)**:先按正确类型写 value / formula,再用 `+cells-set-style` 或 `+styles-put` 对整行补齐 `cell_styles` + `border_styles`;不要用 `--copy-to-range` 纯刷样式。汇总行的 bold / 背景色 / 上边框见 `references/lark-sheets-visual-standards.md` 的「场景一 → 1A. 添加汇总行 / 表头行」。
|
|
169
177
|
- **做法 B**:一次写入,但每个 cell(含空白格)都显式带 `cell_styles` + `border_styles`,**不能用 `{}`**。
|
|
170
178
|
|
|
171
179
|
**判断是不是"新行"**:写入 range 超出 `+csv-get` 返回的 `current_region` 右 / 下边界(如 `current_region=A1:H10`、写 `A11:H11`)即新行,建议按上述做法补边框。
|
|
@@ -297,8 +305,9 @@ _公共四件套 · 系统:`--dry-run`_
|
|
|
297
305
|
| Flag | Type | 必填 | 说明 |
|
|
298
306
|
| --- | --- | --- | --- |
|
|
299
307
|
| `--range` | string | xor | 写入区域(A1 格式)。与 `--writes` 二选一(单区域用 --range+--cells,多区域用 --writes) |
|
|
300
|
-
| `--
|
|
301
|
-
| `--
|
|
308
|
+
| `--start-cell` | string | optional | `--range` 的别名(与 `+csv-put` 一致,用 --start-cell 定左上角锚点);传区间时按区间左上角起写(隐藏 flag:不在 `--help` 列出,但可正常传入) |
|
|
309
|
+
| `--cells` | string + File + Stdin(复合 JSON) | xor | JSON:2D 数组 `[[{cell},...],...]`;裸 `--range A1`(或 `--start-cell`)是左上角锚点,写入范围按本数组的行列数推断;`--range` 写成矩形(`A1:B2`)则是边界——本数组比它小会收窄,比它大会被拒绝。每个 cell 可含 `value` / `formula` / `multiple_values` / `cell_styles` / `note` / `rich_text`(含 `type="embed-image"` 单元格嵌图)等。向启用多选的下拉单元格写入选中值时,必须用 `multiple_values:[{"value":...}]`,不要把多个选项用逗号拼成一个 `value`;完整字段跑 `--print-schema` |
|
|
310
|
+
| `--writes` | string + File + Stdin(复合 JSON) | xor | 多区域写入 JSON 数组(最多 100 项),每项 `{sheet_name\|sheet_id, range, cells}`——**跨 sheet 的项把 sheet 定位写在项里**(与 +batch-update 子操作、+styles-put 项同惯例),项内没写则取顶层 `--sheet-name` / `--sheet-id`,cells 结构同 `--cells`(二维数组,可逐格带 cell_styles/border_styles)。整批展开为**单次批量提交**(fail-fast,失败后先回读再补发),支持跨 sheet;典型场景:批量修复散布多处的公式、跨表同构写入——不要为此拼 +batch-update 的 --operations。与 `--range`+`--cells` 二选一;范围级统一样式不在此做,写完接 +styles-put |
|
|
302
311
|
| `--allow-overwrite` | bool | optional | 允许覆盖非空 cell(默认 true);设为 false 时遇非空 cell 报错 |
|
|
303
312
|
| `--max-cells` | int | optional | 防爆,默认 50000(隐藏 flag:不在 `--help` 列出,但可正常传入) |
|
|
304
313
|
| `--copy-to-range` | string | optional | 复制范围(A1 表示法):把 --range 中 --cells 写入的内容(值/公式/样式,取决于实际传入字段)复制到该区域,公式引用自动平移(如 C2=B2 → C3=B3)。适合先写一行/一块模板再扩展填充整列/整区域(如 --range A1:G1 写模板、--copy-to-range A1:G100 填充 100 行)。支持整行 3:6、整列 C:E、到列尾 D3:D、到行尾 D3:3;支持英文逗号分隔多个目标区域,如 C1:D2,E5:F6 |
|
|
@@ -363,7 +372,7 @@ _公共:URL/token(无 sheet 定位) · 系统:`--dry-run`_
|
|
|
363
372
|
|
|
364
373
|
| Flag | Type | 必填 | 说明 |
|
|
365
374
|
| --- | --- | --- | --- |
|
|
366
|
-
| `--sheets` | string + File + Stdin(复合 JSON) | required | Typed 表格协议(pandas-DataFrame-shaped)JSON:顶层 `{"sheets":[...]}`,每个数组项是一张子表 `{name, start_cell?, mode?, header?, allow_overwrite?, columns:["colA","colB",...], data:[[...]], dtypes?:{colA:pandasDtype, ...}, formats?:{colA:numberFormat, ...}}` —— `name` 与外层 `sheets` 数组都不可省。Agents 用 `scripts/
|
|
375
|
+
| `--sheets` | string + File + Stdin(复合 JSON) | required | Typed 表格协议(pandas-DataFrame-shaped)JSON:顶层 `{"sheets":[...]}`,每个数组项是一张子表 `{name, start_cell?, mode?, header?, allow_overwrite?, columns:["colA","colB",...], data:[[...]], dtypes?:{colA:pandasDtype, ...}, formats?:{colA:numberFormat, ...}}` —— `name` 与外层 `sheets` 数组都不可省。Agents 用 `scripts/lark_sheets_df.py` 的 `df_to_sheet(df, name)` 一行把 DataFrame 转成一项(多子表就 list 拼起来再包 `{"sheets":[...]}`)。`dtypes` 值是 pandas dtype 字符串(`int64`、`float64`、`Int64`、`bool`、`boolean`、`datetime64[ns]`、`object`、...),CLI 端映射成内部 string/number/date/bool —— 省略 `dtypes` 时该列按文本写入(适合原始 CSV-shaped 数据)。`formats[col]` 是 Excel number_format 字符串(如 `#,##0.00`、`0.0%`、`yyyy-mm`);缺省时 date 列用 `yyyy-mm-dd`,string 列用文本格式 `@`。 |
|
|
367
376
|
| `--styles` | string + File + Stdin(复合 JSON) | optional | 类型保真写入后再应用的视觉处理操作 JSON:顶层 `{styles:[...]}`,每项对应一个被写入的子表、含 `name`,并至少给 `cell_styles` / `row_sizes` / `col_sizes` / `cell_merges` 之一。`cell_styles` 用 A1 单元格 range + 扁平样式字段(字段同 +cells-set-style,含 number_format / 颜色 / 对齐 / border_styles);row/col sizes 用行/列范围 + type/size;merges 用单元格 range + 可选 merge_type。styles 数组的长度/顺序/name 必须与被写入的子表对应(与 --sheets.sheets 一一对应)。完整 cell_styles 字段结构跑 `+table-put --print-schema --flag-name styles`。 |
|
|
368
377
|
|
|
369
378
|
## Schemas
|
|
@@ -469,7 +478,7 @@ lark-cli sheets +cells-set --spreadsheet-token shtXXX --sheet-id "$SID" \
|
|
|
469
478
|
|
|
470
479
|
`--cells` 富格式见 `## Schemas` 段(cells 元素含 value / formula / cell_styles / border_styles / data_validation / multiple_values / note / rich_text);值 / 公式 / 样式 / 批注 / 嵌入图片可同一次写入混合提交。
|
|
471
480
|
|
|
472
|
-
> 中间想跳过的 cell 用空对象 `{}` 占位(底层语义为"保留原值不变"
|
|
481
|
+
> 中间想跳过的 cell 用空对象 `{}` 占位(底层语义为"保留原值不变")。例:`--range A1:A5 --cells '[[{"value":1}],[{}],[{}],[{}],[{"value":5}]]'` 只写 A1 和 A5。
|
|
473
482
|
>
|
|
474
483
|
> 跨多个不连续区域散点写入(如 `D2` + `F7` + `J15`)超出单次 `--range` + `--cells` 的范围,但**仍在 `+cells-set` 之内**:用本命令的 `--writes` 复数形态一次批量交付(每项 `{sheet_name, range, cells}`,可跨 sheet,见上方「多个不连续区域写入」)。**不要为此拼 `+batch-update` 的 `--operations`**——那是给跨类型、有顺序依赖的操作链用的。
|
|
475
484
|
|
|
@@ -535,7 +544,7 @@ lark-cli sheets +csv-put --spreadsheet-token shtXXX --sheet-id "$SID" \
|
|
|
535
544
|
> # 裸写 =COUNTIF(D5:D22,"及格") 会被 CSV 按逗号拆成两格、写入区域从 G4:H6 错位成 G4:K4。
|
|
536
545
|
> ```
|
|
537
546
|
>
|
|
538
|
-
> 💡 **含逗号 / 引号 / 换行的公式优先用 `+cells-set`(JSON 二维数组)写入**——`cells[r][c].formula`
|
|
547
|
+
> 💡 **含逗号 / 引号 / 换行的公式优先用 `+cells-set`(JSON 二维数组)写入**——`cells[r][c].formula` 直接放公式串,没有 CSV 转义负担。`+table-put` 的 typed payload 可带 `name/start_cell/mode/header/allow_overwrite/columns/data/dtypes/formats`,但没有公式字段;公式写入用 `+cells-set` 或转义后的 `+csv-put`:
|
|
539
548
|
>
|
|
540
549
|
> ```bash
|
|
541
550
|
> # 同样的统计块,结构化写入无需任何转义
|
|
@@ -545,7 +554,7 @@ lark-cli sheets +csv-put --spreadsheet-token shtXXX --sheet-id "$SID" \
|
|
|
545
554
|
|
|
546
555
|
> **定位 + 写入边界(关键,避免误覆盖)**:
|
|
547
556
|
> - 定位用 `--start-cell`(锚点 = 左上角单元格);也接受 `--range` 别名(与 `+csv-get` / `+cells-set` 一致,传区间会自动取左上角)。
|
|
548
|
-
> - ⚠️ `--start-cell` / `--range` **只定左上角、不限制写入大小**:CSV 从锚点按自身行列数 auto-expand 铺开。给一个"小 range"
|
|
557
|
+
> - ⚠️ `--start-cell` / `--range` **只定左上角、不限制写入大小**:CSV 从锚点按自身行列数 auto-expand 铺开。给一个"小 range"**不会**截断数据——超出部分照写,且默认覆盖。`+cells-set` 只有裸 `--range A1` 是这个语义;`--range` 一旦写成矩形就是边界,`--cells` 超出它会被拒绝。
|
|
549
558
|
> - dry-run 与成功响应都回显 `writes_range`(实际落区,如 `B2:D4`):**写前先 `--dry-run` 看一眼落区**,确认不会盖到相邻数据。
|
|
550
559
|
> - 要保护非空 cell:`--allow-overwrite=false`(落区内出现非空 cell 即报错)。
|
|
551
560
|
|
|
@@ -568,11 +577,11 @@ lark-cli sheets +table-put --url "<表URL>" --sheets - --styles @styles.json < s
|
|
|
568
577
|
|
|
569
578
|
#### DataFrame → 协议(用 `df_to_sheet` helper)
|
|
570
579
|
|
|
571
|
-
pandas 的 `df.to_json(orient="split", date_format="iso")` 一步完成所有清洗(NaN→null、Timestamp→ISO 字符串、numpy 标量→原生数字),把 dtypes 拼上即可。本 skill 把这段 5 行 helper 打包成可 import 的 [`scripts/
|
|
580
|
+
pandas 的 `df.to_json(orient="split", date_format="iso")` 一步完成所有清洗(NaN→null、Timestamp→ISO 字符串、numpy 标量→原生数字),把 dtypes 拼上即可。本 skill 把这段 5 行 helper 打包成可 import 的 [`scripts/lark_sheets_df.py`](../scripts/lark_sheets_df.py)(含 `df_to_sheet` 和 `sheet_to_df`,写入 / 读回成对):
|
|
572
581
|
|
|
573
582
|
```python
|
|
574
|
-
import sys; sys.path.insert(0, "scripts") #
|
|
575
|
-
from
|
|
583
|
+
import sys; sys.path.insert(0, "scripts") # cwd 不在 skill 根时改成 scripts/ 的实际路径
|
|
584
|
+
from lark_sheets_df import df_to_sheet
|
|
576
585
|
|
|
577
586
|
# 单 sheet(显式 format 覆盖默认显示)
|
|
578
587
|
payload = {"sheets": [df_to_sheet(df, "销售", {"营收": "#,##0.00", "毛利率": "0.0%"})]}
|
|
@@ -623,6 +632,6 @@ lark-cli sheets +table-put --url "<表URL>" \
|
|
|
623
632
|
|
|
624
633
|
### Validate / DryRun / Execute 约束
|
|
625
634
|
|
|
626
|
-
- `Validate`:XOR 公共四件套;`+cells-set` 的 `--cells`
|
|
635
|
+
- `Validate`:XOR 公共四件套;`+cells-set` 的 `--cells` 必须能解析为各行等宽的 JSON 二维矩阵(落区按其行列数推断);`+cells-set-style` 的样式 flag 至少一个非空(或带 `--border-styles`);`+cells-set-image` 的 `--range` 必须是单 cell(起止 cell 相同);`+csv-put` 的 `--csv` 必须能按 RFC 4180 解析;`+table-put` 给了 `--styles` 则按子表名 / 顺序 / 数量与 `--sheets.sheets` 对齐校验;防爆参数上限校验。
|
|
627
636
|
- `DryRun`:输出目标 range + 推断尺寸 + 是否覆盖非空 cell 警告,零网络副作用。
|
|
628
|
-
- `Execute
|
|
637
|
+
- `Execute`:写后必须按写入范围回读首、中、末及用户点名项;公式同时读取 formula,并按公式完成流程验证。
|