钉钉在线表格 OpenAPI 实战:用 Python CLI 读取 Sheet,并接入 AI 工作流
很多团队已经在用钉钉在线表格维护项目进度、周报、客户线索、问题清单或运营数据。
但当我们想把这些数据接入自动化脚本、AI Agent 或内部工作流时,常见问题就来了:
- 表格数据适合人维护,但不适合程序稳定消费;
- 直接复制粘贴给 AI,容易混入隐私数据,也不可追溯;
- 业务人员习惯继续用表格,开发者又希望拿到 JSON / CSV / Markdown;
- AI 工作流需要稳定输入,而不是每次手工整理一遍。
这篇文章用一个非官方 Python CLI 示例,演示如何通过钉钉在线表格 OpenAPI 读取 Sheet,并导出成 JSON、CSV、Markdown。最后再加一点 AI:把钉钉在线表格作为 AI Agent / Hermes 工作流的数据入口,用于周报生成、风险识别和任务摘要。
说明:本文示例只使用钉钉开放平台公开 OpenAPI,不包含任何账号凭证,不绕过权限控制,也不使用真实公司数据。文中的表格、人员、项目名都是合成示例。
一、为什么先做 CLI,而不是直接让 AI 读表格?
AI Agent 最怕两件事:
- 输入不稳定;
- 权限边界不清楚。
如果直接把在线表格链接交给 AI,让它自己想办法读,调试和审计都会变得困难。更稳妥的方式是把链路拆开:
钉钉在线表格
-> Python CLI 读取指定 Sheet / Range
-> 导出 JSON / CSV / Markdown
-> 脱敏、清洗、字段归一化
-> AI Agent / Hermes 工作流处理
-> 输出周报、风险摘要、任务提醒或 HTML 报告
这样做的好处是:
- 表格仍然由业务人员维护;
- CLI 只访问授权范围内的数据;
- AI 只消费结构化后的输入;
- 每次运行都可以留下输入文件和输出报告,方便追溯;
- 后续可以把同一份数据接入多个工作流。
二、工具能力概览
这个 CLI 示例工具做了几件最小但实用的事情:
- 从
alidocs.dingtalk.com/i/nodes/...链接中提取nodeId; - 使用钉钉内部应用的
appKey/appSecret获取访问令牌; - 列出一个在线表格里的 sheet 页;
- 读取指定 sheet 的单元格区域,例如
A1:E20; - 将读取结果输出为 JSON、CSV 或 Markdown;
- 写入命令默认拒绝执行,必须显式传入
--yes。
这个边界很重要:默认先读,不默认写。对于自动化和 AI 工作流来说,读写边界越清楚,越不容易误伤生产数据。
三、准备环境变量
建议准备一个 .env 文件:
DINGTALK_CLIENT_ID=your_app_key
DINGTALK_CLIENT_SECRET=your_app_secret
DINGTALK_OPERATOR_UNION_ID=your_operator_union_id
注意不要把 .env 上传到 Git、CSDN、网盘或任何公开位置。
四、提取 nodeId
钉钉在线表格链接里通常会包含 nodes 路径。可以先用命令提取 nodeId:
python3 tools/dingtalk-spreadsheet-cli/dingtalk_spreadsheet_cli.py extract-node-id \
"https://alidocs.dingtalk.com/i/nodes/yourNodeId"
输出示例:
yourNodeId
这里不要在文章、日志、截图中暴露真实 nodeId。真实文档 ID 本身也可能属于内部信息。
五、列出 Sheet
拿到 nodeId 后,可以列出在线表格中的 sheet:
python3 tools/dingtalk-spreadsheet-cli/dingtalk_spreadsheet_cli.py list-sheets \
--node-id yourNodeId \
--format md
示例输出:
| name | id | type |
| --- | --- | --- |
| demo_tasks | s1 | SHEET |
| demo_weekly | s2 | SHEET |
实际使用时,建议先列出 sheet,再确认目标 sheet 的 id,不要凭页面上的中文名称直接猜。
六、读取指定范围并导出 Markdown
读取一个小范围:
python3 tools/dingtalk-spreadsheet-cli/dingtalk_spreadsheet_cli.py read-range \
--node-id yourNodeId \
--sheet-id s1 \
--range A1:E20 \
--format md
示例输出:
| task_id | title | owner | status | risk |
| --- | --- | --- | --- | --- |
| T-001 | 示例任务A | 张三 | 进行中 | 依赖外部接口 |
| T-002 | 示例任务B | 李四 | 已完成 | 无 |
| T-003 | 示例任务C | 王五 | 阻塞 | 等待测试环境 |
Markdown 很适合给人看,也适合直接放进日报、周报或人工确认页面。
七、导出 JSON 给 AI 工作流
如果要接 AI Agent,更推荐导出 JSON:
python3 tools/dingtalk-spreadsheet-cli/dingtalk_spreadsheet_cli.py read-range \
--node-id yourNodeId \
--sheet-id s1 \
--range A1:E20 \
--format json > demo_tasks.json
示例 JSON:
[
["task_id", "title", "owner", "status", "risk"],
["T-001", "示例任务A", "张三", "进行中", "依赖外部接口"],
["T-002", "示例任务B", "李四", "已完成", "无"],
["T-003", "示例任务C", "王五", "阻塞", "等待测试环境"]
]
在真实项目中,建议再做一步归一化,把二维表格转成对象数组:
[
{
"task_id": "T-001",
"title": "示例任务A",
"owner": "张三",
"status": "进行中",
"risk": "依赖外部接口"
}
]
这样后续 prompt、规则检查、报告渲染都会更稳定。
八、接入 AI Agent / Hermes 工作流
上面的 CLI 看起来只是一个导出工具,但在 AI 工作流里,它可以作为“结构化数据入口”。
以 Hermes 这类 AI Agent 工作流为例,可以设计成下面的流程:
1. 业务人员维护钉钉在线表格
2. 定时任务调用 Python CLI 读取指定 Sheet
3. 脚本把二维表格转换成结构化 JSON
4. 脱敏和字段校验
5. Hermes 工作流读取 JSON
6. LLM 生成摘要、风险、下周计划或提醒
7. 结果输出到 Markdown / HTML / 邮件 / 钉钉通知 / 任务看板
一个典型场景是“周报生成”:
- 表格字段:任务、负责人、当前状态、风险、下周计划;
- CLI 读取最新范围并导出 JSON;
- Hermes 工作流把 JSON 交给 LLM;
- LLM 生成:
- 本周完成事项;
- 风险和阻塞项;
- 需要管理者确认的问题;
- 下周计划摘要;
- 可复制到周报的 Markdown。
这比人工复制表格给 AI 更稳,因为数据获取、清洗、脱敏和生成都有明确边界。
九、一个最小 Hermes 输入示例
假设前置脚本已经把表格转成下面的 JSON:
{
"source": "dingtalk_spreadsheet_demo",
"generated_at": "2026-05-26T20:30:00+08:00",
"tasks": [
{
"task_id": "T-001",
"title": "示例任务A",
"owner": "张三",
"status": "进行中",
"risk": "依赖外部接口",
"next_plan": "继续联调"
},
{
"task_id": "T-002",
"title": "示例任务B",
"owner": "李四",
"status": "已完成",
"risk": "无",
"next_plan": "等待验收"
}
]
}
给 Hermes / AI Agent 的输入可以非常简单:
请基于以下任务数据生成一份项目周报摘要。
要求:
1. 只使用输入数据,不编造任务;
2. 输出“本周完成”“风险阻塞”“下周计划”“需要人工确认”四部分;
3. 对 status=阻塞 或 risk 不为空的任务单独列出;
4. 输出 Markdown。
这里的重点不是 prompt 多复杂,而是输入数据足够干净、字段含义明确、来源可追溯。
十、为什么要先脱敏再交给 AI?
在线表格里经常会有人员、客户、项目、金额、合同、故障、系统名称等敏感信息。即使只是内部 AI,也建议做最小必要处理:
- 不读取无关列;
- 不读取无关 sheet;
- 不把真实表格链接写入日志;
- 不把 appKey、appSecret、unionId 放进文章或报告;
- 对人员、客户、项目名做别名化;
- 对金额、手机号、邮箱、身份证、IP、域名做遮蔽;
- 让 AI 只处理需要的字段。
可以把清洗后的数据写成:
{
"project": "项目A",
"owner": "人员1",
"risk": "外部依赖未完成"
}
而不是把整张真实表格原样喂给模型。
十一、写入命令为什么必须加 --yes?
这个 CLI 也支持写入区域,但写入命令默认需要显式确认:
python3 tools/dingtalk-spreadsheet-cli/dingtalk_spreadsheet_cli.py write-range \
--node-id yourNodeId \
--sheet-id s1 \
--range A1:B3 \
--values-file products/dingtalk-spreadsheet-cli/examples/write-values.sample.json \
--yes
原因很简单:读操作和写操作风险不同。
如果后续要让 AI Agent 参与写入,建议先采用“人审后写入”的模式:
AI 生成建议
-> 写入本地草稿文件
-> 人工确认
-> CLI 写入测试 Sheet
-> 再进入正式 Sheet
不要一开始就让 AI 直接改生产表格。
十二、适合扩展的方向
这个 CLI 只是一个最小示例,但可以继续扩展成很多实用工作流:
- 每天读取项目进度表,生成日报;
- 每周读取任务表,生成周报;
- 读取问题清单,自动识别高风险项;
- 读取客户线索表,生成跟进提醒;
- 读取测试用例表,生成 Markdown 测试报告;
- 读取故障复盘表,生成 RCA 初稿;
- 读取运营数据表,生成趋势摘要。
这些场景本质上都是同一套模式:
业务表格 -> 结构化读取 -> 脱敏清洗 -> AI 摘要/分类/审计 -> 人工确认/自动分发
十三、边界和免责声明
最后再强调几个边界:
- 这是非官方示例工具,不代表钉钉官方立场;
- 只封装公开 OpenAPI,不绕过权限控制;
- 不包含任何真实凭证、cookie、企业数据或私有接口;
- 使用者需要自行创建钉钉开放平台应用并配置权限;
- 请只访问自己有权限的在线表格;
- 生产写入前务必先在测试表格验证;
- 接入 AI 工作流前,先做字段最小化和数据脱敏。
如果只是学习钉钉在线表格 OpenAPI,可以先从读取 A1:E20、导出 Markdown/JSON 开始。等读取链路稳定后,再接入 Hermes 或其他 AI Agent 工作流做摘要、审计和自动报告。
资源包
我整理了一个 Python CLI 示例资源包,包含:
- CLI 脚本;
requirements.txt;.env.example;- 中文 README;
- 快速开始文档;
- 写入示例 JSON;
- 安全边界说明。
资源名称:钉钉在线表格OpenAPI命令行示例工具 Python版
资源地址:https://download.csdn.net/download/distantsky/92905259
建议使用时先跑只读命令,确认权限、sheetId 和数据范围后,再考虑写入或接入 AI 工作流。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)