16 KiB
批量操作
写入边界 + 回读校验
batch-update 把多次写入打包成单次请求,但每个子操作仍受编辑类任务硬性默认规则约束:
- 目标 range 必须落在用户授权范围内:除用户明示要修改的区域外,子操作禁止扩张到无关单元格 / 列 / 工作表。规划 range 时先确认每个子操作的边界。
- 批次完成后必须回读校验:整个
batch-update执行成功后,单元格值用range read或csv-get抽样回读受影响区域;合并用裸sheet info,行列分组用sheet info --include groups回读校验。 - 预期条数前置断言:涉及"批量填充 N 行"或"对 M 个区域分别写入"时,先把 N、M 硬编码进代码,回读后断言实际等于预期;不一致就再发一轮
batch-update补齐,禁止交付半成品。
使用场景
用户说"批量清除/一次清除多个区域/清空多个 sheet 的数据":
- 批量清除多个区域 →
range batch-clear - 每个区域必须带工作表前缀(如 "Sheet1!A1:B3")
- 原子事务:任一区域清除失败则整批回滚
- 请勿用多次
range clear逐个调用,非原子,中途失败会留下半成品
用户说"批量操作/一次执行多个写操作/原子批量/先清除再写入":
- 多个写操作打包 →
batch-update - 支持混合操作(清除 + 写入 + 合并 + 调行列尺寸等)
- 原子事务:任一操作失败则整批回滚
- 传
--continue-on-error可切换为宽松模式(失败继续)
用户说"批量写入多个结构化 table/跨 sheet 写入 dataframe/table":
- 不使用
batch-update;直接调用dws sheet table-put --node <NODE_ID> --sheets '{"sheets":[...]}' table-put自身支持一次写入多个 sheet spec,写入后用table-get回读 dtype / format / 数据行数
用户说"批量创建行列分组/批量取消行列分组/同时调整尺寸并分组":
- 连续行/列分组 →
group-dimension - 取消连续行/列分组 →
ungroup-dimension - 分组回读用
sheet info --include groups group-dimension在 batch 中只适合默认展开分组;需要创建后立即折叠时,用独立dws sheet group-dimension --group-state fold
何时推荐使用 batch-update:
- 需要对多个不同区域执行
merge-cells/unmerge-cells时(如按分组合并多列相同内容) - 需要对多个不同区域执行
update-dimension时(如统一调整多列列宽或多行行高,含 hidden + pixelSize) - 需要对多个连续行/列范围执行
group-dimension/ungroup-dimension时(默认展开分组) - 需要先插入行列再写入数据时(
add-dimension+range update/csv-put) - 需要对多个区域执行不同写入操作时(多次
range update+range clear等组合)
当同一工具需要对多个区域重复调用时,推荐改用 batch-update 合并为单次请求——batch-update 是原子提交(要么全成功要么整批回滚);逐个调用非原子,中途失败会留下半成品。
不可放进 --operations 的操作(强行写入会被校验拒或行为未定义):
range read/csv-get/table-get(读取操作,不在 batch dispatch 表中;结构化 table 回读需在 batch 外单独调用)table-put(当前batch-update不支持结构化 table 写入;请直接调用独立dws sheet table-put)range sort/range move-to(尚未支持,后续版本补充)write-image/media-upload/create-float-image/update-float-image(需本地上传或依赖前置上传句柄)set-style/range batch-set-style(自身已是批量入口,不可再嵌套)find/replace(尚未支持,后续版本补充)export(异步轮询操作)sheet list/sheet info(只读操作)
这些操作需在 batch-update 之外单独调用。
命令详细参考
批量清除区域
Usage:
dws sheet range batch-clear [flags]
Example:
dws sheet range batch-clear --node <NODE_ID> --ranges '["Sheet1!A1:B3","Sheet2!C1:D5"]'
dws sheet range batch-clear --node <NODE_ID> --ranges '["Sheet1!A1:Z1000"]' --type all
dws sheet range batch-clear --node <NODE_ID> --ranges '["Sheet1!A2:A100","Sheet1!C2:C100"]' --type format
Flags:
--node string 表格文档 ID 或 URL (必填)
--ranges string 目标区域 JSON 数组,每项带 sheet 前缀 (必填)
--type string 清除类型: content(仅值,默认) / format(仅格式) / all(全部)
Notes:
- 原子事务:任一区域清除失败则整批回滚
- 每个 --ranges 项必须包含工作表前缀(格式: "SheetName!A1:B3")
- 不同区域可以属于不同工作表
批量更新(原子事务)
Usage:
dws sheet batch-update [flags]
Example:
dws sheet batch-update --node <NODE_ID> --operations '[
{"toolName":"range clear","input":{"sheet-id":"Sheet1","range":"A1:B3","type":"content"}},
{"toolName":"range update","input":{"sheet-id":"Sheet1","range":"A1","values":[[{"type":"text","text":"hello"}]]}},
{"toolName":"merge-cells","input":{"sheet-id":"Sheet1","range":"A1:B1","merge-type":"mergeAll"}},
{"toolName":"update-dimension","input":{"sheet-id":"Sheet1","dimension":"ROWS","start-index":"1","length":1,"pixel-size":40}},
{"toolName":"group-dimension","input":{"sheet-id":"Sheet1","range":"3:7","group-state":"expand"}},
{"toolName":"set-dropdown","input":{"sheet-id":"Sheet1","range":"C2:C100","source-sheet-id":"SourceSheet","source-range":"T1:T3"}}
]'
dws sheet batch-update --node <NODE_ID> --continue-on-error --operations '[...]'
Flags:
--node string 表格文档 ID 或 URL (必填)
--operations string 操作数组 JSON (必填,每项 {toolName, input})
--continue-on-error 遇失败继续执行(默认 false,严格事务)
toolName 用 CLI 命令名,input 的键用 CLI flag 名去掉 --:
range clear / range update / merge-cells / unmerge-cells / update-dimension
range fill / range copy-to / add-dimension / delete-dimension / move-dimension
group-dimension / ungroup-dimension
set-dropdown / delete-dropdown / csv-put / delete-float-image
Notes:
- 默认严格事务模式:任一子操作失败 → 整批回滚到初始状态
- --continue-on-error: 宽松模式,遇失败继续执行后续操作(已执行的子操作不回滚)
- operations 最多 20 条
- 当需要对多个区域执行相同清除时,优先使用 `range batch-clear`(更简洁)
- `csv-put` 子操作与独立命令语义一致:CSV 字段值以 `=` 开头时按公式解析;前加单引号时写入以 `=` 开头的字面文本
- `set-dropdown` 的 `input` 中,Inline 使用 `options`;SourceRange 使用 `source-sheet-id` + `source-range`,两种模式必须且只能选一个。顶层 `colors` / `source-colors` 会被拒绝;Inline 颜色写在 `options[].color`,SourceRange 颜色写入暂不支持
- `set-dropdown` SourceRange 在已验证的重命名、引用前插入行/列、删除引用前行的场景会自动调整;已验证的 `move-dimension` 会使其变为 `invalid`。其他未覆盖删除/移动场景后先回读,仅 `invalid` 时重新选源写入
- `source-range` 按 `toolName` 解释:`set-dropdown` 中是下拉候选项来源;`range fill` / `range copy-to` / `range move-to` 中是待填充、复制或移动的数据源区域
- 典型场景:先插入行列再写入数据、先清除再写入、批量合并+调整行高列宽
- `group-dimension` 在 batch 中只适合默认展开分组;需要 `--group-state fold` 时请使用独立 `dws sheet group-dimension`
- `table-put` 不支持放进 batch-update;结构化 table 请用独立 `dws sheet table-put`
子操作定位规则
--node只在顶层传一次,每个子操作的input不含node字段; 子表定位sheet-id写进各自input,不同子操作可指向不同工作表。
// 正确:node 在顶层,sheet-id 在各自 input
[
{"toolName":"range clear","input":{"sheet-id":"Sheet1","range":"A1:B3"}},
{"toolName":"range update","input":{"sheet-id":"Sheet2","range":"A1","values":[[...]]}} // 不同工作表
]
table-put / table-get 不支持放进 batch-update。结构化 table 写入请直接调用 dws sheet table-put,写入完成后在 batch 外单独调用 table-get 回读校验。
校验与预览
Validate 阶段
CLI 在发送请求前执行以下本地校验(不消耗网络请求):
| 校验项 | 失败行为 | 示例 |
|---|---|---|
--node / --operations 必填 |
missing required flag(s) |
不传 --node |
--operations 必须合法 JSON |
--operations JSON 解析失败 |
--operations 'not json' |
--operations 必须非空数组 |
--operations 不能为空数组 |
--operations '[]' |
| 每项必须是 object | operations[N] 不是 object |
--operations '["string"]' |
toolName 必须是支持的 CLI 命令名 |
unsupported toolName "xxx" |
传 "batch-update"(禁止嵌套)或拼写错误 |
禁止嵌套 batch-update |
同上(batch-update 不在 dispatch 表中,自动拦截) |
toolName: "batch-update" |
禁止 table-put / table-get |
unsupported toolName "table-put" |
结构化 table 应使用独立 table-put |
input内的字段(如sheet-id、range、values等)由服务端校验,CLI 不提前拦截——传入空值或缺失必填字段时,请求会到达服务端再返回错误。
--continue-on-error 行为
| 模式 | flag | 子操作失败时 | 返回格式 |
|---|---|---|---|
| 严格事务(默认) | 不传 | 整批回滚到初始状态,后续子操作不执行 | 顶层 error 对象 |
| 宽松模式 | --continue-on-error |
已执行的子操作不回滚,继续执行后续子操作 | results 数组 |
严格事务失败的错误信息由服务端生成,包含以下内容:
- 失败操作索引:
operations[N](0-based,即--operationsJSON 数组中的下标) - 回滚告知:"All previously executed operations have been rolled back."
- 失败原因:原始错误码和错误消息
示例:
Batch update failed at operations[1] (0-based index).
All previously executed operations have been rolled back.
Cause: The requested resource was not found by the identifier 'NonExistentSheet'...
宽松模式下,返回 results 数组,逐个标注每个子操作的成功/失败状态:
- 成功的子操作:
success: true+message - 失败的子操作:
success: false+errorCode+errorMsg - 顶层
success: true(batch 本身完成执行,只是部分子操作失败)
CLI 命令名 → 原子命令参考
toolName 使用 CLI 命令名,input 的键使用 CLI flag 名(去掉 --),与原子命令文档完全一致。各命令的参数详情请查阅对应参考文档或执行 dws sheet <命令> --help。
| CLI 命令名 | 参考文档 |
|---|---|
range clear |
sheet-range-operations |
range update |
sheet-write-data |
merge-cells |
sheet-style-format |
unmerge-cells |
sheet-style-format |
update-dimension |
sheet-dimension-operations |
group-dimension |
sheet-dimension-operations |
ungroup-dimension |
sheet-dimension-operations |
range fill |
sheet-range-operations |
range copy-to |
sheet-range-operations |
add-dimension |
sheet-dimension-operations |
delete-dimension |
sheet-dimension-operations |
move-dimension |
sheet-dimension-operations |
set-dropdown |
sheet-dropdown |
delete-dropdown |
sheet-dropdown |
csv-put |
sheet-write-data |
delete-float-image |
sheet-media-image |
典型组合场景
插列 + 写表头 + 整列回填
一次原子提交,不要拆成多次独立调用。批量回填同一列只需一次 range update(range 写整列范围、values 写 N×1 矩阵),不需要逐行循环。
// 在 C 列前插入新列 → 写表头 C1 → 回填 C2:C100 共 99 行
[
{"toolName":"add-dimension",
"input":{"sheet-id":"...","dimension":"COLUMNS","length":1}},
{"toolName":"range update",
"input":{"sheet-id":"...","range":"C1:C100",
"values":[[{"type":"text","text":"score"}],[{"type":"text","text":"95"}],[{"type":"text","text":"87"}]/* ... 97 more rows ... */]}}
]
先清除再写入
清除目标区域残留数据后写入新数据,保证目标区域干净。
[
{"toolName":"range clear",
"input":{"sheet-id":"...","range":"A1:D50","type":"all"}},
{"toolName":"range update",
"input":{"sheet-id":"...","range":"A1:D50",
"values":[[{"type":"text","text":"姓名"},{"type":"text","text":"部门"},{"type":"text","text":"金额"},{"type":"text","text":"日期"}],/* ... */]}}
]
批量合并 + 调整行高列宽
统一多列合并和尺寸调整,原子提交避免中途失败留下不一致格式。
[
{"toolName":"merge-cells",
"input":{"sheet-id":"...","range":"A1:B1","merge-type":"mergeAll"}},
{"toolName":"merge-cells",
"input":{"sheet-id":"...","range":"C1:D1","merge-type":"mergeAll"}},
{"toolName":"update-dimension",
"input":{"sheet-id":"...","dimension":"ROWS","start-index":"1","length":1,"pixel-size":40}},
{"toolName":"update-dimension",
"input":{"sheet-id":"...","dimension":"COLUMNS","start-index":"A","length":4,"pixel-size":120}}
]
批量创建/取消行列分组
分组属于工作表结构元数据,批次完成后用 sheet info --include groups 回读 rowGroups / columnGroups,不要用裸 sheet info 或 range read 校验。回读项中的 level 是 1-based,collapsed 表示当前折叠状态。
[
{"toolName":"group-dimension",
"input":{"sheet-id":"...","range":"3:7","group-state":"expand"}},
{"toolName":"group-dimension",
"input":{"sheet-id":"...","range":"C:F","group-state":"expand"}}
]
[
{"toolName":"ungroup-dimension",
"input":{"sheet-id":"...","range":"3:7"}},
{"toolName":"ungroup-dimension",
"input":{"sheet-id":"...","range":"C:F"}}
]
注意:batch 中不要用 group-state:"fold" 来创建折叠分组;需要折叠初始状态时,用独立 dws sheet group-dimension --group-state fold。
上下文传递
| 操作 | 从返回中提取 | 用于 |
|---|---|---|
list |
工作表的 sheetId |
batch-clear 的 --ranges sheet 前缀 / batch-update 子操作 input 的 sheet-id |
batch-update |
各子操作的执行结果 | 回读校验(值用 range read / csv-get;合并用 sheet info;分组用 sheet info --include groups) |
注意事项
- ★
--sheet-id获取规范(强制):sheetId未知时必须先通过dws sheet list --node <NODE_ID> --format json查询真实的sheetId/ 工作表名称后再调用,禁止凭空编造(如臆测为Sheet1、sheet1、0、default等) - ★ 需要对多个区域执行相同清除操作时,用
range batch-clear:一次原子请求清除多个区域(可跨工作表),失败时整批回滚 - ★ 需要组合多个不同写操作(清除+写入等)时,用
batch-update:原子事务,任一操作失败则整批回滚,避免留下半成品 - ★ table 写入不进 batch-update:当前
batch-update不支持结构化 table 写入;结构化 table 请直接调用dws sheet table-put - ★ 批次完成后必须回读校验:值写入用
range read或csv-get抽样回读受影响区域;结构变更用sheet info回读 - ★
batch-update不支持嵌套:--operations中的toolName必须是原子操作,不可再嵌套batch-update batch-update支持group-dimension/ungroup-dimension;分组结果用sheet info --include groups回读batch-update中group-dimension只适合默认展开分组;需要fold初始状态时使用独立group-dimension