PM Weekly Report Update
项目经理周报数据同步技能。
配置文件
目标飞书表格配置存储在 env.vars 下,使用扁平 key:
| 字段 | 说明 |
|---|---|
env.vars.pm_feishu_sheet_token | 飞书表格 token |
env.vars.pm_feishu_sheet_sheet_id | Sheet ID |
env.vars.pm_feishu_sheet_url | 完整 URL |
⚠️ 注意:配置系统不支持嵌套格式(如
pm_feishu_sheet.token),写入时会自动拍扁为pm_feishu_sheet_token。读取时必须使用上述扁平 key。
读取配置(无默认值,配置不存在时为空):
openclaw config get env.vars.pm_feishu_sheet_token
openclaw config get env.vars.pm_feishu_sheet_sheet_id
openclaw config get env.vars.pm_feishu_sheet_url
写入配置(每次只写一个字段):
openclaw config set env.vars.pm_feishu_sheet_token "你的token"
openclaw config set env.vars.pm_feishu_sheet_sheet_id "你的sheet_id"
openclaw config set env.vars.pm_feishu_sheet_url "完整URL"
严禁使用覆盖整个 JSON 的方式写入配置。
配置管理流程
流程 1:首次配置(无配置时)
- 用户发送飞书表格 URL(如
https://lejian.feishu.cn/wiki/RgS0wyoEdisDOCkXE0icPWBPnoe?sheet=NdGNM7) - 从 URL 解析出
token、sheet_id、完整url - 逐字段写入配置(每次一个字段):
openclaw config set env.vars.pm_feishu_sheet.token "RgS0wyoEdisDOCkXE0icPWBPnoe" openclaw config set env.vars.pm_feishu_sheet.sheet_id "NdGNM7" openclaw config set env.vars.pm_feishu_sheet.url "https://lejian.feishu.cn/wiki/RgS0wyoEdisDOCkXE0icPWBPnoe?sheet=NdGNM7" - 告知用户配置完成,可以继续发送 Excel
流程 2:已有配置时
- 调用
openclaw config get env.vars.pm_feishu_sheet.token读取 token - 配合
sheet_id和url用于后续操作
流程 3:配置更新(用户发送新链接)
如果用户发送了新的飞书表格 URL,视为重新配置提示,重复流程1逐字段更新。
URL 解析规则
飞书表格 URL 格式:
- Wiki 乐荐格式(带
/wiki/):https://*.feishu.cn/wiki/TOKEN?sheet=SHEET_IDtoken=?sheet=前面的路径部分(如RgS0wyoEdisDOCkXE0icPWBPnoe)sheet_id=?sheet=后面的部分(如NdGNM7)url= 原始 URL 整体
- 标准格式(带
/sheets/):https://feishu.cn/sheets/shtcnABC123token= 路径最后一段(如shtcnABC123)sheet_id= 从 URL 中找sheet=参数;无则调用 meta 获取第一个 sheet
判断逻辑:
- 链接含
/wiki/→ Wiki 格式,直接解析 token + sheet_id - 链接含
/sheets/→ 标准格式,token 取路径最后一段,sheet_id 从参数读或调用 meta - 既无
/wiki/也无/sheets/→ 视为 token,sheet_id 待指定
安装后引导 ⚠️
本技能依赖 lejian-feishu-sheet(飞书电子表格操作技能),必须先安装并配置才能正常工作。
前置条件
-
安装依赖技能(如果尚未安装):
openclaw skills install lejian-feishu-sheet -
飞书应用权限:你需要有一个乐荐的飞书应用,该应用需要开通「电子表格」编辑权限(
sheets:spreadsheet),并将此飞书表格分享给该应用(编辑权限)。 -
配置飞书凭证:
openclaw config set channels.feishu.appId "你的appId" openclaw config set channels.feishu.appSecret "你的appSecret" -
如需重置本技能配置(只清除乐荐飞书表格配置,保留其他 env.vars):
openclaw config unset env.vars.pm_feishu_sheet_token openclaw config unset env.vars.pm_feishu_sheet_sheet_id openclaw config unset env.vars.pm_feishu_sheet_url⚠️ 不要使用
openclaw config unset env.vars(会清除所有 env.vars,影响其他技能)。
首次配置
配置完成后,发一次飞书表格链接(如 https://lejian.feishu.cn/wiki/RgS0wyoEdisDOCkXE0icPWBPnoe?sheet=NdGNM7),技能会自动解析并保存。
字段枚举与映射关系
Excel 列定义
| Excel列索引 | Python变量名 | 飞书列对应 | 说明 |
|---|---|---|---|
| B(第1索引) | channel_name | 对应飞书G列 | 客户名称(规则2使用) |
| C(第2索引) | ops_channel_name | 对应飞书X列(重要!) | OPS渠道单位名称(规则1使用) |
| F(第5索引) | pe | 对应飞书E列 | 项目经理 |
| H(第7索引) | supply_price | — | 渠道供货价(要同步的周收入) |
飞书表格列定义
| 飞书列 | 列名 | 说明 |
|---|---|---|
| B | 区域 | |
| C | 总监 | |
| D | 销售 | |
| E | PM(项目经理) | 匹配 Excel pe |
| F | 项目唯一标识 | |
| G | 项目名称 | 匹配 Excel channel_name |
| X | OPS渠道单位名称 | 匹配 Excel ops_channel_name(规则1) |
| CS~CW | 周收入列 | 第1-5周数据 |
⚠️ 关键映射:
- Excel
ops_channel_name(C列)→ 飞书 X列(不是G列)- Excel
channel_name(B列)→ 飞书 G列(规则2使用)
匹配字段速查
| 规则 | Excel字段 | 飞书字段 | 优先级 |
|---|---|---|---|
| 规则1 | ops_channel_name(C列) | X列 | 最高 |
| 规则2 | channel_name(B列)+ pe(F列) | G列 + E列 | 降级 |
飞书表格结构
| 飞书列 | 内容 | 说明 |
|---|---|---|
| B | 区域 | |
| C | 总监 | |
| D | 销售 | |
| E | PM(项目经理) | ← 匹配 Excel F列 |
| F | 项目唯一标识 | |
| G | 项目名称 | ← 匹配 Excel B列 |
| X | OPS渠道单位名称 | ← 匹配 Excel C列(重要!) |
| CS | 第1周(4/1-4/5) | |
| CT | 第2周(4/6-4/12) | |
| CU | 第3周(4/13-4/19) | |
| CV | 第4周(4/20-4/26) | |
| CW | 第5周(4/27-4/30) |
数据从第3行开始。第2行是表头。
匹配规则
详见 references/match-rules.md。
优先级:
- 规则1(最高):Excel
ops_channel_name(C列)== 飞书 X列(OPS渠道单位名称)→ 直接命中 - 规则2(降级):
channel_name+pe联合定位飞书 G列+E列,按 2.1精确 → 2.2前缀剥离 → 2.3双向包含 依次尝试
别名支持: 系统支持项目别名映射,例如 享道出行/赛可出行 → 享道汽车。别名在所有规则中均生效。
匹配失败处理: 规则1失败 → 降级规则2;规则2某一子级失败 → 降级下一级;全部失败 → 报错
报错信息: 未找到项目 [channel_name] + PM [pe] 的行,请确认该项目的周报已添加到此表格
原始 Excel 格式
Sheet 名:UUID 风格(如 d2721d4c-95a5-4d8c-bc12-668050f)
| 列索引 | Python变量名 | 列名 | 说明 |
|---|---|---|---|
| B(第1索引) | channel_name | 客户名称 | 规则2使用 |
| C(第2索引) | ops_channel_name | OPS渠道单位名称 | 规则1匹配字段(最高优先级) |
| F(第5索引) | pe | 项目经理 | 匹配飞书E列 |
| H(第7索引) | supply_price | 渠道供货价 | = 要同步的周收入 |
⚠️ openpyxl 的 row 数组是 0-based 索引(Python list):A=index0, B=index1, ..., H=index7
同步流程
第一步:检查配置
调用 openclaw config get env.vars.pm_feishu_sheet.token 读取配置。
- 有配置 → 继续
- 无配置 → 请用户发送飞书表格 URL,完成配置后继续
第二步:解析文件名判断周次
文件名格式:xxx_2026_0420-0426---uuid.xlsx
| 日期区间(MMDD) | 对应列 |
|---|---|
| 0401-0405 | CS |
| 0406-0412 | CT |
| 0413-0419 | CU |
| 0420-0426 | CV |
| 0427-0430 | CW |
从文件名提取 MMDD-MMDD 区间,匹配上表确定目标列。
第三步:读取 Excel 数据
读取 Sheet 1,从第2行起,提取:
channel_name(B列)ops_channel_name(C列)pe(F列)supply_price(H列)
第四步:匹配项目行
按 references/match-rules.md 中的规则依次尝试匹配:
- 规则1:Excel
ops_channel_name(C列) == 飞书 X列(最高优先级) - 规则2:
channel_name+pe联合定位飞书 G列+E列(2.1精确 → 2.2前缀剥离 → 2.3双向包含)
全部失败 → 报错。
第五步:写入飞书表格
使用 lejian-feishu-sheet 的 write 命令,token/sheet_id 从配置读取:
TOKEN=$(openclaw config get env.vars.pm_feishu_sheet.token)
SHEET_ID=$(openclaw config get env.vars.pm_feishu_sheet.sheet_id)
OPENCLAW_CONFIG=~/workspace/agent/openclaw.json \
~/workspace/agent/skills/lejian-feishu-sheet/scripts/feishu-sheet.sh \
write "$TOKEN" "${SHEET_ID}!CV5:CV5" '[[159468.66]]'
输出格式要求
执行结果输出(JSON)
脚本执行后输出结构化 JSON,包含以下字段:
{
"week_col": "CV", // 本次更新的周次列
"updates": [ // 成功匹配的记录列表(包含写入和跳过)
{
"channel": "某科技公司", // Excel channel_name(B列)
"ops_channel_name": "2026某科技公司", // Excel OPS渠道单位名称(C列)
"pe": "张三", // PM(项目经理)
"row": 17, // 飞书表格目标行号
"col": "CV", // 周次列
"value": 35792, // 本次写入的供货价
"rule": "规则1", // 命中的匹配规则
"status": "ok" // 状态:ok=成功写入, skipped=跳过
}
],
"errors": [ // 匹配失败的记录列表
"未找到项目 [某渠道](2025某渠道名)+ PM [李四] 的行"
]
}
输出要求:
week_col必须标注本次更新的周次列(如 CV=第4周)updates中的每条记录必须包含:channel、ops_channel_name、pe、row、col、value、ruleerrors中每条错误信息必须包含:项目名(channel_name)、OPS渠道单位名称(ops_channel_name)和 PM- 匹配规则名称需标准化:规则1、规则2.1、规则2.2、规则2.3
错误处理
| 情况 | 处理 |
|---|---|
| 无飞书表格配置 | 请用户发送飞书表格 URL,分析后写入配置 |
| 文件名无法解析周次 | 报错:「无法识别文件名中的日期,请确认格式如 xxx_2026_0420-0426---uuid.xlsx」 |
| 项目行未找到 | 报错:「未找到项目 [某公司] + PM [某PM] 的行,请确认该项目的周报已添加到此表格」 |
| 渠道供货价为0或空 | 跳过该行(不写入),并在结果中说明「[某公司] 无渠道供货价数据(0),已跳过」 |
| 找到多个匹配行 | 报错:「匹配到多行,请检查数据:[行号1] [行号2]」 |
注意事项
- 每次只更新已有行,不新建行
- 有任何一行匹配失败,整体报错,不部分更新
- 使用乐荐飞书凭证(
channels.feishu.appId/channels.feishu.appSecret) - 写入前展示将要更新的内容,确认后执行