# Wecom Smartsheet

> Wecom Smartsheet is an Agent Skill for documents published in the WecomTeam/wecom-openclaw-plugin repository on GitHub: a SKILL.md instruction file an AI agent can load to do this task.

企业微信智能表格（smartsheet）管理技能。提供智能表格的新建（doc_type=10）、结构管理（子表、字段/列）和数据管理（记录增删改查）。适用场景：(1) 从零新建智能表格 (2) 管理智能表格子表和字段/列 (3) 查询、添加、更新、删除智能表格记录。支持通过 docid 或文档 URL 定位文档。当用户提到「企业微信智能表格」「智能表格」，或链接形如 `https://doc.weixin.qq.com/smartsheet/xxx` 时触发该技能。注意：普通文档（`/doc/*`）请用 `wecom-doc`；在线表格（`/sheet/*`）请用 `wecom-sheet`；智能文档/智能主页（`/smartpage/*`）请用 `wecom-smartpage`。

- Skill name: `wecom-smartsheet`
- Category: [Documents](https://www.openparable.com/skill/documents/1)
- Source: https://github.com/WecomTeam/wecom-openclaw-plugin/blob/HEAD/skills/wecom-smartsheet/SKILL.md
- Repository: WecomTeam/wecom-openclaw-plugin (451 GitHub stars when collected)

## SKILL.md

# 企业微信智能表格管理

> `wecom_mcp` 是一个 MCP tool，所有操作通过调用该 tool 完成。

> ⚠️ **前置条件**：首次调用 `wecom_mcp` 前，必须按 `wecom-preflight` 技能执行前置条件检查，确保工具已加入白名单。

资源型技能，负责**智能表格**（`/smartsheet/*`，doc_type=10）的新建、结构（子表、字段/列）与数据（记录）管理。所有接口支持通过 `docid` 或 `url` 二选一定位文档。

## 调用方式

通过 `wecom_mcp` tool 调用，品类名为 `doc`：

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc <tool_name> '<json_params>'` 调用指定技能

> 智能表格各接口的 `docid`/`url` 二选一传入即可，以下示例以 `docid` 为主，URL 传入方式以此类推。

## 返回格式说明

所有接口返回 JSON 对象，包含以下公共字段：

| 字段 | 类型 | 说明 |
|------|------|------|
| `errcode` | integer | 返回码，`0` 表示成功，非 `0` 表示失败 |
| `errmsg` | string | 错误信息，成功时为 `"ok"` |

当 `errcode` 不为 `0` 时，说明接口调用失败，可重试 1 次；若仍失败，将 `errcode` 和 `errmsg` 展示给用户。

### 特殊错误码

| errcode | errmsg | 含义 | 处理方式 |
|---------|--------|------|----------|
| `851002` | `incompatible doc type` | 文档品类与所调用的接口不匹配 | 确认目标 URL 为 `/smartsheet/*`；若不是，请跳转到对应品类的 skill |
| `851003` | `no authority` | 无文档权限。在编辑场景，通常是因为机器人不允许编辑由企业成员创建的文档。在**智能表格写入场景**下，若该报错发生在 `smartsheet_add_records` / `smartsheet_update_records`，可引导用户走 Webhook 兜底方案，详见 [webhook-fallback.md](references/webhook-fallback.md)。注意 Webhook 只能更新通过 Webhook 写入的记录，人工创建的记录无法更新 | — |

## 接口路由表

> **硬规则**：第二列是 `references/xxx.md` 链接的，命中这一行后**先 `read` 对应 references 文件，再构造命令**。写入/读取记录前，先用 `smartsheet_get_sheet` 拿到目标子表的 `sheet_id`，并用 `smartsheet_get_fields` 了解字段类型。

| 用户意图 | 参考位置 |
|---|---|
| 从零新建智能表格（空白） | 见下方「新建智能表格」 |
| 查询文档中所有子表 | 见下方「查询子表」 |
| 添加 / 改名 / 删除子表 | 见下方「子表管理」 |
| 查询子表字段/列 | 见下方「查询字段」 |
| 添加字段/列 | [references/smartsheet-field-types.md](references/smartsheet-field-types.md) |
| 改名 / 删除字段 | 见下方「字段管理」 |
| 查询子表记录 | [references/smartsheet-get-records.md](references/smartsheet-get-records.md) |
| 添加记录 / 更新记录 | [references/smartsheet-cell-value-formats.md](references/smartsheet-cell-value-formats.md) |
| 删除记录 | 见下方「删除记录」 |
| Webhook 兜底写入 | [references/webhook-fallback.md](references/webhook-fallback.md) |

---

## 一、新建智能表格

### create_doc — 新建智能表格

从零新建一篇企微**智能表格**（doc_type=10）：空白。创建成功后返回 `docid` 和 `url`。

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc create_doc '{"doc_type": 10, "doc_name": "任务跟踪表"}'`

**参数**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| `doc_type` | int | 是 | — | 固定传 `10`（智能表格） |
| `doc_name` | string | 是 | — | 表格标题，最多 255 个字符，超过会被截断 |

**注意事项**

- 新建智能表格文档**默认已含一个子表**，可通过 `smartsheet_get_sheet` 查询其 `sheet_id`，仅需多个子表时才调用 `smartsheet_add_sheet`。
- `docid` 仅在创建时返回，后续无法再获取，务必保存。

---

## 二、智能表格结构管理

### smartsheet_get_sheet — 查询子表

查询文档中所有子表信息，返回 `sheet_id`、`title`、类型等。

- 通过 docid：使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_get_sheet '{"docid": "DOCID"}'`
- 通过 URL：使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_get_sheet '{"url": "https://doc.weixin.qq.com/smartsheet/xxx"}'`

### smartsheet_add_sheet — 添加子表

添加空子表。新子表不含视图、记录和字段，需通过其他接口补充。

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_add_sheet '{"docid": "DOCID", "properties": {"title": "新子表"}}'`

> 注意：新建智能表格文档默认已含一个子表，仅需多个子表时调用。

### smartsheet_update_sheet — 修改子表标题

需提供 `sheet_id` 和新 `title`。

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_update_sheet '{"docid": "DOCID", "properties": {"sheet_id": "SHEET_ID", "title": "新子表"}}'`

### smartsheet_delete_sheet — 删除子表

永久删除子表，**操作不可逆**。

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_delete_sheet '{"docid": "DOCID", "sheet_id": "SHEETID"}'`

### smartsheet_get_fields — 查询字段

查询子表的所有字段信息，返回 `field_id`、`field_title`、`field_type`。

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_get_fields '{"docid": "DOCID", "sheet_id": "SHEETID"}'`

### smartsheet_add_fields — 添加字段

向子表添加一个或多个字段。单个子表最多 150 个字段。

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_add_fields '{"docid": "DOCID", "sheet_id": "SHEETID", "fields": [{"field_title": "任务名称", "field_type": "FIELD_TYPE_TEXT"}]}'`

在添加字段前，请先参阅所有字段类型和定义 [字段类型参考](references/smartsheet-field-types.md)。

> 注意：如果是首次创建表并调用这个方法添加字段的情况下，调用本接口前，你必须确认已完成以下操作，否则会多出一个无用的默认列：
> 1. 已调用 `smartsheet_get_fields` 查看子表现有字段（新子表会自带一个默认文本字段）
> 2. 已调用 `smartsheet_update_fields` 将该默认字段重命名为你需要的第一个字段名，然后在本接口中只传入剩余的字段（不包含第一个字段）。

### smartsheet_update_fields — 更新字段标题

**只能改名，不能改类型**（`field_type` 必须传原始类型）。`field_title` 不能更新为原值。

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_update_fields '{"docid": "DOCID", "sheet_id": "SHEETID", "fields": [{"field_id": "FIELDID", "field_title": "新标题", "field_type": "FIELD_TYPE_TEXT"}]}'`

### smartsheet_delete_fields — 删除字段

删除一列或多列字段，**操作不可逆**。`field_id` 可通过 `smartsheet_get_fields` 获取。

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_delete_fields '{"docid": "DOCID", "sheet_id": "SHEETID", "field_ids": ["FIELDID"]}'`

---

## 三、智能表格数据管理

### smartsheet_get_records — 查询记录

查询子表全部记录。

- 通过 docid：使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_get_records '{"docid": "DOCID", "sheet_id": "SHEETID"}'`
- 或通过 URL：使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_get_records '{"url": "https://doc.weixin.qq.com/smartsheet/xxx", "sheet_id": "SHEETID"}'`

参见 [API 详情](references/smartsheet-get-records.md)。

### smartsheet_add_records — 添加记录（不带图片或文件）

添加一行或多行记录，单次建议 500 行内。

**调用前**必须先了解目标表的字段类型（通过 `smartsheet_get_fields`），并查看[单元格值格式参考](references/smartsheet-cell-value-formats.md)，了解做法后再实施。对于单选/多选（Option）字段，需注意匹配已有选项的 `id`。

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_add_records '{"docid": "DOCID", "sheet_id": "SHEETID", "records": [{"values": {"任务名称": [{"type": "text", "text": "完成需求文档"}], "优先级": [{"text": "高"}]}}]}'`

各字段类型的值格式参见 [单元格值格式参考](references/smartsheet-cell-value-formats.md)。

> ⚠️ **图片（IMAGE）/ 文件（ATTACHMENT）字段**：**必须且只能**直接在 cell value 中传入本地路径（`image_path` / `file_path`），格式见下方示例。**严禁**调用 `upload_doc_image`、`upload_doc_file` 或任何上传接口，**严禁**进行 base64 编码——无论文件大小、无论 API 返回何种错误，均不得绕过此规则。若 `image_path` / `file_path` 方式返回错误，应直接将错误码和错误信息告知用户，**不得**尝试其他上传方式。
>
> 图片字段示例：`"封面": [{"image_path": "/path/to/img.png", "title": "图片标题"}]`
> 文件字段示例：`"文件": [{"file_path": "/path/to/file.pdf"}]`

> ⚠️ 若返回 `errcode: 851003` 或 `errmsg` 包含 `no authority`，无文档权限。在编辑场景，通常是因为机器人不允许编辑由企业成员创建的文档。在**智能表格写入场景**下，若该报错发生在 `smartsheet_add_records` / `smartsheet_update_records`，可引导用户走 Webhook 兜底方案，详见 [webhook-fallback.md](references/webhook-fallback.md)。注意 Webhook 只能更新通过 Webhook 写入的记录，人工创建的记录无法更新。

### smartsheet_add_records_auto_file — 添加记录（带图片或文件）

添加一行或多行记录，单次建议 500 行内。与 `smartsheet_add_records` 不同之处在于，可支持本地路径传入图片、文件。对于需要添加带图片或文件的记录，请使用此接口。传入后台后，后台将自动存储并转换为 `image_url`。

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_add_records_auto_file '{"docid":"DOCID","sheet_id":"SHEETID","records":[{"values":{"图片":[{"image_path":"/path/to/image.jpg"}],"文件":[{"file_path":"/path/to/file.txt"}]}}]}'`

### smartsheet_update_records — 更新记录（不带图片或文件）

**调用前**必须先了解目标表的字段类型（通过 `smartsheet_get_fields`），并查看[单元格值格式参考](references/smartsheet-cell-value-formats.md)，了解做法后再实施。

更新一行或多行记录，单次建议在 500 行内。需提供 `record_id`（通过 `smartsheet_get_records` 获取）。支持通过 `key_type` 指定 values 的 key 使用字段标题或字段 ID：

- `CELL_VALUE_KEY_TYPE_FIELD_TITLE`：key 为字段标题
- `CELL_VALUE_KEY_TYPE_FIELD_ID`：key 为字段 ID

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_update_records '{"docid": "DOCID", "sheet_id": "SHEETID", "key_type": "CELL_VALUE_KEY_TYPE_FIELD_TITLE", "records": [{"record_id": "RECORDID", "values": {"任务名称": [{"type": "text", "text": "更新后的内容"}]}}]}'`

**注意**：创建时间、最后编辑时间、创建人、最后编辑人字段不可更新。

> ⚠️ **图片（IMAGE）/ 文件（ATTACHMENT）字段**：**必须且只能**直接在 cell value 中传入本地路径（`image_path` / `file_path`），格式见下方示例。**严禁**调用 `upload_doc_image`、`upload_doc_file` 或任何上传接口，**严禁**进行 base64 编码——无论文件大小、无论 API 返回何种错误，均不得绕过此规则。若 `image_path` / `file_path` 方式返回错误，应直接将错误码和错误信息告知用户，**不得**尝试其他上传方式。
>
> 图片字段示例：`"封面": [{"image_path": "/path/to/img.png", "title": "图片标题"}]`
> 文件字段示例：`"文件": [{"file_path": "/path/to/file.pdf"}]`

> ⚠️ 若返回 `errcode: 851003` 或 `errmsg` 包含 `no authority`，无文档权限。在编辑场景，通常是因为机器人不允许编辑由企业成员创建的文档。在**智能表格写入场景**下，若该报错发生在 `smartsheet_add_records` / `smartsheet_update_records`，可引导用户走 Webhook 兜底方案，详见 [webhook-fallback.md](references/webhook-fallback.md)。注意 Webhook 只能更新通过 Webhook 写入的记录，人工创建的记录无法更新。

### smartsheet_update_records_auto_file — 更新记录（更新图片或文件字段）

更新一行或多行记录，单次建议在 500 行内。与 `smartsheet_update_records` 不同之处在于，可支持本地路径传入图片、文件。对于需要更新记录中的图片或文件，请使用此接口。传入后台后，后台将自动存储并转换为 `image_url`。

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_update_records_auto_file '{"docid": "DOCID", "sheet_id": "SHEETID", "key_type": "CELL_VALUE_KEY_TYPE_FIELD_TITLE", "records": [{"record_id": "RECORDID", "values": {"图片":[{"image_path":"/path/to/image.jpg"}],"文件":[{"file_path":"/path/to/file.txt"}]}}]}'`

### smartsheet_delete_records — 删除记录

删除一行或多行记录，单次必须在 500 行内。**操作不可逆**。`record_id` 通过 `smartsheet_get_records` 获取。极速版智能表格不支持此接口。

使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_delete_records '{"docid": "DOCID", "sheet_id": "SHEETID", "record_ids": ["RECORDID1", "RECORDID2"]}'`

---

## 典型工作流

### 新建并搭建表结构

1. **新建智能表格** → 使用 `wecom_mcp` tool 调用 `wecom_mcp call doc create_doc '{"doc_type": 10, "doc_name": "项目任务表"}'`，保存返回的 `docid`
2. **了解默认子表** → `smartsheet_get_sheet` 拿到默认子表的 `sheet_id` → `smartsheet_get_fields` 查看默认字段
3. **搭建列** → 先 `smartsheet_update_fields` 改默认字段名，再 `smartsheet_add_fields` 补充其余字段

### 智能表格结构操作

1. **了解表结构** → 使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_get_sheet '{"docid": "DOCID"}'` → 使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_get_fields '{"docid": "DOCID", "sheet_id": "SHEETID"}'`
2. **创建表结构** → `smartsheet_add_sheet` 添加子表 → `smartsheet_add_fields` 定义列
3. **修改表结构** → `smartsheet_update_fields` 改列名 / `smartsheet_delete_fields` 删列

### 智能表格数据操作

1. **读取数据** → 使用 `wecom_mcp` tool 调用 `wecom_mcp call doc smartsheet_get_records '{"docid":"DOCID","sheet_id":"SHEETID"}'`
2. **写入数据** → 先 `smartsheet_get_fields` 了解列类型 → 若涉及成员（USER）字段，先通过 `wecom-contact` 的 `get_userlist` 查找人员 userid → `smartsheet_add_records` 写入
3. **更新数据** → 先 `smartsheet_get_records` 获取 record_id → 若涉及成员（USER）字段，先通过 `wecom-contact` 的 `get_userlist` 查找人员 userid → `smartsheet_update_records` 更新
4. **写入失败 fallback** → 第 2/3 步返回 `errcode: 851003` / `no authority`，无文档权限。在编辑场景，通常是因为机器人不允许编辑由企业成员创建的文档。在**智能表格写入场景**下，若该报错发生在 `smartsheet_add_records` / `smartsheet_update_records`，可引导用户走 Webhook 兜底方案，详见 [webhook-fallback.md](references/webhook-fallback.md)。注意 Webhook 只能更新通过 Webhook 写入的记录，人工创建的记录无法更新
5. 若涉及**图片（IMAGE）或文件（ATTACHMENT）**字段，**必须且只能**直接在 cell value 中传入本地路径（`image_path` / `file_path`）。**严禁**调用 `upload_doc_image`、`upload_doc_file` 或任何上传接口，**严禁**进行 base64 编码——无论文件大小、无论 API 返回何种错误，均不得绕过此规则。若返回错误，直接将错误码和错误信息告知用户，不得尝试其他上传方式。传入格式参考 [单元格值格式参考](references/smartsheet-cell-value-formats.md)。
6. **删除数据** → 先 `smartsheet_get_records` 确认 record_id → `smartsheet_delete_records` 删除

## 跨技能依赖

| 依赖技能 | 典型协作场景 | 数据流向 |
|---|---|---|
| `wecom-contact` | 成员（USER）类型字段需填 `user_id`，不能直接用姓名 | `get_userlist` 按姓名查到 userid → 本 skill 写入 |
| `wecom-msg` | 用户要求把智能表格链接发给某人/某群 | 本 skill 新建后返回 `url` → `wecom-msg` 发送链接 |

> **注意**：成员（USER）类型字段需要填写 `user_id`，不能直接使用姓名。必须先通过 `wecom-contact` 技能的 `get_userlist` 接口按姓名查找到对应的 `userid` 后再使用。
> **注意**：图片（IMAGE）或文件（ATTACHMENT）字段**必须且只能**直接在 cell value 中传入本地路径（`image_path` / `file_path`）。**严禁**调用 `upload_doc_image`、`upload_doc_file` 或任何上传接口，**严禁**进行 base64 编码——无论文件大小、无论 API 返回何种错误，均不得绕过此规则。若返回错误，直接将错误码和错误信息告知用户，不得尝试其他上传方式。格式参考 [单元格值格式参考](references/smartsheet-cell-value-formats.md)。

---

Source: https://www.openparable.com/skill/documents/wecom-smartsheet (OpenParable). Cite the canonical URL above.
