127 KiB
电子表格 (sheet) 命令参考
适用范围(重要)
sheet 的单元格与工作表操作仅支持钉钉在线电子表格(contentType=ALIDOC、extension=axls)。sheet import create 是 Agent 可发现的文件入口:它接收本地 xlsx / xls,转换并新建在线电子表格;不能把已上传的 xlsx 节点直接当作 axls 操作。
| 文件类型 | 处理方式 |
|---|---|
在线电子表格(axls) |
走 sheet 全部命令(读/写/筛选/合并/导出等服务端原子操作) |
本地路径上的 xlsx / xls |
用 dws sheet import create --file <路径> --folder-token <ID> 或 --workspace <ID> 转换为新的在线电子表格 |
钉盘/文档中已有的 xlsx / xls / xlsm / csv 节点 |
不能直接调用工作表/单元格命令;先用 dws doc download --node <ID> --output <路径> 下载。若用户要转为在线表格,再对下载文件执行 sheet import |
| 想把在线表格导出为 xlsx | 用 dws sheet export ——输入是 axls,输出是 xlsx(axls → xlsx 的格式转换) |
用户直接粘贴原始
alidocsURL 时必须先 probe:先执行dws doc info --node <URL> --format json,按 链接规范 校验contentType和extension:
- 仅当
contentType=ALIDOC且extension=axls时,才继续走sheet- 如果是
xlsx/xls/xlsm/csv,立即转向dws doc download,并告知用户"这是本地表格文件,已为你下载到本地处理"
URL 识别与 NODE_ID 提取
当用户输入包含钉钉文档 URL 时,必须先识别并提取 NODE_ID,再判断意图。
硬性规则:对用户直接给出的原始 alidocs URL,不允许直接走 sheet 命令,必须先执行:
dws doc info --node "<URL>" --format json
根据返回路由:
contentType=ALIDOC+extension=axls→ 继续走sheetcontentType≠ALIDOC+extension=xlsx/xls/xlsm/csv→ 转向dws doc download --node <ID> --output <路径>,禁止调用任何 sheet 子命令- 其他类型 → 按 链接规范 路由
补充:如果这是用户直接提供的原始 alidocs URL,先按 链接规范 probe 一次确认真实类型,再判断是否继续走 sheet。
支持的 URL 格式
| 格式 | 示例 | NODE_ID 提取方式 |
|---|---|---|
alidocs.dingtalk.com/i/nodes/{id} |
https://alidocs.dingtalk.com/i/nodes/9E05BDRVQePjzLkZt2p2vE7kV63zgkYA |
取 URL 路径最后一段 |
alidocs.dingtalk.com/i/nodes/{id}?queryParams |
https://alidocs.dingtalk.com/i/nodes/abc123?doc_type=wiki_doc |
忽略 query 参数,取路径最后一段 |
alidocs.dingtalk.com/spreadsheetv2/{key}/... |
https://alidocs.dingtalk.com/spreadsheetv2/vKJngl50tJN1v3a3/...?dentryKey=vKJngl50tJN1v3a3&type=s |
不要提取 path segment,将完整 URL 直接传给 --node 参数,由 MCP 服务端解析 |
提取规则
- 匹配 URL 中
alidocs.dingtalk.com域名 - 判断 URL 路径格式:
- 路径包含
/i/nodes/→ 取 URL path 的最后一段作为 NODE_ID(去掉 query string 和 fragment) - 路径包含
/spreadsheetv2/→ 不要提取 path segment,必须将完整 URL 原样传给--node参数(因为 path 中的短 ID 不是合法的 nodeId,MCP 服务端会自行解析完整 URL)
- 路径包含
- 对于
/i/nodes/格式,提取出的 NODE_ID 可直接用于所有--node参数,也可将完整 URL 传给--node(CLI 会自动解析) - 对用户直接提供的原始
alidocsURL,先按 链接规范 probe;只有 probe 确认contentType=ALIDOC且extension=axls时,才继续留在sheet;如果extension=xlsx/xls/xlsm/csv,必须转向dws doc download,不能走任何 sheet 命令
查询命令帮助
当你不确定某个命令的具体参数、格式或可选项时,优先执行 --help 查询,不要猜测参数名或凭记忆编造。
# 查看 sheet 下所有子命令
dws sheet --help
# 查看具体命令的完整参数说明
dws sheet range update --help
dws sheet filter-view create --help
dws sheet insert-dimension --help
# 查看子命令组下的所有命令
dws sheet range --help
dws sheet filter-view --help
规则:
- 参数名不确定时 → 先
--help,再调用 - 报错 "unknown flag" 时 →
--help确认正确的 flag 名称 - 不确定某个功能是否存在时 →
dws sheet --help查看命令列表
命令速查表
| 命令 | 用途 |
|---|---|
sheet create |
创建钉钉表格文档 |
sheet list |
获取全部工作表列表 |
sheet info |
获取指定工作表详情 |
sheet new |
新建工作表 |
sheet update |
更新工作表属性(标题/位置/隐藏/冻结) |
sheet copy |
复制工作表 |
sheet show-gridline |
显示工作表网格线 |
sheet hide-gridline |
隐藏工作表网格线 |
sheet range read |
读取工作表数据(别名: range get) |
sheet range update |
更新指定区域内容(值/公式/超链接) |
sheet range clear |
清除区域(值/格式/全部) |
sheet range sort |
对区域排序 |
sheet range fill |
自动填充区域 |
sheet range copy-to |
复制区域到目标位置 |
sheet range move-to |
移动区域到目标位置 |
sheet range batch-clear |
批量清除多个区域(原子事务) |
sheet batch-update |
批量执行多个写操作(原子事务) |
sheet csv-get |
以 CSV 格式读取区域数据 |
sheet table-get |
读取结构化 table 数据(别名: table-read) |
sheet range set-style |
设置单元格样式 |
sheet range batch-set-style |
按配置文件批量设置样式 |
sheet find |
搜索单元格内容 |
sheet append |
在末尾追加数据行 |
sheet csv-put |
将 CSV 数据写入指定位置(纯值,自动扩容) |
sheet table-put |
写入一个或多个结构化 table(别名: table-write) |
sheet pivot-table list |
列出透视表或获取指定透视表详情 |
sheet pivot-table create |
创建原生透视表 |
sheet pivot-table update |
更新透视表配置 |
sheet pivot-table delete |
删除透视表(不可逆,删除前必须确认) |
sheet delete-sheet |
删除工作表(不可逆,删除前必须确认) |
sheet replace |
全局查找替换文本 |
sheet merge-cells |
合并单元格 |
sheet unmerge-cells |
取消合并单元格 |
sheet set-dropdown |
设置下拉列表 |
sheet get-dropdown |
获取下拉列表配置 |
sheet delete-dropdown |
删除下拉列表 |
sheet insert-dimension |
在指定位置插入行或列 |
sheet delete-dimension |
删除指定位置的行或列 |
sheet update-dimension |
更新行/列属性(显隐/行高/列宽) |
sheet move-dimension |
移动行或列到指定位置 |
sheet add-dimension |
在末尾追加空行或空列 |
sheet group-dimension |
创建行/列分组 |
sheet ungroup-dimension |
取消行/列分组 |
sheet media-upload |
上传附件到表格 |
sheet write-image |
上传图片并写入单元格 |
sheet create-float-image |
创建浮动图片 |
sheet get-float-image |
获取浮动图片详情 |
sheet list-float-images |
列出工作表所有浮动图片 |
sheet update-float-image |
更新浮动图片属性 |
sheet delete-float-image |
删除浮动图片 |
sheet import create |
导入本地 xlsx/xls 为新的在线电子表格(sheet import 保留兼容) |
sheet export |
导出表格为 xlsx |
sheet filter get |
获取全局筛选信息 |
sheet filter create |
创建全局筛选 |
sheet filter delete |
删除全局筛选 |
sheet filter update |
批量更新筛选条件 |
sheet filter clear-criteria |
清除单列筛选条件 |
sheet filter sort |
筛选排序 |
sheet filter-view list |
获取所有筛选视图 |
sheet filter-view create |
创建筛选视图 |
sheet filter-view update |
更新筛选视图属性 |
sheet filter-view delete |
删除筛选视图 |
sheet filter-view update-criteria |
更新筛选视图列条件 |
sheet filter-view delete-criteria |
删除筛选视图列条件 |
sheet filter-view info |
获取单个筛选视图详情 |
sheet filter-view list-criteria |
列出筛选视图所有列条件 |
sheet filter-view get-criteria |
获取单列筛选条件详情 |
sheet cond-format list |
获取条件格式规则 |
sheet cond-format create |
创建条件格式规则 |
sheet cond-format update |
更新条件格式规则 |
sheet cond-format delete |
删除条件格式规则 |
sheet chart list |
获取浮动图表 |
sheet chart create |
创建浮动图表 |
sheet chart update |
更新浮动图表 |
sheet chart delete |
删除浮动图表 |
sheet template list |
获取表格模板列表 |
sheet template search |
搜索表格模板 |
sheet template apply |
应用模板创建新表格文档 |
不确定参数?对任意命令执行
dws sheet <命令> --help查看完整用法。
子文档索引(更多命令详细参考)
本文档覆盖高频命令。以下命令的完整参数、示例与工作流在 sheet/ 子目录,需要时按主题查阅:
| 主题 | 子文档 | 覆盖命令 |
|---|---|---|
| 表格与工作表管理 | sheet/sheet-workbook.md | create / list / info / new / update / copy / show-gridline / hide-gridline / delete-sheet |
| 透视表 | sheet/sheet-pivot-table.md | pivot-table list / create / update / delete |
| 写入数据 | sheet/sheet-write-data.md | table-put / range update(对象协议详解)/ append / csv-put |
| 读取数据 | sheet/sheet-read-data.md | table-get / range read / csv-get |
| 区域操作 | sheet/sheet-range-operations.md | range clear / sort / fill / copy-to / move-to |
| 批量操作 | sheet/sheet-batch-operations.md | range batch-clear / batch-update |
| 行列操作 | sheet/sheet-dimension-operations.md | insert / delete / update / move / add-dimension / group-dimension / ungroup-dimension |
| 样式与合并 | sheet/sheet-style-format.md | range set-style / batch-set-style / merge-cells / unmerge-cells |
| 条件格式 | sheet/sheet-conditional-format.md | cond-format list / create / update / delete |
| 浮动图表 | sheet/sheet-chart.md | chart list / create / update / delete |
| 下拉列表 | sheet/sheet-dropdown.md | set / get / delete-dropdown |
| 媒体与图片 | sheet/sheet-media-image.md | media-upload / write-image / 浮动图片 |
| 查找替换 | sheet/sheet-search-replace.md | find / replace |
| 全局筛选 | sheet/sheet-filter.md | filter get / create / delete / update / clear-criteria / sort |
| 筛选视图 | sheet/sheet-filter-view.md | filter-view 全系列 |
| 导入 | sheet/sheet-import.md | import / import get |
| 导出 | sheet/sheet-export.md | export |
template list/search/apply无独立子文档,直接执行dws sheet template <子命令> --help查看用法。
意图判断
表格与工作表管理
用户说"创建表格/新建电子表格":
- 创建表格文档 →
create
用户说"看工作表/有哪些工作表/表格结构":
- 列出工作表 →
list - 工作表详情 →
info
用户说"加工作表/新增Sheet":
- 新建工作表 →
new
用户说"修改工作表名称/重命名工作表/移动工作表位置/隐藏工作表/显示工作表/冻结行/冻结列/取消冻结/更新工作表属性":
- 更新工作表属性 →
update - 重命名工作表 →
update --title "新名称" - 移动工作表位置 →
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 --title "副本名称" - 复制并指定位置 →
copy --index N
数据读写
用户说"读数据/看表格内容":
- 读取数据 →
range read
用户说"写数据/填表/更新单元格/写入公式":
- 更新数据 →
range update - 【强制】
--sheet-id必填:即使是单工作表也不能省略,不要参照range read的默认行为;未知时先执行dws sheet list --node <NODE_ID> --format json获取sheetId,禁止凭空臆测为Sheet1、sheet1、0、default等 - 注意:如果用户的目的是替换文本、移动行列或追加空行空列,请勿使用
range update,必须使用对应的专用命令(replace/move-dimension/add-dimension) - 批量纯值写入优先用
csv-put:当写入场景同时满足以下条件时,必须优先使用csv-put而非range update:(1) 写入的是纯值(不含公式、超链接);(2) 数据量较大(超过 5 行或超过 20 个单元格);(3) 数据来源为表格/CSV 文本/结构化文本。csv-put无需手动构造二维 JSON 数组,直接传 CSV 文本即可,更简洁高效且支持自动扩容
用户说"追加数据/添加行/在末尾加数据/新增记录":
- 追加数据 →
append
用户说"批量写入CSV/导入CSV/CSV写入表格/把CSV贴到表格里":
- 写入 CSV →
csv-put - 与
range update的区别:csv-put接受 CSV 文本直接写入,无需手动构造二维 JSON 数组;适合大批量纯值写入 - 与
append的区别:csv-put写入指定位置(--start-cell),append在末尾追加
用户说"搜索/查找/找单元格/搜内容/精确搜索/精确匹配/完全匹配/全字匹配":
- 搜索单元格 →
find - 精确匹配(只匹配完全等于的,不匹配包含的) →
find --match-entire-cell - 正则搜索 →
find --use-regexp - 搜索公式 →
find --match-formula - 不要用
range read读取全量数据后在客户端过滤来替代find,必须使用find命令的服务端搜索能力
用户说"替换/查找替换/全局替换/批量替换/把A替换成B/把所有的X改成Y":
- 查找替换 →
replace - 精确匹配后替换(只替换内容完全等于的单元格) →
replace --match-entire-cell - 正则替换 →
replace --use-regexp - 删除匹配内容 →
replace --replacement "" - 请勿用
find+range update、range read+range update等组合来模拟替换,replace是服务端原子操作,效率更高且返回替换计数
行列操作
用户说"插入行/插入列/在某行前插入/在某列前插入":
- 插入行或列 →
insert-dimension - 在末尾追加 →
append(insert-dimension 不支持末尾追加)
用户说"删除行/删除列/删掉第几行/删掉某列/移除行/移除列":
- 删除行或列 →
delete-dimension - 仅清空内容但保留行/列 →
range clear(整片区域清除,比逐格写空更简洁)
用户说"隐藏行/隐藏列/显示行/显示列/设置行高/设置列宽/调整行高/调整列宽/行列属性":
- 隐藏/显示行或列 →
update-dimension --hidden/--hidden=false - 设置行高/列宽 →
update-dimension --pixel-size - 同时修改尺寸与显隐 →
update-dimension --pixel-size --hidden
用户说"移动行/移动列/调整行顺序/调整列顺序/行列拖拽/把第N行移到第M行":
- 移动行或列 →
move-dimension - 请勿用
range read+range update读取再重写来模拟移动,move-dimension是原子操作,能保留格式和合并状态
用户说"追加空行/追加空列/增加行数/增加列数/扩展表格/在末尾加空行":
- 追加空行/空列 →
add-dimension - 注意与
append(追加数据行)区分:add-dimension追加的是空行/空列,append追加的是带数据的行 - 请勿用
range update写空数据来模拟追加,add-dimension直接扩展表格维度
用户说"创建行分组/创建列分组/折叠几行/折叠几列/取消行列分组":
- 创建分组 →
group-dimension --range <整行或整列范围> - 取消分组 →
ungroup-dimension --range <整行或整列范围> --range只能传整行或整列范围,如3:7、C:F、Sheet1!3:7,不要传A1:C5
单元格格式
用户说"设置样式/改颜色/设背景色/加粗/居中/换行/字体颜色/字号":
- 设置单元格样式 →
range set-style - 批量设置不同 range 的样式 →
range batch-set-style --batch ./styles.json(内部顺序循环调update_range) - 请勿用
range update --values写空/重写来模拟样式变更;也请勿把样式变更混在range update里、再故意清空--values
用户说"设置数字格式/改成百分比/用人民币显示/按日期显示/文本格式/保留几位小数":
- 设置数字格式 →
range set-style --number-format <格式代码>(如0%/¥#,##0.00/yyyy/m/d/@) - 请勿用
range update传递数字格式,range update仅负责写入值与超链接;数字格式属于单元格样式,统一走range set-style
用户说"合并单元格/合并/合并区域/按行合并/按列合并":
- 合并所有单元格 →
merge-cells(默认 mergeAll) - 按行合并 →
merge-cells --merge-type mergeRows - 按列合并 →
merge-cells --merge-type mergeColumns
用户说"取消合并/拆分单元格/还原合并":
- 取消合并单元格 →
unmerge-cells
下拉列表
用户说"设置下拉列表/下拉选项/下拉菜单/添加下拉/配置下拉":
- 设置下拉列表 →
set-dropdown - 设置多选下拉 →
set-dropdown --multi-select
用户说"查看下拉列表/获取下拉配置/下拉列表有哪些选项":
- 获取下拉列表配置 →
get-dropdown
用户说"删除下拉列表/移除下拉/取消下拉/清除下拉":
- 删除下拉列表 →
delete-dropdown
媒体上传
用户说"上传附件/传文件到表格/上传文件到表格/上传到表格":
- 上传附件 →
media-upload(需表格 ID 或 URL + 本地文件路径) - 用户指定了上传后的名称 →
media-upload --name "自定义名称" media-upload的--name参数用于指定附件在表格中显示的名称(不改变本地文件名);不传时默认使用本地文件名
用户说"写入图片/插入图片/加图片/放图片到单元格/嵌入图片到表格":
- 写入图片 →
write-image(需表格 ID + 工作表 ID + 单元格范围 + 本地图片路径) - 禁止使用
range update写入图片,因为update_range的 MCP 工具不支持图片类型参数,调用必定失败。必须使用write-image命令 - 用户指定了图片尺寸 →
write-image --width N --height M
浮动图片
用户说"浮动图片/悬浮图片/在表格上放一张图/加个浮动的图":
- 创建浮动图片 → 先
media-upload上传图片获取resourceUrl,再create-float-image - 浮动图片悬浮于单元格之上,不占用单元格内容,与
write-image(写入单元格内部的图片)不同
用户说"查看浮动图片/有哪些浮动图片/浮动图片列表":
- 列出所有浮动图片 →
list-float-images - 查看某个浮动图片详情 →
get-float-image
用户说"移动浮动图片/调整浮动图片大小/修改浮动图片/更新浮动图片":
- 更新浮动图片属性 →
update-float-image(可更新锚点位置、尺寸、偏移量、图片资源路径)
用户说"删除浮动图片/移除浮动图片":
- 删除浮动图片 →
delete-float-image
关键区分:write-image(单元格内嵌图片,占据单元格内容)vs create-float-image(浮动图片,悬浮于单元格之上,不占内容)
筛选视图
用户说"筛选/过滤/只看某些值/只显示满足条件的行/筛选数据/创建筛选/删除筛选/设置筛选条件/清除筛选/排序":
- 查看当前筛选 →
filter get - 创建筛选 →
filter create - 删除筛选 →
filter delete - 批量设置多列条件 →
filter update - 清除某一列条件 →
filter clear-criteria - 按列排序 →
filter sort - 区分全局筛选与筛选视图:如果用户说"筛选视图"则走
filter-view系列;如果只说"筛选/过滤/只看"则默认走全局filter系列 - 禁止替代方案:当用户要求"筛选/只看/仅保留某些行"时,必须通过
filter create/filter update创建真实的筛选器。禁止用"删除不符合条件的行"或"新建工作表只放符合条件的行"来代替——这些做法会让原数据丢失或不可恢复
用户说"筛选视图/查看筛选视图/有哪些筛选视图/筛选视图列表":
- 获取所有筛选视图 →
filter-view list
用户说"筛选视图详情/查看某个筛选视图/筛选视图信息/筛选视图配置":
- 获取单个筛选视图详情 →
filter-view info
用户说"创建筛选视图/新建筛选视图/添加筛选视图":
- 创建筛选视图 →
filter-view create
用户说"更新筛选视图/修改筛选视图/改筛选视图名称/改筛选视图范围":
- 更新筛选视图属性 →
filter-view update
用户说"删除筛选视图/移除筛选视图":
- 删除筛选视图 →
filter-view delete
用户说"设置筛选条件/添加筛选条件/配置筛选视图条件/按值筛选/按条件筛选/按颜色筛选":
- 设置筛选视图列条件 →
filter-view update-criteria
用户说"查看筛选条件/有哪些筛选条件/筛选视图设了什么条件/列出筛选条件":
- 列出所有列条件 →
filter-view list-criteria - 查看某一列的条件 →
filter-view get-criteria --column N
用户说"清除筛选条件/移除筛选条件/取消筛选条件":
- 清除筛选视图列条件 →
filter-view delete-criteria - 注意与
filter-view delete(删除整个筛选视图)区分:delete-criteria仅清除指定列的条件,不删除筛选视图本身
导入
用户说"导入Excel/把xlsx转为在线表格/上传本地表格并在线编辑":
- 使用
sheet import,本地文件仅支持xlsx/xls --folder-token与--workspace至少提供一个;不指定--name时使用文件名- CLI 内部完成上传、转换和轮询,Agent 不要自行拆分流程或重复提交
- 若返回
timed_out:true,执行返回的next_command续查,不要重新执行 import - 详见 sheet/sheet-import.md
导出
用户说"导出/下载xlsx/存为Excel/存成表格文件/把表格变成xlsx/导出表格/下载表格/导出为 excel":
- 导出表格 →
export(单命令一站式,内部自动完成提交、轮询、可选下载) - 仅需传
--node,可选--output指定本地文件/目录(不传则返回 downloadUrl) - 需要落盘到本地 →
dws sheet export --node <NODE_ID> --output <path>,命令自动下载 xlsx - 禁止用
range read全量读取后自行拼接 xlsx 来模拟导出,必须使用export命令(服务端原子导出,保留格式/合并/公式等属性) - 禁止在 AI Agent 侧实现轮询或重试,CLI 内部已按渐进式退避策略完成(最多 30 次约 5 分钟)
URL 粘贴场景
用户直接粘贴表格 URL(无其他指令):
- 先 probe:
dws doc info --node <URL> --format json校验contentType和extension extension=axls→list(列出工作表)+range read(读取第一个工作表数据)extension=xlsx/xls/xlsm/csv→ 转dws doc download --node <URL> --output ./,告知用户"这是本地表格文件,已为你下载到本地",然后基于本地文件继续后续处理
用户粘贴 URL + 附加指令:
- 已 probe 为
axls时:- "帮我看看这个表格有什么数据" →
range read - "这个表格有哪些工作表" →
list - "往这个表格写入数据" →
range update - "帮我找一下表格里的XXX" →
find
- "帮我看看这个表格有什么数据" →
- probe 为 xlsx/xls/xlsm/csv 时:无论用户说"读数据/查看/分析",先走
dws doc download下载到本地,由用户或后续步骤对本地 xlsx 进行解析,严禁调用sheet list/range read等命令
关键区分: sheet(电子表格/单元格读写) vs aitable(AI多维表/结构化记录) vs doc(文档编辑/阅读)
关键注意事项
以下是最容易出错的规则,必须严格遵守:
- ★
--sheet-id获取规范(强制):sheetId未知时必须先通过dws sheet list --node <NODE_ID> --format json查询,禁止凭空编造(如臆测为Sheet1、sheet1、0、default等) - ★
range update单元格协议(强制):--values是二维 JSON 数组,每个单元格必须是 object(如{"type":"text","text":"张三"}),不再支持裸值"张三"/90/null。裸值会报错「不支持原始值……每个单元格必须是 object」。数字/布尔也写成字符串 object(如{"type":"text","text":"90"}),服务端自动识别类型。超链接写在单元格 object 的hyperlink字段,没有--hyperlinksflag(传了报 unknown flag) - ★
range update维度校验(强制):--values的行列数必须与--range完全一致。例如--range "A1:C3"→--values必须是 3×3 的 object 数组 - ★
range update清空规范(强制):清空单个单元格用{"type":"text","text":""};清空整片区域用range clear。跳过某格保留原值用{}空对象 - ★ 单次调用上限(强制):
range update/set-style行数 ≤ 1000,单元格总数建议 ≤ 5000(硬限 30000) - ★ 大批量纯值写入用
csv-put不用range update:当写入纯值(无公式/超链接)且数据量较大时(>5 行或 >20 单元格),必须使用csv-put。csv-put接受 CSV 文本直接写入,无需构造二维 JSON 数组,支持自动扩容,更简洁高效。仅在需要写入公式、超链接、或仅更新少量单元格时才使用range update - ★ 搜索用
find不用range read:find是服务端搜索,禁止用range read全量读取后客户端过滤 - ★ 替换用
replace不用range update:replace是服务端原子操作,返回替换计数 - ★ 移动用
move-dimension不用range update:原子操作,保留格式和合并状态 - ★ 单元格图片用
write-image不用range update:update_rangeMCP 不支持图片参数,调用必失败 - ★ 浮动图片用
create-float-image不用write-image:两者用途不同——write-image写入单元格内部,create-float-image创建悬浮于单元格之上的浮动图片;--src必须来自media-upload的resourceUrl - ★
export禁止自行轮询/重试:CLI 内部已完成渐进式退避轮询(最多 30 次约 5 分钟),失败时直接告知用户稍后再试 - ★ 关键区分:sheet(在线电子表格/单元格读写) vs aitable(AI多维表/结构化记录/字段定义) vs doc(文档编辑/阅读)
完整注意事项请参见本文档末尾「注意事项(完整版)」章节。
命令详细参考
以下为各命令的完整 Usage、Flags 和示例。参数不确定时也可直接执行
dws sheet <命令> --help在线查看。
创建钉钉表格文档
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 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"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (不传则返回第一个工作表)
新建工作表
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> --title "汇总表" --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 字符,不能包含 / \ ? * [ ] :
--title string --name 的别名(兼容)
--index int 新位置(从 0 开始)
--hidden --hidden=true 隐藏,--hidden=false 取消隐藏
--tab-color string 工作表标签颜色,Hex 如 #FF0000;传空字符串清除颜色
--frozen-row-count int 冻结行数,0 表示取消冻结
--frozen-column-count int 冻结列数,0 表示取消冻结
更新工作表名称、位置、隐藏状态、标签颜色、冻结行列。
--name(别名 --title)/ --index / --hidden / --tab-color / --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> --title "销售副本" --index 2
# 只指定名称
dws sheet copy --node <NODE_ID> --sheet-id <SHEET_ID> --title "备份"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 源工作表 ID 或名称 (必填)
--title string 副本名称,最长 100 字符,不能包含 / \ ? * [ ] : (不传则系统自动生成)
--index int 副本位置(从 0 开始)(不传则放在源工作表之后)
复制指定工作表,在同一表格中创建一个副本。
复制操作会将源工作表的所有内容(包括数据、格式、公式等)完整复制到新工作表中。
传 --index 时,CLI 会先复制,再追加一次位置更新,把副本移动到目标索引。
名称与已有工作表重复时系统会自动重命名。
读取工作表数据
Usage:
dws sheet range read [flags] # 别名: dws sheet range get
Example:
dws sheet range read --node <NODE_ID>
dws sheet range read --node <NODE_ID> --sheet-id <SHEET_ID>
dws sheet range read --node <NODE_ID> --sheet-id "Sheet1" --range "A1:D10"
dws sheet range read --node <NODE_ID> --range "Sheet1!A1:D10"
# 使用 get 别名,与 read 等价
dws sheet range get --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:D10"
# 指定取值模式:原始值 / 公式文本
dws sheet range read --node <NODE_ID> --value-render-option raw_value
dws sheet range read --node <NODE_ID> --value-render-option formula
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (不传则默认第一个工作表)
--range string 读取范围,A1 表示法 (如 A1:D10,不传则读取全部数据)
--value-render-option string 取值模式: formatted_value(格式化展示值,默认) | raw_value(原始值) | formula(公式文本,无公式回退原始值)
超时处理建议:读取大范围数据时若出现超时或响应过慢,请主动缩小 --range 查询范围,建议单次读取的单元格数量控制在 5000 个以内(例如 50 行 × 100 列、100 行 × 50 列)。对于大表可采用分页读取策略:
- 先通过
info获取nonEmptyRange.range/nonEmptyRange.lastRow/nonEmptyRange.lastColumn确定数据边界(空表时这些字段为 null) - 按行分批读取,如
A1:J500、A501:J1000、A1001:J1500…… - 避免不传
--range直接读取整个大工作表
更新工作表指定区域内容
Usage:
dws sheet range update [flags]
Example:
# 写入文本(每个单元格必须是 object)
dws sheet range update --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:B2" \
--values '[[{"type":"text","text":"姓名"},{"type":"text","text":"分数"}],[{"type":"text","text":"张三"},{"type":"text","text":"90"}]]'
# 写入公式(text 以 = 开头识别为公式)
dws sheet range update --node <NODE_ID> --sheet-id <SHEET_ID> --range "C2" \
--values '[[{"type":"text","text":"=A2&B2"}]]'
# 写入单元格级超链接(写在 cell 的 hyperlink 字段,没有 --hyperlinks flag)
dws sheet range update --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1" \
--values '[[{"type":"text","text":"钉钉","hyperlink":{"type":"path","link":"https://dingtalk.com"}}]]'
# 只更新部分单元格:用 {} 空对象占位保留原值
dws sheet range update --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:B1" \
--values '[[{"type":"text","text":"新值"},{}]]'
# 清空单个单元格(text 为空字符串)
dws sheet range update --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1" \
--values '[[{"type":"text","text":""}]]'
# 清空整片区域请改用 range clear
dws sheet range clear --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:B3"
Flags:
--node string 表格文档 ID (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--range string 目标单元格区域地址,如 A1:B3 (必填)
--values string 单元格内容,二维 JSON 数组 (必填);每个元素必须是 object
单元格对象协议(重要):--values 每个元素必须是 object,支持以下形态:
{"type":"text","text":"内容"}:普通文本;text以=开头识别为公式;text为""清空该格;数字/布尔写成字符串({"type":"text","text":"100"}),服务端自动识别类型{"type":"text","text":"内容","cellStyles":{...}}:文本 + 整格样式(fontWeight/fontColor/backgroundColor/numberFormat等){"type":"richText","texts":[...]}:富文本,子项可为 text/link/attachment/image,片段样式写在子项style{"type":"text","text":"钉钉","hyperlink":{"type":"path","link":"https://..."}}:整格超链接(type可为path/sheet/range,或{"type":"none"}清除){"dataValidation":{...}}:写下拉/复选框数据验证{}:空对象,跳过该格保留原值(只改部分单元格时占位用)
不再支持裸值("张三" / 90 / null),原样传入会报「不支持原始值……每个单元格必须是 object」。
单次调用建议:行数 ≤ 1000,单元格总数(行×列)≤ 5000;超过时请拆分多次调用。
何时该用 csv-put 替代:如果你准备用 range update 写入纯值(不含公式和超链接),且数据量超过 5 行或 20 个单元格,应改用 csv-put——它接受 CSV 文本直接写入,无需手动拼装 object 数组,且支持自动扩容行列。仅在需要写入公式(=SUM(...))、超链接、富文本、或修改少量单元格时才使用 range update。
范围职责:range update 负责写入单元格的值、超链接、per-cell 样式与数据验证。批量刷整片区域的统一样式或数字格式(百分比 / 货币 / 日期 / 文本等)请使用 dws sheet range set-style --number-format <格式代码>。
设置单元格样式
Usage:
dws sheet range set-style [flags]
Example:
# 给 A1:B3 打上黄底粗体居中
dws sheet range set-style --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:B3" \
--bg-color "#FFF2CC" --font-weight bold --h-align center
# 给 C1:C5 逐单元格设置不同背景色
dws sheet range set-style --node <NODE_ID> --sheet-id <SHEET_ID> --range "C1:C5" \
--bg-colors-json '[["#FF0000"],["#00FF00"],["#0000FF"],["#FFFF00"],["#FF00FF"]]'
# 整片 range 启用自动换行
dws sheet range set-style --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:E10" --word-wrap autoWrap
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--range string 目标区域,如 A1:B3 (必填)
--bg-color string 背景色(#RRGGBB),一键刷整个 range;与 --bg-colors-json 二选一
--bg-colors-json string 背景色二维 JSON 数组,维度需与 --range 一致
--font-size int 字号,一键刷整个 range;与 --font-sizes-json 二选一
--font-sizes-json string 字号二维 JSON 数组
--h-align string 水平对齐:left/center/right/general
--h-aligns-json string 水平对齐二维 JSON 数组
--v-align string 垂直对齐:top/middle/bottom
--v-aligns-json string 垂直对齐二维 JSON 数组
--font-color string 字体颜色(#RRGGBB)
--font-colors-json string 字体颜色二维 JSON 数组
--font-weight string 字体粗细:bold/normal
--font-weights-json string 字体粗细二维 JSON 数组
--word-wrap string 换行方式:overflow/clip/autoWrap(整个 range 共用)
--number-format string 数字格式,如 General/@/#,##0/0%/yyyy/m/d
特性说明:
- 每个样式维度提供两种写法,二选一:
--xxx(单值刷整个 range,CLI 本地展开为二维数组)vs--xxx-json(逐单元格指定,维度需与--range完全一致) - 至少需传入一个样式参数。单次调用建议:行数 ≤ 1000,单元格总数 ≤ 5000
- 枚举值按驼峰书写:
autoWrap、bold、normal、center等
批量设置单元格样式
Usage:
dws sheet range batch-set-style [flags]
Example:
dws sheet range batch-set-style --node <NODE_ID> --batch ./styles.json
dws sheet range batch-set-style --node <NODE_ID> --batch ./styles.json --continue-on-error
Flags:
--node string 表格文档 ID 或 URL (必填)
--batch string 批次配置 JSON 文件路径 (必填)
--continue-on-error 遇到失败时继续执行后续条目(默认遇错即停)
配置文件格式(JSON 数组,每个元素一条批次项):
[
{
"sheetId": "Sheet1",
"range": "A1:B3",
"bgColor": "#FFF2CC",
"fontSize": 12,
"hAlign": "center",
"vAlign": "middle",
"fontColor": "#333333",
"fontWeight": "bold",
"wordWrap": "autoWrap",
"numberFormat": "General"
},
{
"sheetId": "Sheet1",
"range": "C1:C5",
"bgColorsJson": "[[\"#FF0000\"],[\"#00FF00\"],[\"#0000FF\"],[\"#FFFF00\"],[\"#FF00FF\"]]"
}
]
特性说明:
- CLI 侧顺序循环逐条调用
update_range(非服务端批量),运行时输出[N/M]进度 - 每条记录执行与
set-style一致的校验:至少一项样式字段 + rows ≤ 1000 + rows×cols ≤ 30000 + 枚举合法 - 默认遇错即停(返回非 0),
--continue-on-error时所有条目跑完再返回首个错误
在工作表中搜索单元格内容
Usage:
dws sheet find [flags]
Example:
# 基本搜索
dws sheet find --node <NODE_ID> --sheet-id <SHEET_ID> --find "销售额"
# 在指定范围内搜索
dws sheet find --node <NODE_ID> --sheet-id <SHEET_ID> --find "合计" --range "A1:D100"
# 正则表达式搜索(不区分大小写)
dws sheet find --node <NODE_ID> --sheet-id <SHEET_ID> --find "^total" --use-regexp --match-case=false
# 精确匹配整个单元格内容
dws sheet find --node <NODE_ID> --sheet-id <SHEET_ID> --find "完成" --match-entire-cell
# 搜索公式文本
dws sheet find --node <NODE_ID> --sheet-id <SHEET_ID> --find "SUM" --match-formula
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--find string 搜索文本 (必填)
--range string 搜索范围,A1 表示法 (如 A1:D10)
--match-case 区分大小写 (默认 true)
--match-entire-cell 精确匹配整个单元格内容
--use-regexp 启用正则表达式搜索
--match-formula 搜索公式文本而非显示值
--include-hidden 包含隐藏单元格
在工作表末尾追加数据
Usage:
dws sheet append [flags]
Example:
dws sheet append --node <NODE_ID> --sheet-id <SHEET_ID> --values '[["张三","销售部",50000]]'
dws sheet append --node <NODE_ID> --sheet-id "Sheet1" \
--values '[["李四","市场部",38000],["王五","销售部",62000]]'
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--values string 追加数据,二维 JSON 数组 (必填)
--values 为二维 JSON 数组,外层每个元素代表一行,内层每个元素代表一个单元格值。
追加的数据列数应与工作表已有数据的列数保持一致。
将 CSV 数据写入指定位置
Usage:
dws sheet csv-put [flags]
Example:
# 内联多行 CSV:必须用 $'...' 让 \n 变成真换行;普通单引号 '...\n...' 里的 \n 是字面量,会写成一行含字面 \n 的错误数据
dws sheet csv-put --node <NODE_ID> --sheet-id <SHEET_ID> --start-cell A1 \
--csv $'name,score\nAlice,95\nBob,87'
# 多行数据推荐用 @文件,最稳妥
dws sheet csv-put --node <NODE_ID> --sheet-id <SHEET_ID> --start-cell B2 \
--csv @data.csv --allow-overwrite
cat data.csv | dws sheet csv-put --node <NODE_ID> --sheet-id <SHEET_ID> \
--start-cell A1 --csv -
dws sheet csv-put --node <NODE_ID> --sheet-id <SHEET_ID> --start-cell A1 \
--csv @data.csv --dry-run
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--csv string CSV 文本、@文件路径 或 - 表示 stdin (必填)
--start-cell string 起始单元格,A1 表示法 (必填)
--allow-overwrite 允许覆盖已有数据 (默认 false)
将 RFC 4180 格式的 CSV 文本写入指定工作表的指定单元格位置。
- 只写纯值,不支持公式/样式/批注。
=开头的内容当文本处理,不会被解析为公式 - 数字/日期/百分数由表格引擎自动识别类型(如
95存为数字,2025-03-01存为日期) - 自动扩容行列:CSV 数据超出当前工作表维度时自动追加行/列
- 目标区域如含合并单元格,合并将被打散,值正常写入
--allow-overwrite默认 false,目标区域有数据时需显式传--allow-overwrite才能覆盖--csv支持三种输入:直接传文本、@filepath从本地文件读取、-从 stdin 管道读取- CSV 文本上限 2M 字符,单元格总数上限 30000
- 特殊字符处理:CLI 会自动过滤
\r(Windows 换行符)和 BOM(UTF-8 文件头标记),Excel/Windows 导出的 CSV 可直接使用;如 CSV 数据中含零宽字符(U+200B 等)或 Bidi 控制符,CLI 会拒绝并报错
在指定位置插入行或列
Usage:
dws sheet insert-dimension [flags]
Example:
# 在第 3 行之前插入 2 行
dws sheet insert-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension ROWS --position "3" --length 2
# 在 A 列之前插入 1 列
dws sheet insert-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension COLUMNS --position "A" --length 1
# 使用工作表前缀(忽略 --sheet-id)
dws sheet insert-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension ROWS --position "Sheet1!3" --length 5
# 在 AB 列之前插入 3 列
dws sheet insert-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension COLUMNS --position "AB" --length 3
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--dimension string 插入维度: ROWS 或 COLUMNS (必填)
--position string 插入位置,A1 表示法 (必填)。ROWS 时为行号如 "3";COLUMNS 时为列字母如 "A"
--length string 插入数量,正整数 (必填),最大 5000
在钉钉表格指定工作表的指定位置之前插入若干空行或空列。
--dimension ROWS 时,--position 为 1-based 行号字符串;--dimension COLUMNS 时,--position 为列字母。
支持在 --position 中携带工作表前缀(如 Sheet1!3),此时忽略 --sheet-id。
若需要在末尾追加行/列,请使用 append 命令。
删除指定位置的行或列
CAUTION: 不可逆操作 — 执行前必须向用户确认。
Usage:
dws sheet delete-dimension [flags]
Example:
# 从第 3 行开始删除 2 行
dws sheet delete-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension ROWS --position "3" --length 2
# 从 A 列开始删除 1 列
dws sheet delete-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension COLUMNS --position "A" --length 1
# 使用工作表前缀(忽略 --sheet-id)
dws sheet delete-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension ROWS --position "Sheet1!3" --length 5
# 从 AB 列开始删除 3 列
dws sheet delete-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension COLUMNS --position "AB" --length 3
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--dimension string 删除维度: ROWS 或 COLUMNS (必填)
--position string 删除起始位置,A1 表示法 (必填)。ROWS 时为行号如 "3";COLUMNS 时为列字母如 "A"
--length string 删除数量,正整数 (必填),最大 5000
在钉钉表格指定工作表中,从指定位置起删除若干连续的行或列。
--dimension ROWS 时,--position 为 1-based 行号字符串;--dimension COLUMNS 时,--position 为列字母。
支持在 --position 中携带工作表前缀(如 Sheet1!3),此时忽略 --sheet-id。
删除后后续的行/列会向前移动填补空位;若需要仅清空内容但保留行/列占位,请使用 range clear(整片区域清除,比逐格写空更简洁)。
更新指定范围行/列属性
Usage:
dws sheet update-dimension [flags]
Example:
# 隐藏第 3~4 行
dws sheet update-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension ROWS --start-index "3" --length 2 --hidden
# 显示 A~B 列
dws sheet update-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension COLUMNS --start-index "A" --length 2 --hidden=false
# 设置第 1~5 行行高为 40px
dws sheet update-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension ROWS --start-index "1" --length 5 --pixel-size 40
# 设置 C 列列宽为 200px 并隐藏
dws sheet update-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension COLUMNS --start-index "C" --length 1 --pixel-size 200 --hidden
# 使用工作表前缀(忽略 --sheet-id)
dws sheet update-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension ROWS --start-index "Sheet1!3" --length 2 --hidden
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--dimension string 更新维度: ROWS 或 COLUMNS (必填)
--start-index string 起始位置,A1 表示法 (必填)。ROWS 时为行号如 "3";COLUMNS 时为列字母如 "A"
--length string 更新数量,正整数 (必填),最大 5000
--hidden 是否隐藏 (true=隐藏, false=显示),与 --pixel-size 至少填其一
--pixel-size int 行高或列宽(像素),ROWS 时为行高,COLUMNS 时为列宽,与 --hidden 至少填其一
批量更新钉钉表格指定工作表中连续多行/多列的属性,支持设置显隐状态(hidden)与行高/列宽(pixelSize)。
--dimension ROWS 时,--start-index 为 1-based 行号字符串;--dimension COLUMNS 时,--start-index 为列字母。
支持在 --start-index 中携带工作表前缀(如 Sheet1!3),此时忽略 --sheet-id。
--hidden 与 --pixel-size 至少必须提供一个。当同时提供时,将先应用尺寸再应用显隐,任一失败整体失败。
--pixel-size 单位为像素,dimension=ROWS 时表示行高、dimension=COLUMNS 时表示列宽。
合并单元格
Usage:
dws sheet merge-cells [flags]
Example:
# 合并所有单元格(默认)
dws sheet merge-cells --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:B3"
# 按行合并
dws sheet merge-cells --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:C3" --merge-type mergeRows
# 按列合并
dws sheet merge-cells --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:C3" --merge-type mergeColumns
# 使用带工作表前缀的范围(忽略 --sheet-id)
dws sheet merge-cells --node <NODE_ID> --sheet-id <SHEET_ID> --range "Sheet1!A1:B3"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--range string 目标单元格区域地址,如 A1:B3 (必填)
--merge-type string 合并方式: mergeAll(默认)/mergeRows/mergeColumns
支持三种合并方式:
mergeAll(默认):合并所有单元格,将选定区域内的所有单元格合并成一个mergeRows:按行合并,在选定区域内将同一行相邻的单元格合并mergeColumns:按列合并,在选定区域内将同一列相邻的单元格合并
注意:合并时只保留左上角单元格的值,其他单元格的值会被丢弃。
--range 支持带工作表前缀的写法(如 Sheet1!A1:B3),此时将优先使用前缀解析出的工作表,忽略 --sheet-id。
上传附件到表格
Usage:
dws sheet media-upload [flags]
Example:
dws sheet media-upload --node <NODE_ID> --file ./report.pdf
dws sheet media-upload --node <NODE_ID> --file ./data.bin --name "数据文件.dat" --mime-type application/octet-stream
Flags:
--node string 目标表格文档的标识,支持传入 URL 或 ID (必填)
--file string 本地文件路径 (必填)
--name string 附件显示名称 (默认使用文件名)
--mime-type string 文件 MIME 类型 (默认根据扩展名推断)
--format json 输出规整 JSON:{success, resourceId, resourceUrl, fileName, fileSize}。resourceUrl 可用于 create-float-image 的 --src。
上传图片并写入表格单元格
Usage:
dws sheet write-image [flags]
Example:
dws sheet write-image --node <NODE_ID> --sheet-id <SHEET_ID> --range A1:A1 --file ./chart.png
dws sheet write-image --node <NODE_ID> --sheet-id <SHEET_ID> --range B2:B2 --file ./logo.png --width 200 --height 100
Flags:
--node string 目标表格文档的标识,支持传入 URL 或 ID (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--range string 目标单元格区域地址,如 A1:A1 (必填)
--file string 本地图片文件路径 (必填)
--name string 图片显示名称 (默认使用文件名)
--mime-type string 文件 MIME 类型 (默认根据扩展名推断)
--width int 图片显示宽度 (可选)
--height int 图片显示高度 (可选)
创建浮动图片
Usage:
dws sheet create-float-image [flags]
Example:
# 先上传图片获取 resourceUrl
dws sheet media-upload --node <NODE_ID> --file ./chart.png
# 输出: resourceUrl: /core/api/resources/img/xxxx...
# 再创建浮动图片
dws sheet create-float-image --node <NODE_ID> --sheet-id <SHEET_ID> \
--src "/core/api/resources/img/xxxx..." --range A1 --width 400 --height 300
# 带偏移量
dws sheet create-float-image --node <NODE_ID> --sheet-id <SHEET_ID> \
--src "/core/api/resources/img/xxxx..." --range B2 --width 200 --height 150 --offset-x 10 --offset-y 20
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--src string 图片资源路径,通过 media-upload 获取的 resourceUrl (必填)
--range string 锚点单元格,A1 表示法,如 A1、B3 (必填)
--width int 图片宽度,像素,正整数 (必填)
--height int 图片高度,像素,正整数 (必填)
--offset-x int 水平偏移量,像素 (默认 0)
--offset-y int 垂直偏移量,像素 (默认 0)
浮动图片悬浮于单元格之上,不占用单元格内容,可自由定位和调整大小。
--src必须是media-upload返回的resourceUrl(格式为/core/api/resources/img/...),不能直接传外部 URL--range使用 A1 表示法指定锚点单元格(如A1、B3),支持带工作表前缀(如Sheet1!A1)--width/--height为必填,单位像素,必须为正整数--offset-x/--offset-y表示相对锚点单元格左上角的偏移量(像素),默认 0,不能为负数
获取浮动图片详情
Usage:
dws sheet get-float-image [flags]
Example:
dws sheet get-float-image --node <NODE_ID> --sheet-id <SHEET_ID> --float-image-id <FI_ID>
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--float-image-id string 浮动图片 ID (必填)
获取单个浮动图片的详细信息,包括 ID、图片资源路径、锚点位置、尺寸和偏移量。
--float-image-id 可通过 list-float-images 获取。
列出工作表所有浮动图片
Usage:
dws sheet list-float-images [flags]
Example:
dws sheet list-float-images --node <NODE_ID> --sheet-id <SHEET_ID>
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
列出指定工作表中所有浮动图片,返回 floatImages 数组和 totalCount。
更新浮动图片属性
Usage:
dws sheet update-float-image [flags]
Example:
# 移动浮动图片到新位置
dws sheet update-float-image --node <NODE_ID> --sheet-id <SHEET_ID> --float-image-id <FI_ID> --range C5
# 调整尺寸
dws sheet update-float-image --node <NODE_ID> --sheet-id <SHEET_ID> --float-image-id <FI_ID> --width 600 --height 400
# 替换图片(需先 media-upload 新图片获取 resourceUrl)
dws sheet update-float-image --node <NODE_ID> --sheet-id <SHEET_ID> --float-image-id <FI_ID> \
--src "/core/api/resources/img/xxxx..."
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--float-image-id string 浮动图片 ID (必填)
--src string 新的图片资源路径,通过 media-upload 获取的 resourceUrl
--range string 新的锚点单元格,A1 表示法
--width int 新的图片宽度,像素
--height int 新的图片高度,像素
--offset-x int 新的水平偏移量,像素
--offset-y int 新的垂直偏移量,像素
更新浮动图片的属性,--src / --range / --width / --height / --offset-x / --offset-y 至少传入一个。
--float-image-id 可通过 list-float-images 获取。
删除浮动图片
Usage:
dws sheet delete-float-image [flags]
Example:
dws sheet delete-float-image --node <NODE_ID> --sheet-id <SHEET_ID> --float-image-id <FI_ID>
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--float-image-id string 浮动图片 ID (必填)
删除指定的浮动图片,操作不可恢复。--float-image-id 可通过 list-float-images 获取。
全局查找替换
Usage:
dws sheet replace [flags]
Example:
dws sheet replace --node <NODE_ID> --sheet-id <SHEET_ID> --find "旧文本" --replacement "新文本"
dws sheet replace --node <NODE_ID> --sheet-id <SHEET_ID> --find "待处理" --replacement "已完成" --match-entire-cell
dws sheet replace --node <NODE_ID> --sheet-id <SHEET_ID> --find "\\d{4}" --replacement "****" --use-regexp
dws sheet replace --node <NODE_ID> --sheet-id <SHEET_ID> --find "旧" --replacement "新" --range "A1:D100"
dws sheet replace --node <NODE_ID> --sheet-id <SHEET_ID> --find "临时" --replacement ""
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--find string 查找文本 (必填)
--replacement string 替换文本 (必填,可为空字符串表示删除)
--range string 替换范围,A1 表示法 (如 A1:D100)
--match-case 区分大小写 (默认 false)
--match-entire-cell 完整单元格匹配
--use-regexp 启用正则表达式匹配
--include-hidden 包含隐藏行/列
返回被替换的单元格数量。--replacement 可以为空字符串,表示删除匹配内容。
移动行或列
Usage:
dws sheet move-dimension [flags]
Example:
# 将第 2 行移动到第 5 行的位置(索引从 0 开始)
dws sheet move-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension ROWS --start-index 1 --end-index 1 --destination-index 4
# 将第 2~4 行移动到第 1 行之前
dws sheet move-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension ROWS --start-index 1 --end-index 3 --destination-index 0
# 将 B~C 列移动到 E 列的位置
dws sheet move-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension COLUMNS --start-index 1 --end-index 2 --destination-index 4
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--dimension string 维度类型: ROWS 或 COLUMNS (必填)
--start-index int 源起始索引,0-based (必填)
--end-index int 源结束索引,0-based,包含 (必填)
--destination-index int 目标位置索引,0-based (必填)
索引均为 0-based(第 1 行/列的索引为 0)。destination-index 不能在 [start-index, end-index] 范围内。
destination-index 计算规则: destination-index 是目标位置的 0-based 索引,即移动到第 n 行/列则传 n-1:
- 通用公式:
destination-index = 目标行号(1-based) - 1 - 例如:将第 2 行移到第 5 行位置 →
destination-index = 5 - 1 = 4,即start-index=1, end-index=1, destination-index=4 - 例如:将第 4 行移到第 1 行(最前面)→
destination-index = 1 - 1 = 0,即start-index=3, end-index=3, destination-index=0
追加空行或空列
Usage:
dws sheet add-dimension [flags]
Example:
dws sheet add-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension ROWS --length 5
dws sheet add-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --dimension COLUMNS --length 3
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--dimension string 维度类型: ROWS 或 COLUMNS (必填)
--length int 追加数量,正整数,最多 5000 (必填)
在工作表末尾追加指定数量的空行或空列。
创建行或列分组
Usage:
dws sheet group-dimension [flags]
Example:
dws sheet group-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --range "3:7"
dws sheet group-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --range "C:F" --group-state fold
dws sheet group-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --range "Sheet1!3:7"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--range string 整行/整列范围,如 "3:7" 或 "C:F" (必填)
--group-state string 创建后的分组状态: expand 或 fold,默认 expand
在工作表中为连续行或连续列创建分组。--range 必须是整行或整列范围,不支持普通单元格矩形范围。
取消行或列分组
Usage:
dws sheet ungroup-dimension [flags]
Example:
dws sheet ungroup-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --range "3:7"
dws sheet ungroup-dimension --node <NODE_ID> --sheet-id <SHEET_ID> --range "C:F"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--range string 整行/整列范围,如 "3:7" 或 "C:F" (必填)
取消指定连续行或连续列的分组。
取消合并单元格
Usage:
dws sheet unmerge-cells [flags]
Example:
dws sheet unmerge-cells --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:D5"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--range string 取消合并的范围,A1 表示法 (必填)
取消指定范围内所有合并的单元格,恢复为独立单元格。
设置下拉列表
Usage:
dws sheet set-dropdown [flags]
Example:
# 设置单选下拉列表
dws sheet set-dropdown --node <NODE_ID> --sheet-id <SHEET_ID> --range "A2:A100" \
--options '[{"value":"选项1"},{"value":"选项2"},{"value":"选项3"}]'
# 设置带颜色的多选下拉列表
dws sheet set-dropdown --node <NODE_ID> --sheet-id <SHEET_ID> --range "B2:B50" \
--options '[{"value":"高","color":"#ff0000"},{"value":"中","color":"#ffaa00"},{"value":"低","color":"#00ff00"}]' \
--multi-select
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--range string 目标单元格范围,A1 表示法,如 A2:A100 (必填)
--options string 下拉选项 JSON 数组 (必填),如 '[{"value":"选项1","color":"#ff0000"}]'
--multi-select 是否允许多选(默认单选)
在指定单元格范围内设置下拉列表。设置后用户可从预定义选项中选择值。
- 用途:为单元格配置下拉列表,支持自定义选项颜色和多选。
- 场景:规范数据输入,如状态选择(完成/进行中/待处理)、优先级(高/中/低)等。
- 注意:选项值不能包含英文逗号;如果目标范围已存在下拉列表,会被新配置覆盖。
获取下拉列表配置
Usage:
dws sheet get-dropdown [flags]
Example:
dws sheet get-dropdown --node <NODE_ID> --sheet-id <SHEET_ID> --range "A2:A100"
dws sheet get-dropdown --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--range string 查询范围,A1 表示法,如 A1:A100 (必填)
查询指定范围内的下拉列表配置信息,包括选项值、颜色和是否多选。
- 用途:查看单元格已设置的下拉列表选项和配置。
- 场景:在修改下拉列表前先查询现有配置;确认下拉列表是否设置成功。
- 返回:
dataValidations数组,相同选项的单元格聚合为一组,每组包含conditionValues(选项值)、ranges(覆盖范围)、options(含multipleValues和colorValueMap)。判空以hasDropdown为准:无下拉列表时hasDropdown为 false,但dataValidations里仍会带 1 个全 null 的幽灵条目,不要用数组长度判空。 - 已知限制:
options.multipleValues服务端恒返回null(即使该下拉是用--multi-select建的),且不返回enableMultiSelect字段——get-dropdown读回无法判断下拉是否多选。要判断是否多选,改用range read:其cells[].dataValidation.enableMultiSelect字段准确(实测有效)。
删除下拉列表
Usage:
dws sheet delete-dropdown [flags]
Example:
dws sheet delete-dropdown --node <NODE_ID> --sheet-id <SHEET_ID> --range "A2:A100"
dws sheet delete-dropdown --node <NODE_ID> --sheet-id <SHEET_ID> --range "B1:D10"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--range string 要删除下拉列表的范围,A1 表示法 (必填)
删除指定范围内的下拉列表配置,单元格恢复为普通文本格式。
- 用途:移除不再需要的下拉列表约束。
- 注意:已填写的单元格值不会被清除;目标范围不存在下拉列表时操作仍返回成功。
获取筛选信息
Usage:
dws sheet filter get [flags]
Example:
dws sheet filter get --node <NODE_ID> --sheet-id <SHEET_ID>
dws sheet filter get --node "https://alidocs.dingtalk.com/i/nodes/<DOC_UUID>" --sheet-id "Sheet1"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
获取指定工作表的全局筛选信息,返回筛选范围和各列的筛选条件详情。
- 用途:查看当前工作表上是否存在全局筛选及其配置。
- 场景:在修改或删除筛选前,先读取当前筛选配置;创建筛选前先确认是否已存在(每个工作表只能有一个筛选)。
- 区分:全局筛选(filter)影响所有协作者看到的数据展示;筛选视图(filter-view)是个人化的。
- 返回:
range(筛选范围,A1 表示法)、id(筛选 ID)和criteria(各列条件对象,key 为列偏移量;无条件时为{})。如果未设置筛选,返回筛选信息为空。
创建筛选
Usage:
dws sheet filter create [flags]
Example:
# 创建筛选框架(不设条件)
dws sheet filter create --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:E100"
# 创建筛选并同时设置条件(按值筛选)
dws sheet filter create --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:E100" --criteria '[{"column":1,"filterType":"values","visibleValues":["北京","上海"]}]'
# 创建筛选并设置条件筛选
dws sheet filter create --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:E100" --criteria '[{"column":2,"filterType":"condition","conditions":[{"operator":"greater","value":"100"}]}]'
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--range string 筛选范围,A1 表示法,须包含表头行 (必填)
--criteria string 筛选条件 JSON 数组 (可选)
在工作表中创建全局筛选。
- 用途:为工作表建立筛选器,使数据可按条件过滤展示。
- 约束:每个工作表只能有一个全局筛选,已存在时会报错。应先
filter get确认不存在后再创建。 - range 规范:必须包含表头行(如
A1:E100),不能只包含数据行。 - criteria 格式:JSON 数组,每个元素含
column(列偏移量,从 0 开始)和筛选条件字段。不传则仅创建空筛选框架,后续可通过filter update设置条件。
删除筛选
CAUTION: 不可逆操作 — 执行前必须向用户确认。
Usage:
dws sheet filter delete [flags]
Example:
dws sheet filter delete --node <NODE_ID> --sheet-id <SHEET_ID> --yes
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
删除工作表的全局筛选。
- 用途:移除筛选器,所有被隐藏的行将重新显示。
- 不可逆:删除后所有筛选条件丢失,需重新创建。
- 前置:工作表没有筛选时调用会报错,应先
filter get确认存在。
批量更新筛选条件
Usage:
dws sheet filter update [flags]
Example:
# 同时设置多列的筛选条件
dws sheet filter update --node <NODE_ID> --sheet-id <SHEET_ID> --criteria '[{"column":0,"filterType":"values","visibleValues":["已完成","进行中"]},{"column":2,"filterType":"condition","conditions":[{"operator":"greater","value":"50"}]}]'
# 按颜色筛选
dws sheet filter update --node <NODE_ID> --sheet-id <SHEET_ID> --criteria '[{"column":1,"filterType":"color","backgroundColor":"#FF0000"}]'
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--criteria string 筛选条件 JSON 数组 (必填)
批量更新筛选条件,可同时设置多列的筛选条件。
- 用途:一次性设置或替换多列的筛选条件。
- 前置:工作表必须已创建筛选(通过
filter create)。 - 覆盖式:指定列的条件会被替换,未指定的列保持不变。如只想修改某一列,建议先
filter get读取现有配置。 - criteria 格式:JSON 数组,支持三种
filterType:values:按值筛选,指定visibleValues数组condition:按条件筛选,指定conditions数组(最多 2 个)和可选的conditionOperator(and/or)color:按颜色筛选,指定backgroundColor或fontColor(二选一)
清除单列筛选条件
Usage:
dws sheet filter clear-criteria [flags]
Example:
# 清除第 2 列(B 列)的筛选条件
dws sheet filter clear-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --column 1
# 清除第 1 列(A 列)的筛选条件
dws sheet filter clear-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --column 0
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--column number 列偏移量,从 0 开始 (必填)
清除筛选中某一列的筛选条件。
- 用途:移除某列的筛选条件,该列不再参与筛选计算。
- 区分:仅清除指定列的条件,不删除整个筛选。如需删除整个筛选,使用
filter delete。 - 幂等:指定列没有设置筛选条件时调用不会报错。
筛选排序
Usage:
dws sheet filter sort [flags]
Example:
# 按第 1 列(A 列)升序排序
dws sheet filter sort --node <NODE_ID> --sheet-id <SHEET_ID> --column 0 --ascending
# 按第 3 列(C 列)降序排序
dws sheet filter sort --node <NODE_ID> --sheet-id <SHEET_ID> --column 2 --ascending=false
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--column number 排序列偏移量,从 0 开始 (必填)
--ascending 是否升序,默认 true (可选)
对筛选范围内的数据按指定列排序。
- 用途:对数据行按某一列的值进行升序或降序排列。
- 前置:工作表必须已创建筛选(通过
filter create)。 - 注意:排序会实际改变工作表中数据行的物理顺序,不可撤销。
- column:列偏移量从 0 开始,相对于筛选范围首列。
获取所有筛选视图
Usage:
dws sheet filter-view list [flags]
Example:
dws sheet filter-view list --node <NODE_ID> --sheet-id <SHEET_ID>
dws sheet filter-view list --node "https://alidocs.dingtalk.com/i/nodes/<DOC_UUID>" --sheet-id "Sheet1"
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
获取指定工作表的所有筛选视图列表,返回每个筛选视图的 ID、名称和范围信息。
- 用途:查看当前工作表上已创建的所有筛选视图,获取视图 ID、名称和范围。
- 场景:在对筛选视图进行 update / delete / update-criteria 等操作前,先用 list 获取可用的 filterViewId。
- 区分:筛选视图(filter-view)是个人化的数据过滤方式,与全局筛选不同。每个用户可以创建自己的筛选视图,互不影响原始数据。如果没有筛选视图,返回空列表。
创建筛选视图
Usage:
dws sheet filter-view create [flags]
Example:
# 创建不带筛选条件的筛选视图
dws sheet filter-view create --node <NODE_ID> --sheet-id <SHEET_ID> --name "我的视图" --range "A1:E10"
# 创建带按值筛选条件的筛选视图
dws sheet filter-view create --node <NODE_ID> --sheet-id <SHEET_ID> --name "销售筛选" --range "A1:E10" \
--criteria '[{"column":0,"filterType":"values","visibleValues":["销售部"]}]'
# 创建带按条件筛选的筛选视图(大于等于 200000)
dws sheet filter-view create --node <NODE_ID> --sheet-id <SHEET_ID> --name "高预算" --range "A1:C10" \
--criteria '[{"column":1,"filterType":"condition","conditions":[{"operator":"greater-equal","value":"200000"}]}]'
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--name string 筛选视图名称 (必填)
--range string 筛选视图范围,A1 表示法,如 A1:E10 (必填)
--criteria string 筛选条件,JSON 数组 (可选)
在指定工作表中创建一个筛选视图。
- 用途:为指定数据区域创建一个可命名的个人化筛选视图,可选同时设置筛选条件。
- 场景:用户需要针对某个数据区域建立固定的筛选视角(如"高绩效员工""研发部数据"),方便反复查看。
- 区分:与全局筛选不同,筛选视图是个人化的,不影响其他用户看到的数据。如果只需创建视图不设条件,后续可通过
update-criteria单独设置;如果要一步到位,可通过--criteria在创建时直接设置。--criteria为 JSON 数组,每个元素包含column(列偏移量,从 0 开始)和筛选条件字段。支持三种筛选类型: values:按值筛选,通过visibleValues指定允许显示的值列表condition:按条件筛选,通过conditions指定条件列表(最多 2 个),每个条件包含operator和value。支持的操作符(kebab-case):equal、not-equal、contains、not-contains、starts-with、not-starts-with、ends-with、not-ends-with、greater、greater-equal、less、less-equal。多条件之间通过conditionOperator指定逻辑关系:and(且,默认)或or(或)color:按颜色筛选,通过backgroundColor或fontColor指定颜色值(十六进制,如#FF0000),二选一
更新筛选视图属性
Usage:
dws sheet filter-view update [flags]
Example:
# 更新筛选视图名称
dws sheet filter-view update --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> --name "新名称"
# 更新筛选视图范围
dws sheet filter-view update --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> --range "A1:F20"
# 更新筛选条件
dws sheet filter-view update --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> \
--criteria '[{"column":1,"filterType":"condition","conditions":[{"operator":"greater","value":"100"}]}]'
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--filter-view-id string 筛选视图 ID (必填)
--name string 筛选视图新名称
--range string 筛选视图新范围,A1 表示法
--criteria string 筛选条件,JSON 数组
更新筛选视图的名称、范围和/或筛选条件,--name、--range、--criteria 至少传入一个。
- 用途:修改已有筛选视图的名称、数据范围或筛选条件。
- 场景:数据区域扩展后需要扩大筛选视图范围,或重命名视图,或通过
--criteria一次性批量更新多列筛选条件。 - 区分:
update可同时修改名称、范围和条件,适合批量更新;update-criteria只能设置单列条件,适合精确控制某一列的筛选逻辑。--criteria指定列的条件会被替换,未指定的列保持不变。
--criteria 为 JSON 数组,格式与 filter-view create 的 --criteria 相同,支持的筛选类型和操作符参见「创建筛选视图」说明。
删除筛选视图
CAUTION: 不可逆操作 — 执行前必须向用户确认。
Usage:
dws sheet filter-view delete [flags]
Example:
dws sheet filter-view delete --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID>
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--filter-view-id string 筛选视图 ID (必填)
删除指定的筛选视图。
- 用途:永久删除一个不再需要的筛选视图及其所有筛选条件。
- 场景:筛选视图已过时或不再需要时,清理无用的视图。
- 区分:
delete删除整个筛选视图(包括所有列的条件),操作不可恢复;delete-criteria只删除某一列的筛选条件,视图本身保留。此操作不影响全局筛选或其他筛选视图,也不影响原始数据。
更新筛选视图列条件
Usage:
dws sheet filter-view update-criteria [flags]
Example:
# 按值筛选:只显示"销售部"和"市场部"
dws sheet filter-view update-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> \
--column 0 --filter-criteria '{"filterType":"values","visibleValues":["销售部","市场部"]}'
# 按条件筛选:大于 100
dws sheet filter-view update-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> \
--column 2 --filter-criteria '{"filterType":"condition","conditions":[{"operator":"greater","value":"100"}]}'
# 按条件筛选:大于等于 200000
dws sheet filter-view update-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> \
--column 1 --filter-criteria '{"filterType":"condition","conditions":[{"operator":"greater-equal","value":"200000"}]}'
# 按条件筛选:小于 100
dws sheet filter-view update-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> \
--column 1 --filter-criteria '{"filterType":"condition","conditions":[{"operator":"less","value":"100"}]}'
# 多条件筛选:大于等于 60 且 小于等于 90
dws sheet filter-view update-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> \
--column 2 --filter-criteria '{"filterType":"condition","conditionOperator":"and","conditions":[{"operator":"greater-equal","value":"60"},{"operator":"less-equal","value":"90"}]}'
# 按颜色筛选:背景色为红色
dws sheet filter-view update-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> \
--column 1 --filter-criteria '{"filterType":"color","backgroundColor":"#FF0000"}'
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--filter-view-id string 筛选视图 ID (必填)
--column int 列偏移量,从 0 开始 (必填)
--filter-criteria string 筛选条件,JSON 对象 (必填)
更新筛选视图中某一列的筛选条件。
- 用途:为筛选视图的指定列创建或更新筛选条件,控制该列哪些数据行可见。
- 场景:只显示某些特定值的行(如"只看研发部")→
filterType: values;按数值条件筛选(如"绩效 ≥ 85")→filterType: condition+operator: greater-equal;按文本条件筛选(如"名称包含关键字")→filterType: condition+operator: contains。 - 区分:
update-criteria精确控制单列条件,适合逐列设置不同的筛选逻辑;filter-view update --criteria可以批量更新多列条件;delete-criteria是update-criteria的逆操作,删除指定列的条件。
--column 为列偏移量(从 0 开始),相对于筛选视图范围首列。
例如筛选视图范围为 B1:E10,则 --column 0 代表 B 列,--column 1 代表 C 列。
--filter-criteria 为 JSON 对象,支持三种筛选类型:
values:按值筛选,通过visibleValues指定允许显示的值列表condition:按条件筛选,通过conditions指定条件列表(最多 2 个),每个条件包含operator和value。支持的操作符:equal、not-equal、contains、not-contains、starts-with、not-starts-with、ends-with、not-ends-with、greater、greater-equal、less、less-equal。多条件之间通过conditionOperator指定逻辑关系:and(且,默认)或or(或)color:按颜色筛选,通过backgroundColor或fontColor指定颜色值(十六进制,如#FF0000),二选一
删除筛选视图列条件
Usage:
dws sheet filter-view delete-criteria [flags]
Example:
# 删除第 1 列(A 列)的筛选条件
dws sheet filter-view delete-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> --column 0
# 删除第 3 列(C 列)的筛选条件
dws sheet filter-view delete-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> --column 2
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--filter-view-id string 筛选视图 ID (必填)
--column int 列偏移量,从 0 开始 (必填)
清除筛选视图中指定列的筛选条件。
- 用途:移除筛选视图中指定列的筛选条件,使该列不再参与过滤。
- 场景:之前通过
update-criteria设置了某列的筛选条件,现在需要取消该列的筛选以显示全部数据。 - 区分:
delete-criteria只清除指定列的条件,筛选视图本身和其他列的条件保持不变;delete会删除整个筛选视图。如果指定列没有设置筛选条件,调用此命令不会报错(幂等操作)。
获取单个筛选视图详情
Usage:
dws sheet filter-view info [flags]
Example:
# 查看指定筛选视图的详情
dws sheet filter-view info --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID>
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--filter-view-id string 筛选视图 ID (必填)
获取指定筛选视图的完整信息,包括 ID、名称、范围和筛选条件。
- 用途:查看某个筛选视图的当前配置,包括已设置的所有筛选条件详情。
- 场景:在修改或删除筛选视图前,先确认其当前状态;或在
update-criteria后验证条件是否生效。 - 区分:
info返回单个视图的完整信息(含 criteria);list返回所有视图的列表概要。info需要指定--filter-view-id,ID 可通过list获取。 - 实现:内部调用
get_filter_views获取全部列表后按 ID 过滤。
列出筛选视图所有列条件
Usage:
dws sheet filter-view list-criteria [flags]
Example:
# 列出筛选视图的所有条件
dws sheet filter-view list-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID>
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--filter-view-id string 筛选视图 ID (必填)
列出指定筛选视图中已设置的所有列筛选条件。
- 用途:查看某个筛选视图当前设置了哪些列的筛选条件,包括每列的条件类型和具体规则。
- 场景:在管理筛选条件(修改/删除特定列条件)前,先了解当前视图有哪些条件;或排查筛选结果不符合预期时检查条件配置。
- 区分:
list-criteria返回所有列的条件(按列偏移量为 key 的对象);get-criteria只返回指定列的条件。如果没有设置任何条件,返回空对象{}。 - 实现:内部调用
get_filter_views获取视图详情后提取criteria字段。
获取单列筛选条件
Usage:
dws sheet filter-view get-criteria [flags]
Example:
# 查看第 1 列(偏移量 0)的筛选条件
dws sheet filter-view get-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> --column 0
# 查看第 3 列(偏移量 2)的筛选条件
dws sheet filter-view get-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> --column 2
Flags:
--node string 表格文档 ID 或 URL (必填)
--sheet-id string 工作表 ID 或名称 (必填)
--filter-view-id string 筛选视图 ID (必填)
--column int 列偏移量,从 0 开始 (必填)
获取指定筛选视图中某一列的筛选条件详情。
- 用途:查看某个筛选视图中指定列当前设置的筛选条件,包括条件类型、运算符和比较值。
- 场景:在修改某列条件前,先查看其当前配置;或验证
update-criteria后该列条件是否正确。 - 区分:
get-criteria只返回指定列的条件;list-criteria返回所有列的条件。--column为列偏移量(从 0 开始),相对于筛选视图范围首列。 - 实现:内部调用
get_filter_views获取视图详情后按列偏移量过滤criteria中的对应条件。
导出表格为 xlsx(异步任务一站式)
Usage:
dws sheet export [flags] # 一站式:提交 → 轮询 → 可选下载
Example:
# 仅导出,返回 downloadUrl(链接有时效性,请尽快下载)
dws sheet export --node <NODE_ID>
dws sheet export --node "https://alidocs.dingtalk.com/i/nodes/<DOC_UUID>"
# 导出并自动下载为本地文件
dws sheet export --node <NODE_ID> --output ./report.xlsx
# --output 为目录时,自动按下载链接中的文件名保存
dws sheet export --node <NODE_ID> --output ./
Flags:
--node string 表格文档 ID 或 URL (必填)
--output string 本地保存路径(可选,支持文件路径或目录)
将钉钉在线电子表格导出为 Office xlsx 格式。单命令一站式:命令内部自动完成「提交任务 → 渐进式退避轮询 → (可选)下载文件」全流程,AI Agent 无需自行拆分步骤或实现轮询。
内部流程:
- 调
submit_export_job获取jobId - 按渐进式退避策略轮询
query_export_job直至任务终态或超时 - 任务成功后取得
downloadUrl;若指定了--output,自动 HTTP GET 下载 xlsx 到本地文件
内置轮询策略(CLI 内实现,无需关心):
- 第 1~5 次:每次间隔 2 秒
- 第 6~10 次:每次间隔 5 秒
- 第 11~20 次:每次间隔 10 秒
- 第 21~30 次:每次间隔 15 秒
- 硬上限:最多轮询 30 次(约 5 分钟),超时后命令返回错误
命令返回(--format json,默认):输出规整 JSON {success, jobId, downloadUrl[, outputPath]}。轮询进度以 [INFO] [N/30] 状态: ... 打到 stderr,不污染 stdout 的 JSON。
--output未指定:JSON 含jobId+downloadUrl(链接有时效性,请尽快下载)--output指定为文件路径:下载到该路径,JSON 额外含outputPath--output指定为已存在目录:自动从downloadUrl推断文件名并保存到该目录,JSON 含outputPath
失败处理(命令内部已处理,Agent 仅需转述):
- MCP 返回
FAILED:命令立即返回错误并附带失败原因,禁止自动重试dws sheet export,告知用户稍后再试 - 轮询 30 次仍
PROCESSING:命令返回超时错误,告知用户稍后再试
限制:仅支持钉钉在线电子表格(axls)→ xlsx。导出钉钉文字文档请使用 doc 产品对应的导出工具。
表格模板(list / search / apply)
Usage:
dws sheet template list [flags] # 列出可用模板(--cursor / --limit 分页)
dws sheet template search [flags] # 按关键词搜索模板
dws sheet template apply [flags] # 应用模板创建新表格文档
template search Flags:
--query string 搜索关键词 (必填)
--source string 模板来源: MY(我的模版,默认) / PUBLIC(公开模版)
--cursor string 分页游标
--limit int 返回数量上限
template apply Flags:
--template-id string 模板 ID (必填,来自 list/search)
--name string 新表格文档名称 (可选)
--folder string 目标文件夹 ID (可选,UUID 或 URL)
--workspace string 知识库 ID (可选)
- 用户说"用模板建表 / 有哪些模板 / 找个 XX 模板"时走 template 系列
- 典型链路:
template search --query "..."或template list拿到templateId→template apply --template-id <ID> --name "..."创建新表格,返回新文档的nodeId
核心工作流
# ── 工作流 1: 创建表格并写入数据 ──
# 1. 创建表格文档 — 提取 nodeId
dws sheet create --name "销售数据" --format json
# 2. 查看工作表列表 — 提取 sheetId
dws sheet list --node <NODE_ID> --format json
# 3. 写入表头和数据(每个单元格必须是 object;数字也写成字符串)
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
# ── 工作流 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. 在新工作表中写入汇总公式(公式写在 text,以 = 开头)
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
# ── 工作流 4: 写入数据并设置样式 ──
# 1. 写入数据
dws sheet range update --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:C3" \
--values '[[{"type":"text","text":"商品"},{"type":"text","text":"单价"},{"type":"text","text":"数量"}],[{"type":"text","text":"苹果"},{"type":"text","text":"5.5"},{"type":"text","text":"100"}],[{"type":"text","text":"香蕉"},{"type":"text","text":"3.2"},{"type":"text","text":"200"}]]' --format json
# 2. 设置数字格式(人民币)——批量刷整列走 set-style
dws sheet range set-style --node <NODE_ID> --sheet-id <SHEET_ID> --range "B2:B3" \
--number-format "¥#,##0.00" --format json
# 3. 写入超链接(写在 cell 的 hyperlink 字段)
dws sheet range update --node <NODE_ID> --sheet-id <SHEET_ID> --range "D1" \
--values '[[{"type":"text","text":"详情","hyperlink":{"type":"path","link":"https://dingtalk.com"}}]]' --format json
# ── 工作流 5: 追加数据 ──
# 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 append --node <NODE_ID> --sheet-id <SHEET_ID> \
--values '[["张三","销售部",50000]]' --format json
# 4. 追加多行数据
dws sheet append --node <NODE_ID> --sheet-id <SHEET_ID> \
--values '[["李四","市场部",38000],["王五","销售部",62000]]' --format json
# ── 工作流 6: 插入行或列 ──
# 1. 获取工作表列表
dws sheet list --node <NODE_ID> --format json
# 2. 在第 3 行之前插入 2 行
dws sheet insert-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension ROWS --position "3" --length 2 --format json
# 3. 在 A 列之前插入 1 列
dws sheet insert-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension COLUMNS --position "A" --length 1 --format json
# 4. 使用工作表前缀指定位置
dws sheet insert-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension ROWS --position "Sheet1!5" --length 3 --format json
# ── 工作流 6b: 删除行或列 ──
# 1. 获取工作表列表
dws sheet list --node <NODE_ID> --format json
# 2. 从第 3 行开始删除 2 行
dws sheet delete-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension ROWS --position "3" --length 2 --format json
# 3. 从 A 列开始删除 1 列
dws sheet delete-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension COLUMNS --position "A" --length 1 --format json
# 4. 使用工作表前缀指定位置
dws sheet delete-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension ROWS --position "Sheet1!5" --length 3 --format json
# ── 工作流 6c: 更新行/列属性(显隐、行高/列宽) ──
# 1. 获取工作表列表
dws sheet list --node <NODE_ID> --format json
# 2. 隐藏第 3~4 行
dws sheet update-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension ROWS --start-index "3" --length 2 --hidden --format json
# 3. 显示 A~B 列
dws sheet update-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension COLUMNS --start-index "A" --length 2 --hidden=false --format json
# 4. 设置第 1~5 行行高为 40px
dws sheet update-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension ROWS --start-index "1" --length 5 --pixel-size 40 --format json
# 5. 设置 C 列列宽为 200px 并隐藏
dws sheet update-dimension --node <NODE_ID> --sheet-id <SHEET_ID> \
--dimension COLUMNS --start-index "C" --length 1 --pixel-size 200 --hidden --format json
# ── 工作流 7: 搜索表格数据 ──
# 1. 获取工作表列表
dws sheet list --node <NODE_ID> --format json
# 2. 基本搜索 — 在指定工作表中查找文本
dws sheet find --node <NODE_ID> --sheet-id <SHEET_ID> --find "销售额" --format json
# 3. 在指定范围内搜索
dws sheet find --node <NODE_ID> --sheet-id <SHEET_ID> --find "合计" --range "A1:D100" --format json
# 4. 正则搜索(不区分大小写)
dws sheet find --node <NODE_ID> --sheet-id <SHEET_ID> --find "^total" --use-regexp --match-case=false --format json
# 5. 精确匹配整个单元格
dws sheet find --node <NODE_ID> --sheet-id <SHEET_ID> --find "完成" --match-entire-cell --format json
# 6. 搜索公式文本
dws sheet find --node <NODE_ID> --sheet-id <SHEET_ID> --find "SUM" --match-formula --format json
# ── 工作流 8: 合并单元格 ──
# 1. 获取工作表列表
dws sheet list --node <NODE_ID> --format json
# 2. 合并所有单元格(默认 mergeAll)
dws sheet merge-cells --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:B3" --format json
# 3. 按行合并
dws sheet merge-cells --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:C3" --merge-type mergeRows --format json
# 4. 按列合并
dws sheet merge-cells --node <NODE_ID> --sheet-id <SHEET_ID> --range "A1:C3" --merge-type mergeColumns --format json
# ── 工作流 9: 上传附件到表格 ──
# 1. 基本用法: 上传本地文件到表格
dws sheet media-upload --node <NODE_ID> --file ./report.pdf -f json
# 2. 自定义附件显示名称 (--name 指定上传后在表格中显示的名称)
dws sheet media-upload --node <NODE_ID> --file ./data.csv --name "销售数据.csv" -f json
# 3. 指定 MIME 类型 (文件扩展名无法推断时)
dws sheet media-upload --node <NODE_ID> --file ./data.bin --name "导出数据.dat" --mime-type application/octet-stream -f json
# 4. 完整流程: 创建表格 → 上传附件
dws sheet create --name "项目资料" -f json
# 提取 nodeId 后:
dws sheet media-upload --node <NODE_ID> --file ./design.pdf -f json
dws sheet media-upload --node <NODE_ID> --file ./timeline.xlsx --name "项目时间线.xlsx" -f json
# ── 工作流 10: 写入图片到表格单元格 ──
# 1. 基本用法: 写入图片到指定单元格
dws sheet write-image --node <NODE_ID> --sheet-id <SHEET_ID> --range A1:A1 --file ./chart.png -f json
# 2. 指定显示尺寸
dws sheet write-image --node <NODE_ID> --sheet-id <SHEET_ID> --range B2:B2 --file ./logo.png --width 200 --height 100 -f json
# 3. 自定义图片名称
dws sheet write-image --node <NODE_ID> --sheet-id <SHEET_ID> --range C3:C3 --file ./photo.jpg --name "产品图.jpg" -f json
# 4. 完整流程: 创建表格 → 写表头 → 写入图片
dws sheet create --name "产品目录" -f json
# 提取 nodeId 后:
dws sheet range update --node <NODE_ID> --sheet-id Sheet1 --range "A1:B1" --values '[[{"type":"text","text":"产品名称"},{"type":"text","text":"产品图片"}]]' -f json
dws sheet range update --node <NODE_ID> --sheet-id Sheet1 --range "A2:A2" --values '[[{"type":"text","text":"MacBook Pro"}]]' -f json
dws sheet write-image --node <NODE_ID> --sheet-id Sheet1 --range B2:B2 --file ./macbook.png --width 150 --height 100 -f json
# ── 工作流 11: 筛选视图管理 ──
# 1. 获取工作表列表
dws sheet list --node <NODE_ID> -f json
# 2. 查看已有筛选视图
dws sheet filter-view list --node <NODE_ID> --sheet-id <SHEET_ID> -f json
# 3. 创建筛选视图(不带条件)
dws sheet filter-view create --node <NODE_ID> --sheet-id <SHEET_ID> \
--name "我的筛选" --range "A1:E100" -f json
# 4. 为筛选视图设置列条件(按值筛选)
dws sheet filter-view update-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> \
--column 0 --filter-criteria '{"filterType":"values","visibleValues":["销售部","市场部"]}' -f json
# 5. 为筛选视图设置列条件(按条件筛选)
dws sheet filter-view update-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> \
--column 2 --filter-criteria '{"filterType":"condition","conditions":[{"operator":"greater","value":"100"}]}' -f json
# 6. 更新筛选视图名称和范围
dws sheet filter-view update --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> \
--name "销售数据筛选" --range "A1:F200" -f json
# 7. 清除某列的筛选条件
dws sheet filter-view delete-criteria --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> \
--column 0 -f json
# 8. 删除筛选视图
dws sheet filter-view delete --node <NODE_ID> --sheet-id <SHEET_ID> --filter-view-id <FV_ID> -f json
# ── 工作流 11b: 创建带条件的筛选视图(一步完成) ──
# 创建筛选视图时直接指定筛选条件
dws sheet filter-view create --node <NODE_ID> --sheet-id <SHEET_ID> \
--name "高销售额视图" --range "A1:E100" \
--criteria '[{"column":0,"filterType":"values","visibleValues":["销售部"]},{"column":2,"filterType":"condition","conditions":[{"operator":"greater","value":"50000"}]}]' \
-f json
# ── 工作流 12: 导出表格为 xlsx(单命令一站式)──
# 场景 A:仅获取下载链接(命令内部自动完成提交+轮询,最终返回 downloadUrl)
dws sheet export --node <NODE_ID> --format json
# 传入 URL 也可:
# dws sheet export --node "https://alidocs.dingtalk.com/i/nodes/<DOC_UUID>" --format json
# 场景 B:导出并自动下载为本地文件
dws sheet export --node <NODE_ID> --output ./report.xlsx
# 场景 C:下载到目录,自动按链接推断文件名
dws sheet export --node <NODE_ID> --output ./
# 禁止在 Agent 侧实现任何轮询或重试,CLI 内部已按 2s/5s/10s/15s 渐进式退避自动完成(最多 30 次)。
# 若命令返回失败或超时,直接告知用户稍后再试,不要自动重调 dws sheet export。
上下文传递表
| 操作 | 从返回中提取 | 用于 |
|---|---|---|
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 |
确定数据范围、追加写入起始行、判断合并结构(空表时 nonEmptyRange.* 为 null) |
find |
matchedCells 中的 a1Notation |
定位目标单元格,用于 range read / range update |
append |
a1Notation 追加数据所在范围 |
确认追加位置 |
csv-put |
a1Notation 实际写入的单元格范围 |
确认写入位置和范围 |
insert-dimension |
a1Notation 新插入区域范围 |
确认插入位置和范围 |
delete-dimension |
a1Notation 被删除区域范围 |
确认删除位置和范围 |
update-dimension |
a1Notation 被更新区域范围、hidden 生效的显隐状态、pixelSize 生效的尺寸 |
确认更新结果 |
merge-cells |
a1Notation 实际被合并的范围、mergeType 生效的合并方式 |
确认合并结果 |
media-upload |
resourceId、resourceUrl |
附件已上传到表格;resourceUrl 可用于 create-float-image 的 --src |
write-image |
resourceId |
图片已写入指定单元格 |
create-float-image |
floatImage(含 id、src、range、width、height、offsetX、offsetY) |
id 用于后续 get / update / delete 的 --float-image-id |
get-float-image |
floatImage(完整信息) |
查看单个浮动图片详情 |
list-float-images |
floatImages 数组、totalCount |
获取所有浮动图片的 id,用于后续操作 |
update-float-image |
floatImage(更新后的完整信息) |
确认更新结果 |
delete-float-image |
message |
确认删除完成 |
replace |
replaceCount 被替换的单元格数量 |
确认替换结果 |
move-dimension |
sheetId 工作表 ID |
确认操作完成 |
add-dimension |
sheetId 工作表 ID |
确认操作完成 |
group-dimension |
range / level / groupState |
确认行列分组层级和展开状态 |
ungroup-dimension |
range / level |
确认行列分组已取消 |
unmerge-cells |
sheetId 工作表 ID |
确认操作完成 |
set-dropdown |
range 实际设置范围、optionCount 选项数量、enableMultiSelect 是否多选 |
确认下拉列表设置成功 |
get-dropdown |
hasDropdown 是否存在下拉、dataValidations 下拉配置列表(含 conditionValues、ranges、options) |
查看已有下拉配置 |
delete-dropdown |
range 实际删除范围 |
确认下拉列表删除完成 |
filter-view list |
filterViews 筛选视图列表(含 id、name、range) |
获取 filterViewId 用于 info / update / delete / update-criteria / delete-criteria / list-criteria / get-criteria |
filter-view info |
id、name、range、criteria |
查看单个视图完整配置,确认条件是否生效 |
filter-view create |
id 筛选视图 ID、name、range |
用于后续 update / delete / update-criteria / delete-criteria 的 --filter-view-id |
filter-view update |
id、name、range、criteria |
确认更新结果 |
filter-view delete |
id 被删除的筛选视图 ID |
确认删除完成 |
filter-view update-criteria |
id 筛选视图 ID |
确认条件设置完成 |
filter-view delete-criteria |
id 筛选视图 ID |
确认条件清除完成 |
filter-view list-criteria |
所有列条件(按列偏移量为 key 的对象) | 了解当前视图已设置哪些列的条件 |
filter-view get-criteria |
指定列的条件详情(filterType、conditions 等) |
查看某列的具体筛选规则 |
export |
downloadUrl(未指定 --output)/ outputPath(指定 --output) |
直接下发给用户或告知文件已保存到本地。命令内部已完成轮询,不要再调用其他 export 相关命令 |
nodeId 多格式说明
所有 --node 参数同时支持文档 ID、文档 URL、表格分享链接,系统自动识别。详细格式和提取规则请参见前文「URL 识别与 NODE_ID 提取」章节。
** 禁止使用
dentryId:drive list返回结果中同时包含dentryId(纯数字,如218595998810)和fileId(UUID 格式,如ZgpG2NdyVXYOR2D5UGDok65MJMwvDqPk)两个字段。sheet 的--node和--folder参数只能使用fileId(UUID 格式)**,不能使用纯数字的dentryId,传入纯数字会导致命令失败。
values 参数格式说明
--values 为二维 JSON 数组,第一维为行,第二维为列。每个单元格必须是 object,不支持裸值 "文本" / 100 / null:
- 文本:
{"type":"text","text":"文本"} - 数字/布尔: 写成字符串
{"type":"text","text":"100"},服务端按内容自动识别为数字/布尔 - 公式:
{"type":"text","text":"=SUM(B2:B4)"}(text以=开头识别为公式) - 清空单个单元格:
{"type":"text","text":""};清空整片区域用range clear - 跳过某格保留原值:
{}空对象 - 整格样式:
{"type":"text","text":"重要","cellStyles":{"fontWeight":"bold","fontColor":"#FF0000","numberFormat":"@"}} - 富文本:
{"type":"richText","texts":[...]}(子项 text/link/attachment/image,片段样式写在子项style)
维度必须与 --range 范围一致,例如 --range "A1:B3" 需要 3 行 2 列的 object 数组。
超链接写法说明
没有 --hyperlinks flag(旧写法已废弃,传入报 unknown flag)。单元格级超链接写在 --values 里 cell object 的 hyperlink 字段:
{"type":"text","text":"钉钉","hyperlink":{"type":"path","link":"https://dingtalk.com"}}:写外部链接hyperlink.type可为path(外部链接)/sheet(工作表跳转,link 为工作表名)/range(区域跳转,link 为Sheet2!A1){"hyperlink":{"type":"none"}}:清除整格超链接(保留原值)- 富文本片段内的链接写在
richText子项的link字段,与整格hyperlink不同
number-format 常用值
适用范围:number-format 在 range set-style / range batch-set-style 中作为 --number-format 参数;range update 没有 --number-format flag,但可在每个 cell object 的 cellStyles.numberFormat 里写同样的格式代码。批量刷整片区域优先用 set-style。
| 格式代码 | 说明 | 示例 |
|---|---|---|
General |
常规 | 1234.5 |
@ |
文本 | 001234 |
#,##0 |
整数千分位 | 1,235 |
#,##0.00 |
两位小数 | 1,234.50 |
0% |
百分比 | 85% |
yyyy/m/d |
日期 | 2026/3/15 |
hh:mm:ss |
时间 | 14:30:00 |
¥#,##0 |
人民币 | ¥1,235 |
注意事项(完整版)
标 ★ 的条目已在前文「关键注意事项」中列出,此处为完整说明。
- ★
--sheet-id获取规范(强制):所有涉及--sheet-id参数的命令(info/new/range read/range update/find/append/insert-dimension/delete-dimension/update-dimension/move-dimension/add-dimension/merge-cells/unmerge-cells/replace/write-image/set-dropdown/get-dropdown/delete-dropdown/filter-view *等),除非用户主动提供了工作表 ID 或工作表名称,否则在sheetId未知时必须先通过dws sheet list --node <NODE_ID> --format json查询真实的sheetId/ 工作表名称后再调用,禁止凭空编造(如臆测为Sheet1、sheet1、0、default等);用户仅给出工作表名称时,也应通过list校验该名称是否存在,避免名称大小写或拼写不一致导致失败 - ★
range update单元格对象协议(强制):--values每个单元格必须是 object({"type":"text","text":...}/{"type":"richText",...}/{}等),不支持裸值"张三"/90/null,裸值报「不支持原始值……每个单元格必须是 object」。数字/布尔写成字符串 object,服务端自动识别类型。超链接写在 cell object 的hyperlink字段,没有--hyperlinksflag - ★
range update维度校验(强制):--values二维数组的行数与列数必须与--range完全一致:- 例如
--range "A1:C3"表示 3 行 × 3 列,--values必须是 3×3 的 object 数组 --range "A1"表示 1 行 × 1 列,--values必须是[[{...}]]- 不改的格用
{}空对象占位补齐;禁止各行列数不一致或与--range不匹配,否则报错
- 例如
- ★
range update清空单元格规范(强制):清空单个单元格用{"type":"text","text":""}(不是裸"",也不是null);清空整片区域用range clear;跳过某格保留原值用{}空对象 create不传--folder和--workspace时,默认创建在"我的文档"根目录list返回所有工作表的 ID 和名称,是后续操作的必要前置步骤info不传--sheet-id时默认返回第一个工作表的详情range read不传--range时默认读取整个工作表的全部非空数据range read的--range支持Sheet1!A1:D10格式直接指定工作表(此时忽略--sheet-id)range read遇到超时或响应过慢时,应缩小--range查询范围,单次读取的单元格数量建议控制在 5000 个以内;数据量较大时通过info获取边界后分批读取,避免不传--range直接读取整个大工作表range update只有--values一个内容参数(必填),超链接/样式/数据验证都写进 cell object 内部字段range update职责边界:可写值、超链接、per-cell 样式(cellStyles)与数据验证(dataValidation)。批量刷整片区域的统一样式或数字格式优先用dws sheet range set-style --number-format <格式代码>;批量多区域走dws sheet range batch-set-style --batch <config.json>(配置文件用numberFormat字段)- ★
range update/range set-style/range batch-set-style单次调用上限(强制):行数 ≤ 1000,单元格总数(行×列)建议≤ 5000(底层硬限 30000);超限请拆分多次调用。CLI 会在调用前做本地预校验,底层超 30000 会直接报错 range set-style/range batch-set-style的样式枚举按驼峰书写:wordWrap取overflow/clip/autoWrap,fontWeight取bold/normal,hAlign取left/center/right/general,vAlign取top/middle/bottom;背景色/字体颜色统一使用#RRGGBB格式new创建工作表时,如名称与已有工作表重复,系统会自动重命名find返回匹配单元格的地址(A1 表示法)和值,无匹配时返回空数组find的--match-entire-cell用于精确匹配:只返回单元格内容完全等于搜索文本的结果,不会匹配包含该文本的单元格(例如搜索"苹果"时,只匹配"苹果",不匹配"苹果手机""苹果汁"等)。用户说"精确搜索/完全匹配/只搜等于XX的"时必须使用此参数find的--match-case默认为 true(区分大小写),设为 false 可忽略大小写find的--use-regexp启用后,--find参数作为正则表达式处理- ★ 当用户要求搜索/查找表格数据时,使用
find命令,不要用range read读取全量数据后自行过滤——find支持服务端搜索,效率更高、语义更准确 append自动定位到最后一行有数据的位置下方插入,无需手动计算行号append的--values二维数组中每行的列数必须一致,否则会报错。如果用户提供的数据中各行长度不同,必须先将短行用空字符串""补齐到与最长行相同的列数后再调用。追加的数据列数也应与工作表已有数据列数保持一致appendvsrange update:追加新行用append,修改已有单元格用range updateinsert-dimension在指定位置之前插入空行或空列,不写入数据;如需在末尾追加行/列,使用appendinsert-dimension的--dimension只接受ROWS或COLUMNSinsert-dimension的--position支持工作表前缀(如Sheet1!3),此时忽略--sheet-idinsert-dimension的--length最大为 5000delete-dimension从指定位置起删除若干连续的行或列,删除后后续行/列向前移动填补空位delete-dimension的--dimension只接受ROWS或COLUMNSdelete-dimension的--position支持工作表前缀(如Sheet1!3),此时忽略--sheet-iddelete-dimension的--length最大为 5000delete-dimension若需仅清空内容但保留行/列占位,请使用range clear(整片区域清除,比逐格写空更简洁)update-dimension批量更新连续行/列的显隐状态与行高/列宽update-dimension的--dimension只接受ROWS或COLUMNSupdate-dimension的--start-index支持工作表前缀(如Sheet1!3),此时忽略--sheet-idupdate-dimension的--length最大为 5000update-dimension的--hidden与--pixel-size至少必须提供一个update-dimension的--pixel-size单位为像素,dimension=ROWS时表示行高、dimension=COLUMNS时表示列宽update-dimension当同时提供--hidden与--pixel-size时,将先应用尺寸再应用显隐,任一失败整体失败merge-cells合并时只保留左上角单元格的值,其他单元格的值会被丢弃merge-cells的--merge-type不传时默认为mergeAll(合并所有单元格)merge-cells的--range支持带工作表前缀的写法(如Sheet1!A1:B3),此时忽略--sheet-idmerge-cells如果目标区域与其他合并单元格、锁定区域或表格区域存在交集,合并将失败media-upload是两步自动完成的流程 (获取附件上传凭证 → OSS 上传),无需手动分步操作write-image是三步自动完成的流程 (获取附件上传凭证 → OSS 上传 → 写入图片到单元格),无需手动分步操作- ★ 向表格单元格中写入图片必须使用
write-image,禁止使用range update。range update底层调用的update_rangeMCP 工具不支持图片类型参数,调用会失败 write-image与media-upload的区别:media-upload仅上传附件到表格获取 resourceId;write-image在上传后还会将图片写入指定单元格create-float-image创建浮动图片前必须先通过media-upload上传图片获取resourceUrl,再将其作为--src传入。--src的格式为/core/api/resources/img/...,不能直接传外部 URLcreate-float-image的--range使用 A1 表示法指定锚点单元格(如A1、B3),支持带工作表前缀(如Sheet1!A1)create-float-image的--width/--height为必填,单位像素,必须为正整数;--offset-x/--offset-y可选,默认 0,不能为负数write-image(单元格内嵌图片)vscreate-float-image(浮动图片):write-image将图片写入单元格内部,占据单元格内容;create-float-image创建悬浮于单元格之上的浮动图片,不占用单元格内容,可自由调整位置和大小update-float-image的--src/--range/--width/--height/--offset-x/--offset-y至少必须提供一个list-float-images返回floatImages数组和totalCount,每个元素包含id(用于后续 get / update / delete)delete-float-image操作不可恢复,删除后图片将从工作表中移除replace的--find不能为空字符串,--replace可以为空字符串(表示删除匹配内容)replace的--match-case默认为 false(不区分大小写),与find的默认行为不同- ★
replacevsrange update:需要批量替换文本时,必须使用replace命令,禁止用range update手动重写单元格来实现替换效果。replace支持服务端全局替换,效率更高且会返回替换计数 - ★
move-dimensionvsrange update:需要移动行或列时,必须使用move-dimension命令,禁止用range update读取数据后手动重写来模拟移动效果。move-dimension是原子操作,能保留单元格的格式、合并状态等属性 move-dimension的索引均为 0-based(第 1 行/列的索引为 0),endIndex包含在移动范围内move-dimension的--destination-index不能在 [start-index, end-index] 范围内move-dimension的移动跨度(end-index - start-index + 1)不超过 5000move-dimension的--destination-index是目标位置的 0-based 索引,即移动到第 n 行/列则传n - 1(通用公式:destination-index = 目标行号(1-based) - 1)add-dimensionvsrange update:需要在末尾追加空行/空列时,必须使用add-dimension命令,禁止用range update写空数据来模拟追加效果add-dimension追加的是空行/空列,与append(追加带数据的行)不同add-dimension的--length必须为正整数(>= 1),行列均不超过 5000group-dimension/ungroup-dimension的--range只接受整行或整列范围,如3:7、C:F、Sheet1!3:7,不支持A1:C5group-dimension的--group-state只接受expand或fold,默认expandbatch-update支持group-dimension/ungroup-dimension;需要创建后立即折叠时,优先使用独立group-dimension --group-state foldunmerge-cells取消指定范围内所有合并单元格,使用 A1 表示法指定范围set-dropdown在指定范围内设置下拉列表,--options为 JSON 数组,每个元素包含value(必填)和color(可选,#RRGGBB格式)。选项值不能包含英文逗号。--multi-select启用多选模式。如果目标范围已存在下拉列表,会被新配置覆盖get-dropdown查询指定范围内的下拉列表配置,返回dataValidations数组,相同选项的单元格聚合为一组。无下拉列表时hasDropdown为 falsedelete-dropdown删除指定范围内的下拉列表配置,单元格恢复为普通文本格式。已填写的值不会被清除。目标范围不存在下拉列表时操作仍返回成功- ★ 全局筛选(filter)与筛选视图(filter-view)的区别:全局筛选影响所有协作者看到的数据展示,每个工作表最多一个;筛选视图是个人化的,互不影响。用户只说"筛选"时默认走
filter系列 filter get获取工作表的全局筛选信息,返回range(筛选范围)、id和criteria(各列条件对象,无条件时为{})。无筛选时返回空filter create创建全局筛选时--range必须包含表头行(如A1:E100),不能只包含数据行。每个工作表只能有一个筛选,已存在时报错filter create的--criteria可选,不传则仅创建空筛选框架,后续通过filter update设置条件filter delete删除后所有筛选条件丢失且所有被隐藏行重新显示,不可恢复filter delete工作表没有筛选时调用会报错,应先filter get确认存在filter update是覆盖式:指定列的条件会被替换,未指定的列保持不变。如只想修改某一列,建议先filter get读取现有配置再 patchfilter update前置:工作表必须已创建筛选filter clear-criteria仅清除指定列的条件,不删除整个筛选。指定列无条件时不报错(幂等)filter sort会实际改变数据行的物理顺序,不可撤销。前置:工作表必须已创建筛选- ★ 筛选操作规范(参照飞书 core-operations):
- 当用户要求"筛选/只看/仅保留 X"时,必须通过
filter create/filter update创建真实的筛选器。禁止用"删除不符合条件的行"或"新建工作表只放符合条件的行"来代替 - 创建/更新筛选后必须
filter get回读验证配置正确 - 更新已有筛选前先
filter get读取当前配置,确认目标存在且了解现有条件后再操作 - 筛选条件的列索引(
column)必须与实际数据列精确对应,不要凭猜测填写 - 筛选不支持正则表达式,传入正则会当成普通文本处理
- 当用户要求"筛选/只看/仅保留 X"时,必须通过
filter-view list获取指定工作表的所有筛选视图列表,返回的id可用于后续 info / update / delete / update-criteria / delete-criteria / list-criteria / get-criteria 的--filter-view-idfilter-view info获取单个筛选视图的完整信息(含 criteria),内部复用get_filter_viewsMCP 按 ID 过滤filter-view list-criteria列出指定筛选视图已设置的所有列条件,返回按列偏移量为 key 的对象;无条件时返回空对象{}filter-view get-criteria获取指定列的条件详情,--column为列偏移量(从 0 开始);该列无条件时返回错误提示filter-view create创建筛选视图时--range应包含表头行。--criteria可选,不传则创建后无筛选条件,后续可通过filter-view update-criteria设置filter-view update的--name、--range、--criteria至少需要传入一个,未指定的字段保持不变filter-view update的--criteria中指定列的条件会被替换,未指定的列保持不变filter-view delete删除后该视图及其所有筛选条件将被永久移除,不可恢复filter-view delete不影响全局筛选或其他筛选视图filter-view update-criteria的--column为列偏移量(从 0 开始),相对于筛选视图范围首列。例如筛选视图范围为B1:E10,则--column 0代表 B 列filter-view update-criteria设置条件后立即在该筛选视图中生效,仅影响当前视图,不影响全局筛选或其他筛选视图filter-view update-criteria的--filter-criteria中conditions最多 2 个条件,多条件之间通过conditionOperator指定逻辑关系(and或or)filter-view delete-criteria仅清除指定列的条件,不会删除整个筛选视图。如需删除整个筛选视图,请使用filter-view deletefilter-view delete-criteria如果指定列没有设置筛选条件,调用不会报错- 筛选视图相关操作需要"可阅读"权限(list / info / list-criteria / get-criteria)或"可编辑"权限(create / update / delete / update-criteria / delete-criteria),不支持跨组织操作
- ★
export仅支持钉钉在线电子表格(axls)→ xlsx;传入钉钉文字文档会报invalidRequest.document.typeIllegal - ★
export为单命令一站式,CLI 内部已自动完成「提交 → 渐进式退避轮询 → 可选下载」,Agent 不得在外部实现轮询或重试;命令返回成功后不再调用其他 export 相关命令 export内置轮询策略:15 次间隔 2s、610 次间隔 5s、1120 次间隔 10s、2130 次间隔 15s,硬上限 30 次(约 5 分钟);超时后命令返回错误,告知用户稍后再试即可- ★
export命令返回失败或超时时,禁止自动重调dws sheet export;直接告知用户导出失败并建议稍后再试 export未指定--output时,返回的downloadUrl具有时效性,获取后请尽快下载;若用户需要本地文件,优先直接传--output让 CLI 代为下载export的--output可为文件路径或已存在目录;为目录时自动从downloadUrl推断文件名,为文件路径时直接按该路径保存- 用户要求"导出表格/下载 xlsx"时,必须使用
export单命令,禁止用range read读全量数据后自行拼 xlsx 模拟导出(服务端导出会保留格式/合并/公式等完整属性) update的--title、--index、--hidden、--frozen-row-count、--frozen-column-count至少必须提供一个update的--title最长 100 字符,不能包含/ \ ? * [ ] :等特殊字符update的--index为 0-based 非负整数,0 表示移动到最前面update的--hidden设为 true 时,至少需要保留一个可见的工作表,不能将所有工作表都隐藏update的--frozen-row-count/--frozen-column-count为非负整数,不能超过工作表的总行数/列数,设为 0 表示取消冻结update当同时提供多个属性时,所有属性将在同一次请求中更新copy复制操作会将源工作表的所有内容(包括数据、格式、公式等)完整复制到新工作表copy的--title可选,不传时系统自动生成名称(通常为"源名称 副本"或类似格式)copy的--title最长 100 字符,不能包含/ \ ? * [ ] :等特殊字符copy当指定名称与已有工作表重复时,系统会自动重命名为合法值copy的--index可选,不传时副本将放置在源工作表之后的默认位置- ★ 关键区分: sheet(电子表格/单元格读写) vs aitable(AI多维表/结构化记录/字段定义) vs doc(文档编辑/阅读)
- 工作表与单元格命令仅支持
axls;本地xlsx/xls可通过sheet import转换为新的在线电子表格 - 遇到未知
alidocsURL 时,必须先 probe(dws doc info --node <URL> --format json)确认contentType和extension,才能决定是否走 sheet - 当节点
extension=xlsx/xls/xlsm/csv(contentType≠ALIDOC)时,必须用dws doc download --node <ID> --output <路径>先下载到本地再处理,禁止调用任何 sheet 子命令(sheet 底层 MCP 工具只识别 axls,调用 xlsx 节点必失败) - 要把在线表格导出为 xlsx 文件,走
dws sheet export;要把本地 xlsx/xls 转为在线表格,走dws sheet import;要读取已上传但未转换的 xlsx 节点,先走dws doc download