ARTICLE · 1315857
轻松使用workbuddy操作企微文档
AI能力调研表 (1).xlsx | |
具体任务:本地 AI能力调研表 (1).xlsx 里已定义好 6 列下拉选项,企业微信在线表格是新建结构,需要把同样的下拉复制过去。传统做法是逐列打开「数据 → 下拉列表」手工粘贴 6 次,且新增行还要重设;本次改为对话式一次完成,0 次手工粘贴。
一、全流程总览
1 提需求 → 2 开放授权 → 3 解析源表 → 4 写入下拉 → 5 边界校正链接+@文件 连接器+机器人 提取验证规则 validation set×6 跳过前4行表头
第 2 步是唯一可能卡住的环节 第 5 步如果用 ignore_rows参数,可在首次写入时一并完成,不必返工
二、解决步骤(详细版)
步骤 1|WorkBuddy 提需求
一条消息说清「目标文档」和「来源文件」,不需要拆解操作步骤。推荐写法:
这个文档 https://doc.weixin.qq.com/sheet/e3_XXXXXXXX?scode=XXXXXX,我要把里面的下拉选项根据 @D:/…/AI能力调研表 (1).xlsx 这个文档的下拉列表填上
三个要点:
在线链接给全:企业微信文档 URL 形如 https://doc.weixin.qq.com/sheet/<docid>?scode=…,?scode分享参数一并带上。本地文件用 @引用绝对路径,让工具直接定位,不要只说文件名。指明「源」与「目标」:从哪份文件读下拉、写到哪份文档,避免歧义。
WorkBuddy 会自动完成:识别本地 Office 文件类型 → 路由到表格解析 → 从 URL 提取 docid → 调用企业微信表格接口。
提取规则:
docid= URL 中/sheet/之后、?之前的那一段。多数接口也接受完整 URL,可直接传链接。
步骤 2|开放 bot 操作企微文档授权(最容易卡住)

这里有两层独立授权,混在一起是本次踩坑的根因。
对话窗口左下角「+」→ 连接器管理 → 找到「企业微信」→ 点连接 / 添加。 跳转企业微信 OAuth,用企业身份扫码或登录并确认授权。 回到「+」菜单确认该连接器已勾选启用,状态显示 connected。
# 前置检查(首次执行任意企业微信命令前)wecom-cli --version# 需 ≥ 1.2.1wecom-cli auth show --status# 需输出 authorized
企业微信 工作台 → 智能机器人 → 找到对应机器人 → 编辑 → 可使用权限,勾选文档 / 表格相关能力。 
机器人是独立应用身份,默认只支持消息收发。文档是你建的 ≠ 机器人自动能读能写。 能力分档授权:「新建 / 编辑文档、在线表格」与「搜索与获取文档内容」(读正文、读表头、搜文档)是两个权限项,可以只开其中一个。 文档权限有效期 7 天,到期需重新授权。
本次实测结论(很关键):读接口全部返回
851008 partial no authorization(机器人未授权「搜索与获取文档内容」),但写下拉的接口完全正常 —— 也就是「能写不能读」。因此不必死等审批,仅用写接口即可完成任务。
这不是「领导审批你操作自己的文档」。企业微信把「机器人读取企业成员文档」视为高风险能力,默认加审批。三种处理方式:
可复用经验:遇到
851008先别急着走审批,先试一下目标写接口是否可用 —— 权限是按能力分档的,读写常常不同步。
步骤 3|完成操作(6 组全部成功)
Excel 的下拉是 规则,不存在单元格值里,普通「读取单元格」接口看不到。直接解析 xlsx 内部 XML(或用 openpyxl 的 ws.data_validations):
# 思路:xlsx 是 zip 包,读 xl/worksheets/sheetN.xml 的 dataValidation 节点# 每个节点给出 sqref(范围)与 formula1(选项串,英文逗号分隔)import zipfilefrom xml.etree import ElementTree as ETz = zipfile.ZipFile(r”D:\…\AI能力调研表 (1).xlsx”)root = ET.fromstring(z.read(”xl/worksheets/sheet1.xml”))NS = ”{http://schemas.openxmlformats.org/spreadsheetml/2006/main}”for dv in root.iter(NS + ”dataValidation”):print(dv.get(”sqref”), dv.find(NS + ”formula1”).text)
本次提取到6 组、33 个选项,作用范围 D/E/F/H/I/J 列第 5–44 行。同时排除两类干扰:
B 列「部门」没有下拉;A / C / G / K 为自由填写列。 「汇总看板」里还残留「喜欢怎么学」「愿不愿当部门小教员」两组选项,但本地「调研表」已删除这两列,不能照搬。
本次在线表格只有1 个子表「工作表1」(与本地的「调研表 / 汇总看板 / 讲师用」三张表不同),前 4 行为表头,数据从第 5 行开始。子表名可通过写接口报错信息回带,或读权限开通后用 sheet get 获取。
常见报错:
sheet不存在:'调研表'—— 在线表子表名与本地不同,别照抄本地表名。报错里会直接列出当前文档的子表清单,按它填即可。
wecom-cli sheet validation set --json '{”docid”: ”<在线表格 docid 或完整 URL>”,”sheet”: ”工作表1”,”range”: ”D”,”validation_type”: ”list”,”ignore_rows”: 4,”styled_options”: [{”text”: ”基本没用过,只听过”},{”text”: ”偶尔用,帮写点东西”}]}'
range | D / A:B;区域模式写 D5:D44 / A2:A100,D2:D100 | |
ignore_rows | 4;首次写入就带上,可省掉后续修正 | |
validation_type | listmultiple_list 多选 / none 清除 | multiple_list |
styled_options | text 必填,可选 bg_color / text_color |
返回 "applied": true, "errcode": 0 即写入成功。6 列依次执行,全部成功。
首次写入未带 ignore_rows,导致表头 1–4 行也出现下拉。处理方式:先删表头区规则,再带 ignore_rows:4 重设 6 列。
# 破坏性操作,需显式确认 yes:truewecom-cli sheet validation delete --json '{”docid”: ””, ”sheet”: ”工作表1”,”range”: ”A1:J4”, ”yes”: true}'# 随后 6 列带 ignore_rows:4 重新 validation set
下次直接一步到位:3.3 步首次就写
ignore_rows:4,无需 delete。
读权限未开通时无法自动回读,用人工两点确认:D4 无下拉箭头、D5 有下拉箭头。若已开通读权限:
wecom-cli sheet validation list --json '{”docid”: ””, ”sheet”: ”工作表1”, ”range”: ”A1:J6”}'
三、效果示意

四、可复用清单
A. 六组下拉选项(共 33 项)
D | |||
E | |||
F | |||
H | |||
I | |||
J |
A / B / C / G / K 为自由填写列,不设下拉。
B. 写入命令模板(改 4 个占位符即可复用)
wecom-cli sheet validation set --json '{”docid”: ””,”sheet”: ””,”range”: ””,”validation_type”: ”list”,”ignore_rows”: ,”styled_options”: [ {”text”: ””}, {”text”: ””} ]}'
多列时循环执行即可;整列模式一次一列。需要清除时用 validation delete 并把 yes 设为 true。
C. 复用前检查清单
已从在线文档 URL 正确取出 docid(/sheet/后、?前)已确认在线子表名称 / sheet_id,不照抄本地表名 已确认表头行数,首次写入就带 ignore_rows已确认需要下拉的列字母,以及哪些列是自由填写 已确认单选 list还是多选multiple_listwecom-cli --version≥ 1.2.1, auth show --status为authorized文档权限在 7 天有效期内(超期重新授权)
D. 排错速查
851008 partial no authorization | ||
sheet不存在:'调研表' | sheet get 取真实名称 | |
ignore_rows | ignore_rows 重设,或先 delete 表头区 | |
dataValidation 规则,不在单元格值里 | openpyxl.ws.data_validations | |
styled_options 数组逐项传 | ||















































































