--- name: biaoshu version: 1.0.0 description: | 标数 — 飞书知识库剧本表格互动行自动编号与知识点统计技能。 从知识库文档的内嵌 Sheet 中识别互动行(A列类型非 TL/空),自动在 B列写入顺序编号 ID, 并支持从 D列提取知识点生成统计报告。 **触发场景:** - 用户要求给剧本表格互动行"标数""编号""命名 ID" - 用户要求统计剧本表格知识点覆盖情况 - 用户给出知识库链接 + "标数" / "统计知识点" / "加ID" metadata: requires: permissions: ["sheets:spreadsheet"] identity: bot --- # 标数 — 剧本表格互动行编号与知识点统计 ## 前置条件 1. 确认目标文档为飞书知识库 wiki 链接(`/wiki/` 开头) 2. Bot(App ID: `cli_a931175d41799cc7`)已加入该知识空间 3. 使用 Bot 身份操作(不触发用户授权) ## ID 命名规则 - 格式:`{前缀}{序号}`,序号从 01 开始,两位数字补零 - 默认前缀:`12185`(可自定义) - 示例:第一个互动 → `1218501`,第十个 → `1218510` ## 互动行识别规则 A列值不为空且不为 `TL` 的行即为互动行,按行号从小到大的顺序编号。 常见 A列值: - `中互动` / `中互动1` ... `中互动N` - `核心互动-xxx` / `核心互动X-xxx` - 不编号的:`TL` 行、空行 ## 执行流程 ### Step 1: 解析知识库链接 从用户提供的 wiki URL 中提取 `obj_token` 和 `space_id`: ``` 格式: https://{domain}/wiki/{obj_token}?... ``` ### Step 2: 获取文档结构,定位内嵌 Sheet ``` GET /open-apis/docx/v1/documents/{obj_token}/blocks Header: Authorization: Bearer {bot_tenant_access_token} ``` 遍历 blocks,找到 `block_type: 30`(内嵌 Sheet)的 block,从 `sheet.token` 中提取: - `spreadsheet_token` = token 中 `_` 之前的部分 - `sheet_id` = token 中 `_` 之后的部分 ### Step 3: 读取表格数据 ``` GET /open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values/{sheet_id}!A1:I{max_rows}?valueRenderOption=ToString ``` ### Step 4: 识别互动行并生成 ID 遍历数据行(跳过表头),对 A列不为空且不为 `TL` 的行,按顺序分配编号。 ### Step 5: 写入 B列 使用 values API 逐行写入,range 格式:`{sheet_id}!B{row}:B{row}` ``` PUT /open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values Body: { "valueRange": { "range": "{sheet_id}!B{row}:B{row}", "values": [["{id}"]] } } ``` ### Step 6: 验证 回读 B列确认写入正确。 ## 知识点统计(可选,用户单独要求时执行) 读取 D列(知识点列),按出现次数汇总: 1. 遍历有 A列标记的互动行(A列≠TL/空),提取 D列知识点 2. 多行知识点(换行分隔)分别统计 3. `Over here.` / `Over here!` 合并为 `Over here.` 统一计数 4. 输出格式: ``` 序号 | 行号 | 类型 | 知识点 | 次数 ``` ## 示例 **输入:** > https://makee-interactive.feishu.cn/wiki/P9bvw6nXziqzWZkxDmMcOZN4ndc 标数 **输出:** 识别 16 个互动行,按序写入 `1218501` ~ `1218516` 到 B列。 ## 注意事项 - 写单个单元格 range 必须用 `B{row}:B{row}` 格式(非 `B{row}`) - Bot tenant_access_token 通过飞书应用 App ID + App Secret 获取 - 数据行范围需根据实际表格调整(跳过公式行和尾部空行) - 若 B列已有旧 ID,直接覆盖写入新 ID