# Conflicts: # CHANGELOG.md # skills/mono/references/products/sheet/sheet-dimension-operations.md # skills/mono/references/products/sheet/sheet-export.md # skills/mono/references/products/sheet/sheet-style-format.md # skills/multi/dingtalk-misc/references/sheet/sheet-dimension-operations.md # skills/multi/dingtalk-misc/references/sheet/sheet-export.md
22 KiB
表格与工作表管理
使用场景
用户说"创建表格/新建电子表格":
- 创建空表格文档 →
create - 创建并写入初始数据(可选样式)→
create-with-data(--values/--sheets必须给一个)
用户说"看工作表/有哪些工作表/表格结构":
- 列出工作表 →
list - 工作表详情 →
info
用户说"加工作表/新增Sheet":
- 新建工作表 →
new
用户说"修改工作表名称/重命名工作表/移动工作表位置/隐藏工作表/显示工作表/冻结行/冻结列/取消冻结/更新工作表属性":
- 更新工作表属性 →
update - 重命名工作表 →
update --name "新名称" - 移动工作表位置 →
update --index N - 隐藏工作表 →
update --hidden - 显示工作表 →
update --hidden=false - 冻结行列 →
update --frozen-row-count N --frozen-column-count M - 取消冻结 →
update --frozen-row-count 0 --frozen-column-count 0
用户说"复制工作表/拷贝工作表/克隆工作表/工作表副本":
- 复制工作表 →
copy - 复制并指定名称 →
copy --name "副本名称" - 复制并指定位置 →
copy --index N
用户说"显示网格线/显示网格/恢复网格线":
- 显示网格线 →
show-gridline(连续多次调用幂等,不报错)
用户说"隐藏网格线/去掉网格/关闭网格线/展示模式/看板模式":
- 隐藏网格线 →
hide-gridline(连续多次调用幂等,不报错)
用户说"删除工作表/移除工作表/删掉这个Sheet":
- 删除工作表 →
delete-sheet(不可逆操作,执行前必须向用户确认)
命令详细参考
创建钉钉表格文档
Usage:
dws sheet create [flags]
Example:
dws sheet create --name "销售数据"
dws sheet create --name "Q1 数据" --folder <FOLDER_ID>
dws sheet create --name "知识库表格" --workspace <WS_ID>
Flags:
--name string 表格名称 (必填)
--folder string 目标文件夹 ID (dentryUuid 格式) 或 URL;禁止传入纯数字 dentryId
--workspace string 目标知识库 ID
ID 格式约束:
--folder只接受 UUID 格式的fileId(如ZgpG2NdyVXYOR2D5UGDok65MJMwvDqPk)或 alidocs 文件夹 URL。drive list返回中有dentryId(纯数字,如218595998810)和fileId(UUID 格式)两个字段,必须使用fileId,禁止使用dentryId,传入纯数字会导致命令失败。
创建表格文档并写入初始数据
Usage:
dws sheet create-with-data [flags]
Example:
dws sheet create-with-data --name "名单" --values '[["姓名","分数"],["张三","90"]]'
dws sheet create-with-data --name "报表" --sheets '[{"name":"一月","columns":["项目","金额"],"data":[["房租",5000]]}]'
Flags:
--name string 表格名称 (必填)
--folder string 目标文件夹 ID (dentryUuid 格式) 或 URL;禁止传入纯数字 dentryId
--workspace string 目标知识库 ID
--values string 初始数据,二维 JSON 数组,写入默认工作表 (与 --sheets 二选一)
--sheets string 多工作表 typed table JSON (与 --values 二选一)
--styles string 建表时一并应用的视觉处理 JSON(需与 --values 或 --sheets 搭配)
建表并写入初始数据的多步编排:建文档 → 探活 → 定位默认工作表 → 写数据 → 回读校验 →(可选)应用样式。只要一个空表格请用 dws sheet create(单次调用);本命令必须给数据。
写入初始数据(--values 与 --sheets 二选一,必须给一个):
--values:二维 JSON 数组,裸值写入默认工作表 A1 起。适合单表快速建表,无表头/类型语义,内部复用 csv-put 通道,自动识别数字/布尔。单元格只能是字符串/数字/布尔/null;上限 30000 单元格、编码为 CSV 后 2000000 字符。--sheets:typed table 数组,一次创建多个带数据的工作表,内部复用 table-put 通道。每项形如{"name":"表名","columns":["列1","列2"],"data":[[...]],"dtypes":{...},"formats":{...},"cellStyles":[...]};name、columns必填。第一个条目写入默认工作表(自动重命名为其name,避免残留空表),其余按name自动新建。- 字段名为 camelCase,只接受
name/columns/data/dtypes/formats/cellStyles/startCell/mode(overwrite|append) /header/allowOverwrite;未知键与 snake_case 变体一律拒绝(服务端会静默丢弃写错的键,{"datas":[...]}会写出一张只有表头的表却报成功) - 不接受
sheetId:文档此刻还不存在,工作表只能用name指定 columns为非空字符串数组、列名不可为空/重复(按 trim 后比较);data每行长度须等于columns,单元格只能是字符串/数字/布尔/nulldtypes/formats的键须是columns里的列名(服务端按列名查表,写错既不报错也不生效)- 单表写入上限 30000 单元格(写表头时含表头行)
- 字段名为 camelCase,只接受
建表时一并应用样式(--styles,顶层键对齐飞书 snake_case,列表项内字段兼容 camelCase;两级都拒绝未知键):
{"styles":[{"name":"表名",
"cell_styles":[{"range":"A1:D1","font_weight":"bold","background_color":"#FFF2CC","number_format":"@"}],
"row_sizes":[{"range":"1:1","type":"pixel","size":28}],
"col_sizes":[{"range":"A:D","type":"pixel","size":120}],
"cell_merges":[{"range":"A1:B1","merge_type":"all"}]}]}
- 每项至少给
cell_styles/row_sizes/col_sizes/cell_merges之一 - 配
--sheets时 styles 的项数/顺序/name 必须与子表一一对应;配--values时只给 1 项(name被忽略) - 数据写入后按
cell_styles→row_sizes→col_sizes→cell_merges顺序执行(非原子) row_sizes.type:pixel(需size)/standard(恢复默认行高)/auto(按内容自适应)col_sizes.type:pixel(需size)/standard(恢复默认列宽)——与飞书一致,列宽不提供autosize必须是正整数(小数会被拒绝而不是静默取整,避免得到与配置不符的行高列宽);row_sizes.range形如"1:3"、col_sizes.range形如"A:C",带多余字符一律拒绝merge_type取all/rows/columns
行为要点:
- 所有 JSON 结构、字段类型与枚举都在创建文档之前校验(
--sheets按 table-put 的输入契约逐字段校验),非法配置直接失败,不会留下白建的空文档 - 创建后 CLI 会先探活(新建文档服务端仍在初始化,此时写入可能返回成功但不落盘),再写数据
- 写完会回读首个预期非空单元格校验确实落盘(不是死盯 A1:
--sheets会按startCell/header/mode推算实际写入位置);若未落盘会报错并提示用csv-put/range update/table-put补写 - 报错信息里始终带上已创建的
nodeId,便于在部分成功时继续操作同一份文档
示例:
# 创建并写入初始数据(默认工作表,裸二维值)
dws sheet create-with-data --name "名单" --values '[["姓名","分数"],["张三","90"]]'
# 创建多个带数据的工作表
dws sheet create-with-data --name "报表" --sheets '[{"name":"一月","columns":["项目","金额"],"data":[["房租",5000]]},{"name":"二月","columns":["项目","金额"],"data":[["房租",5000]]}]'
# 创建 + 写数据 + 一并应用样式(表头加粗黄底、行高、列宽)
dws sheet create-with-data --name "带样式" --values '[["姓名","分数"],["张三","90"]]' \
--styles '{"styles":[{"name":"Sheet1","cell_styles":[{"range":"A1:B1","font_weight":"bold","background_color":"#FFF2CC"}],"row_sizes":[{"range":"1:1","type":"pixel","size":28}],"col_sizes":[{"range":"A:B","type":"pixel","size":120}]}]}'
--folder/--workspace的 ID 格式约束与dws sheet create完全一致(只接受 UUID 格式的fileId或 alidocs URL)。
获取全部工作表列表
Usage:
dws sheet list [flags]
Example:
dws sheet list --node <NODE_ID>
dws sheet list --node "https://alidocs.dingtalk.com/i/nodes/<DOC_UUID>"
Flags:
--node string 表格文档 ID 或 URL (必填)
获取指定工作表详情
Usage:
dws sheet info [flags]
Example:
dws sheet info --node <NODE_ID>
dws sheet info --node <NODE_ID> --sheet-id <SHEET_ID>
dws sheet info --node <NODE_ID> --sheet-id "Sheet1"
dws sheet info --node <NODE_ID> --sheet-id <SHEET_ID> --include groups
dws sheet info --node <NODE_ID> --sheet-id <SHEET_ID> --include row_heights,col_widths,hidden_rows,hidden_cols
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (不传则返回第一个工作表)
--include strings 可选扩展信息,逗号分隔;支持 groups / row_heights / col_widths / hidden_rows / hidden_cols / frozen
返回字段中 mergedRanges 是当前工作表的合并单元格范围列表(A1 表示法,如 ["C7:D11"])。它属于工作表结构/布局元数据:读写单元格内容前,如需判断表头、分组标题、续写位置或避开合并冲突,应先看 sheet info,不要在 range read / csv-get 的单元格值里寻找合并信息。
返回字段中 frozenRowCount / frozenColumnCount 是冻结行列数量:冻结总是从工作表顶部第 1 行、左侧第 A 列开始连续计算;0 表示未冻结。它们是工作表级元数据,默认随 sheet info 返回,不需要额外 include。
最后非空数据边界通过 nonEmptyRange 返回,字段均为 A1/UI 语义:range 是从 A1 到最后非空单元格的范围,lastCell 是最后非空单元格地址,lastRow 是 1-based 行号,lastColumn 是列字母。空表时 nonEmptyRange 为 null。不要使用旧的 0-based 字段 lastNonEmptyRow / lastNonEmptyColumn。
需要读取行列分组时,加 --include groups。返回字段:
rowGroups:行分组列表,单项包含range、startRow、endRow、count、level、collapsedcolumnGroups:列分组列表,单项包含range、startColumn、endColumn、count、level、collapsed
其中 range 使用 A1 行/列范围(如 "3:7" / "C:F"),起止行号为 1-based,列使用字母;level 是 1-based 展示层级,不返回 depth;collapsed 表示当前折叠状态。range read / csv-get 不返回 mergedRanges、冻结或分组等结构元数据。
需要读取行高、列宽、隐藏行列时,按需加对应 --include 值(可组合,逗号分隔)。返回字段:
--include row_heights→rowHeights(逐条行高,单项{row, pixelSize},row为 1-based)+defaultRowHeight(默认行高像素)--include col_widths→colWidths(逐条列宽,单项{column, pixelSize},column为列字母)+defaultColumnWidth(默认列宽像素)--include hidden_rows→hiddenRows(隐藏行区间列表,单项{startRow, endRow},1-based,连续隐藏行合并为一个区间)--include hidden_cols→hiddenCols(隐藏列区间列表,单项{startColumn, endColumn},列字母,连续隐藏列合并为一个区间)
注意:rowHeights / colWidths 只返回显式设置过尺寸的行列(未自定义的行列不出现,用 defaultRowHeight / defaultColumnWidth 兜底);隐藏行列即使未改尺寸也会出现在 hiddenRows / hiddenCols。frozen 也在 include 白名单中,但冻结字段本就默认返回,传 frozen 与否结果一致。
新建工作表
Usage:
dws sheet new [flags]
Example:
dws sheet new --node <NODE_ID> --name "Sheet2"
dws sheet new --node <NODE_ID> --name "数据汇总"
Flags:
--node string 表格文档 ID (必填)
--name string 工作表名称 (必填)
更新工作表属性
Usage:
dws sheet update [flags]
Example:
# 改名 + 调整冻结
dws sheet update --node <NODE_ID> --sheet-id <SHEET_ID> --name "汇总表" --frozen-row-count 2 --frozen-column-count 1
# 隐藏工作表
dws sheet update --node <NODE_ID> --sheet-id <SHEET_ID> --hidden=true
# 显示工作表
dws sheet update --node <NODE_ID> --sheet-id <SHEET_ID> --hidden=false
# 移动工作表到第一个位置
dws sheet update --node <NODE_ID> --sheet-id <SHEET_ID> --index 0
# 取消冻结
dws sheet update --node <NODE_ID> --sheet-id <SHEET_ID> --frozen-row-count 0 --frozen-column-count 0
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--name string 新名称,最长 100 字符,不能包含 / \ ? * [ ] :
--index int 新位置(从 0 开始)
--hidden --hidden=true 隐藏,--hidden=false 取消隐藏
--frozen-row-count int 冻结行数,0 表示取消冻结
--frozen-column-count int 冻结列数,0 表示取消冻结
更新工作表名称、位置、隐藏状态、冻结行列。
--name / --index / --hidden / --frozen-row-count / --frozen-column-count 至少提供一个;多个属性可同时传入,将在同一次请求中更新。
注意:
- 至少需要保留一个可见的工作表,不能将所有工作表都隐藏
- 冻结行数/列数不能超过工作表的总行数/列数
复制工作表
Usage:
dws sheet copy [flags]
Example:
# 按默认位置复制
dws sheet copy --node <NODE_ID> --sheet-id <SHEET_ID>
# 指定副本名称和位置
dws sheet copy --node <NODE_ID> --sheet-id <SHEET_ID> --name "销售副本" --index 2
# 只指定名称
dws sheet copy --node <NODE_ID> --sheet-id <SHEET_ID> --name "备份"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 源工作表 ID 或名称 (必填)
--name string 副本名称,最长 100 字符,不能包含 / \ ? * [ ] : (不传则系统自动生成)
--index int 副本位置(从 0 开始)(不传则放在源工作表之后)
复制指定工作表,在同一表格中创建一个副本。
复制操作会将源工作表的所有内容(包括数据、格式、公式等)完整复制到新工作表中。
传 --index 时,CLI 会先复制,再追加一次位置更新,把副本移动到目标索引。
名称与已有工作表重复时系统会自动重命名。
删除工作表
Usage:
dws sheet delete-sheet [flags]
Example:
dws sheet delete-sheet --node <NODE_ID> --sheet-id <SHEET_ID>
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 要删除的工作表 ID 或名称 (必填)
CAUTION: 不可逆操作 — 执行前必须向用户确认。
删除指定的工作表及其所有数据。约束:
- 不能删除隐藏的工作表(需先通过
sheet update --hidden false取消隐藏再删除) - 不能删除最后一个可见工作表(至少保留一个可见工作表)
显示工作表网格线
Usage:
dws sheet show-gridline [flags]
Example:
dws sheet show-gridline --node <NODE_ID> --sheet-id <SHEET_ID>
dws sheet show-gridline --node <NODE_ID> --sheet-id "Sheet1"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
隐藏工作表网格线
Usage:
dws sheet hide-gridline [flags]
Example:
dws sheet hide-gridline --node <NODE_ID> --sheet-id <SHEET_ID>
dws sheet hide-gridline --node <NODE_ID> --sheet-id "Sheet1"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
切换子表网格线显隐;二态语义在命令名里,无需额外参数(同 update --hidden / update --hidden=false 的隐藏/显示工作表模式)。
网格线默认显示;隐藏后工作表背景为纯白色,适合截图、演示、仪表盘/看板场景(不影响打印和数据)。
连续多次 show 或多次 hide 均为幂等操作,不会报错。
核心工作流
# ── 工作流 1: 创建表格并写入数据 ──
# 1. 创建表格文档 — 提取 nodeId
dws sheet create --name "销售数据" --format json
# 2. 查看工作表列表 — 提取 sheetId
dws sheet list --node <NODE_ID> --format json
# 3. 写入表头和数据
dws sheet range update --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:C1" \
--values '[[{"type":"text","text":"姓名"},{"type":"text","text":"部门"},{"type":"text","text":"销售额"}]]' --format json
dws sheet range update --node <NODE_ID> --sheet-id <SHEET_ID> --range "A2:C4" \
--values '[[{"type":"text","text":"张三"},{"type":"text","text":"销售部"},{"type":"text","text":"50000"}],[{"type":"text","text":"李四"},{"type":"text","text":"市场部"},{"type":"text","text":"38000"}],[{"type":"text","text":"王五"},{"type":"text","text":"销售部"},{"type":"text","text":"62000"}]]' --format json
# 4. 独立回读实际写入范围
dws sheet range read --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:C4" --format json
# ── 工作流 2: 读取已有表格数据 ──
# 1. 获取工作表列表
dws sheet list --node <NODE_ID> --format json
# 2. 查看工作表详情(行列数、最后非空位置等)
dws sheet info --node <NODE_ID> --sheet-id <SHEET_ID> --format json
# 3. 读取全部数据
dws sheet range read --node <NODE_ID> --sheet-id <SHEET_ID> --format json
# 4. 读取指定区域
dws sheet range read --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:D10" --format json
# ── 工作流 3: 多工作表管理 ──
# 1. 新建工作表
dws sheet new --node <NODE_ID> --name "汇总" --format json
# 2. 在新工作表中写入汇总公式
dws sheet range update --node <NODE_ID> --sheet-id <NEW_SHEET_ID> --range "A1:B1" \
--values '[[{"type":"text","text":"指标"},{"type":"text","text":"数值"}]]' --format json
dws sheet range update --node <NODE_ID> --sheet-id <NEW_SHEET_ID> --range "A2:B2" \
--values '[[{"type":"text","text":"总销售额"},{"type":"text","text":"=SUM(Sheet1!C2:C100)"}]]' --format json
上下文传递
| 操作 | 从返回中提取 | 用于 |
|---|---|---|
create |
nodeId |
list / info / new / range read / range update / find 的 --node |
list |
工作表的 sheetId |
info / range read / range update / find 的 --sheet-id |
new |
新工作表的 sheetId |
range read / range update / find 的 --sheet-id |
info |
rowCount / nonEmptyRange.range / nonEmptyRange.lastRow / nonEmptyRange.lastColumn / mergedRanges / frozenRowCount / frozenColumnCount / rowGroups / columnGroups / rowHeights / colWidths / hiddenRows / hiddenCols |
确定数据范围、追加写入起始行、判断合并单元格结构、回读冻结与行列分组、回读行高列宽与隐藏行列 |
注意事项
- ★
--sheet-id获取规范(强制):所有涉及--sheet-id参数的命令,除非用户主动提供了工作表 ID 或工作表名称,否则在sheetId未知时必须先通过dws sheet list --node <NODE_ID> --format json查询真实的sheetId/ 工作表名称后再调用,禁止凭空编造(如臆测为Sheet1、sheet1、0、default等);用户仅给出工作表名称时,也应通过list校验该名称是否存在,避免名称大小写或拼写不一致导致失败 mergedRanges中的范围表示一个整体语义区域。合并区域内非左上角单元格为空并不代表无内容,通常应以左上角单元格的值作为该合并区域的含义。create不传--folder和--workspace时,默认创建在"我的文档"根目录list返回所有工作表的 ID 和名称,是后续操作的必要前置步骤info不传--sheet-id时默认返回第一个工作表的详情new创建工作表时,如名称与已有工作表重复,系统会自动重命名update的--name、--index、--hidden、--frozen-row-count、--frozen-column-count至少必须提供一个update的--name最长 100 字符,不能包含/ \ ? * [ ] :等特殊字符update的--index为 0-based 非负整数,0 表示移动到最前面update的--hidden设为 true 时,至少需要保留一个可见的工作表,不能将所有工作表都隐藏update的--frozen-row-count/--frozen-column-count为非负整数,不能超过工作表的总行数/列数,设为 0 表示取消冻结update当同时提供多个属性时,所有属性将在同一次请求中更新copy复制操作会将源工作表的所有内容(包括数据、格式、公式等)完整复制到新工作表copy的--name可选,不传时系统自动生成名称(通常为"源名称 副本"或类似格式)copy的--name最长 100 字符,不能包含/ \ ? * [ ] :等特殊字符copy当指定名称与已有工作表重复时,系统会自动重命名为合法值copy的--index可选,不传时副本将放置在源工作表之后的默认位置delete-sheet为不可逆操作,执行前必须向用户确认delete-sheet不能删除隐藏的工作表,需先通过update --hidden=false取消隐藏再删除delete-sheet不能删除最后一个可见工作表,至少保留一个可见工作表show-gridline/hide-gridline为幂等写操作:连续调用同一命令不会报错,适合 Agent 不确定当前状态时直接调用show-gridline/hide-gridline仅控制网格线视觉显示,不影响数据、打印、冻结行列等任何其他属性- ★ 关键区分: sheet(电子表格/单元格读写) vs aitable(AI多维表/结构化记录/字段定义) vs doc(文档编辑/阅读)