---
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
