月度绩效通知机器人
一个项目,把 Excel、判断、循环、Word、邮件全用上。分 6 关,每关都能独立跑通。
项目目标
- 能独立把 Excel 里的多行数据读成二维数组,并逐行处理
- 会用条件判断给每条数据算出等级(优秀 / 良好 / 待改进)
- 能按 Word 模板批量生成个性化文档,并正确命名、保存
- 会把处理结果回写 Excel,并用邮件把汇总发出去
- 能为核心循环加上 Try/Catch,让个别坏数据不拖垮整批
- 能把六关串成一条"读数据 → 处理 → 产出 → 通知"的完整流水线
预计用时:4–6 小时(分 6 关,可以分段做、每关都能停) | 前置知识:第 1–9 课,重点第 3 课(变量)、第 4 课(判断)、第 5 课(循环)、第 6 课(数组)、第 7 课(Excel)、第 8 课(Word)、第 9 课(邮件) | 本课性质:综合项目(认证实操的准备,把零散命令连成一条产线)
别急着一次做完。每一关都是完整的一步,做完一关就能停下来。按顺序来,卡住就停下问我——不要跳到下一关还欠着上一关。
知识地图
这是整套课程的第一个综合项目,位置在"四类办公自动化(Excel / Word / 邮件 / 网页)"之后、认证实操之前。前面每一课教的都是单个命令,这个项目第一次要求你把它们按真实工单的先后顺序排成一条流水线:先读、再算、再产出、最后通知。
一、需求说明(像真实工单那样)
背景:HR 每月要给人发绩效通知。数据在 Excel,模板在 Word,发完还要留痕。
为什么这个任务适合交给机器人?因为它满足 RPA 的四条判断标准:规则固定(分数区间对应固定等级)、每月重复(月月都要发)、数据结构化(Excel 表格)、来源稳定(同一份绩效表)。把它想象成一条流水线:入口是 Excel,出口是 Word 和邮件,中间那段"算等级"就是你写的逻辑。
| 项 | 内容 |
|---|---|
| 输入 | 绩效表.xlsx,三列:姓名、部门、分数(6 行) |
| 规则 | 分数 ≥ 90 → 优秀;75~89 → 良好;< 75 → 待改进 |
| 输出① | 每人一份 Word 通知,文件名用姓名,存到 通知/ 目录 |
| 输出② | 回写到 Excel,加一列"等级" |
| 输出③ | 把本次结果汇总成邮件内容发出 |
样例数据(也可直接复制 assets/绩效表.csv,用 Excel 打开后另存为 绩效表.xlsx):
姓名 部门 分数 张三 销售部 92 李四 财务部 78 王五 技术部 64 赵六 人事部 88 钱七 市场部 95 孙八 运营部 71
为什么要在动手前把"规则"写成表格?因为机器人的逻辑就是你脑子里的规则翻译成代码。你先把"什么分数算什么等级"定死,第 2 关的 If / ElseIf / Else 才有依据,第 6 关也才知道"什么样算坏数据"。
二、关卡地图
六个关卡各自能独立跑通,难度是叠加的:每一关只加一个新的动作,前面的成果都能保留。
建议节奏:第 1–2 关先在一台电脑上把"读 + 算"跑顺;第 3 关是项目的核心,卡住很正常;第 4–5 关是"留痕 + 通知";第 6 关是拉开初级和中级的门槛。每过一关,把代码发我一次。
三、准备目录与文件
在你的流程文件夹下建好:
你的流程/
├── res/
│ ├── 绩效表.xlsx ← 放入上面的样例数据
│ └── 通知模板.docx ← 内容见下
└── 通知/ ← 空目录,存生成的 Word
通知模板.docx 的正文:
尊敬的 $姓名$:
您本月在 $部门$ 的绩效分数为 $分数$,等级为 $等级$。
请继续努力!
HR 部
准备步骤
- 在流程目录下新建
res和通知两个文件夹。期望:目录结构与上面完全一致(通知/先留空)。 - 把 绩效表.csv 用 Excel 打开,另存为
res\绩效表.xlsx。期望:用 Excel 打开后,第一行是表头"姓名 部门 分数",下面 6 行数据。 - 新建一个 Word,照着上面的模板正文打字,保存为
res\通知模板.docx。期望:正文里能清楚看到 4 个$…$标记,前后无多余空格。 - 常见报错:若后面流程报"找不到文件",先检查文件名是否真的叫
绩效表.xlsx(Windows 有时隐藏扩展名,显示成绩效表),以及res的拼写和大小写。
四、逐关实现
第 1 关 · 读数据并打印
先用 打开Excel 打开表格,用 读取区域 读 "A1:C7"(含表头)到一个变量,再用 For Each 逐行输出。
- 在变量区新建三个变量:
objExcelWorkBook、rows、第几行。期望:变量列表里能看到它们(类型先留空,赋值时 APA Creator 会自动推断)。 - 拖入
打开Excel,属性区把文件路径填res\绩效表.xlsx、可见填True、输出到objExcelWorkBook。期望:单独运行这一步,Excel 窗口被打开并显示绩效表。 - 拖入
读取区域:工作簿选objExcelWorkBook、工作表填Sheet1、区域填A1:C7、结果存入rows。期望:rows读进来 7 行(1 行表头 + 6 行数据)、每行 3 列。 - 拖入"赋值"把
第几行设为0;再拖For Each遍历rows,循环体第一句就写第几行 = 第几行 + 1。期望:每转一圈第几行就加一,用来数现在是第几行。 - 拖
If判断第几行 = 1:成立就输出调试信息("这是表头:" & 一行[0]),否则输出一行[0] & "/" & 一行[1] & "/" & 一行[2]。注意:BotScript 的条件判断不写Then。 - 循环结束后拖入
关闭Excel工作簿关闭objExcelWorkBook。 - 点运行,看输出面板。常见报错:若读不到数据,多半是工作表名不是
Sheet1,把工作表改成0(表示第一张表)再试;若行数不对,检查区域是否写成A1:C7。
打开Excel(res\绩效表.xlsx, 可见=True) → objExcelWorkBook
读取区域(objExcelWorkBook, 工作表="Sheet1", 区域="A1:C7") → rows
Dim 第几行 = 0
For Each 一行 In rows
第几行 = 第几行 + 1
If 第几行 = 1 // 表头跳过;注意 BotScript 不写 Then
输出调试信息("这是表头:" & 一行[0])
Else
输出调试信息(一行[0] & "/" & 一行[1] & "/" & 一行[2])
End If
Next
关闭Excel工作簿(objExcelWorkBook)
如果报错:多半是工作表名不是
Sheet1,改成 0 试试;或区域行数不对。第 2 关 · 算等级
给每行算出等级。注意:Excel 读出来的"分数"可能是数字,也可能是文字,比较前先确认类型——必要时用 转为整数数据。
- 在第 1 关循环体内、拿到
一行之后,新增两个变量:分数、等级。 - 拖入
转为整数数据,把一行[2]转成整数并存进分数。期望:先输出调试信息(分数),确认它是能参与比较的数字,而不是带引号的文字。 - 拖入
If / ElseIf / Else三段判断:分数 >= 90给等级 = "优秀";分数 >= 75给等级 = "良好";否则等级 = "待改进"。 - 每轮用
输出调试信息(一行[0] & ":" & 等级)打印结果,先验证再加第 3 关的 Word 逻辑。常见报错:若报类型不匹配,说明分数还是文字,回去确认第 2 步的转换有没有落到分数上。
Dim 分数 = 转为整数数据(一行[2])
Dim 等级 = ""
If 分数 >= 90
等级 = "优秀"
ElseIf 分数 >= 75
等级 = "良好"
Else
等级 = "待改进"
End If
第 3 关 · 批量生成 Word(项目最核心)
在循环里,每处理一行就打开一次模板、填 4 个标记、另存为姓名、关闭。上一关的等级变量直接拿来用。
- 先确认第 2 关的等级全部正确,再往下做——后面生成的 Word 内容全依赖这个
等级。 - 在循环体内、等级算好之后,拖入
打开文档,路径填res\通知模板.docx、输出到objWord。期望:能在后台/前台打开模板。 - 依次做四组替换:每组先
查找文本后设置光标位置(objWord, "$标记$", "选中文本"),紧接着写入文字(objWord, 对应值)。四个标记分别是$姓名$、$部门$、$分数$、$等级$。 - 拖入
文档另存为,路径拼成输出目录 & 一行[0] & ".docx"(记得目录末尾带反斜杠)。期望:文件按姓名命名,存进通知/。 - 拖入
关闭文档关闭objWord;点运行。期望:通知/目录里出现 6 个 .docx。 - 常见报错:标记没被替换 → 检查模板里的
$姓名$和代码里是否完全一致(中文符号、全半角、空格都算);另存路径报错 → 检查拼接后是否少了反斜杠、或文件名里混进了非法字符。
打开文档(res\通知模板.docx, 可见=True) → objWord 查找文本后设置光标位置(objWord, "$姓名$", "选中文本") 写入文字(objWord, 一行[0]) 查找文本后设置光标位置(objWord, "$部门$", "选中文本") 写入文字(objWord, 一行[1]) 查找文本后设置光标位置(objWord, "$分数$", "选中文本") 写入文字(objWord, 一行[2]) 查找文本后设置光标位置(objWord, "$等级$", "选中文本") 写入文字(objWord, 等级) 文档另存为(objWord, 路径 & 一行[0] & ".docx") 关闭文档(objWord)
通知/ 目录里出现 6 个 .docx,内容各自正确。常见坑:标记没被替换 → 检查模板里的
$姓名$ 和代码里是否完全一致(中文符号也算);另存路径记得拼接正确。第 4 关 · 回写 Excel
给表格加第 4 列"等级"。逐行写 D列(表头行写"等级",数据行写算出的等级)。
- 先在表头行写
D1 = "等级":写入单元格(objExcelWorkBook, "Sheet1", "D1", "等级", 立即保存=否)。 - 在循环里、等级算好之后,按行号写数据列:
写入单元格(..., "D" & 第几行, 等级, 立即保存=否)。注意:行号与第 1 关的第几行对齐,表头行是第 1 行。 - 循环结束后调用
保存Excel(objExcelWorkBook)真正落盘。期望:运行结束时表格文件被更新。 - 关闭 Excel 后,用 Excel 打开
绩效表.xlsx检查 D 列。常见坑:忘了"立即保存"或忘了保存Excel→ 文件没变;把表头行也写成了等级 → 检查行号判断。
写入单元格(objExcelWorkBook, "Sheet1", "D1", "等级", 立即保存=否) // 循环中,按行号写: 写入单元格(objExcelWorkBook, "Sheet1", "D" & 第几行, 等级, 立即保存=否) // 循环结束后: 保存Excel(objExcelWorkBook)
绩效表.xlsx,D 列出现等级且与你算的一致。常见坑:忘了"立即保存"或忘了
保存Excel → 文件没变。第 5 关 · 发邮件
把所有结果拼成一段文字,用 发送邮件 发给自己(发给自己最简单,回执立刻能验证)。
- 在循环开始前定义汇总字符串:
Dim 汇总 = "本月绩效通知已生成:" & "\n"。 - 在循环里逐行追加:
汇总 = 汇总 & 一行[0] & " - " & 等级 & "\n"。期望:循环结束后汇总含 6 行"姓名 - 等级"。 - 循环结束后拖入
发送邮件,照着示例填 SMTP 服务器、端口、SSL、邮箱帐号;登录密码填你事先准备的授权码变量,收信邮箱填自己,标题"月度绩效通知",正文传汇总,结果存入成功与否。 - 运行并查收邮件。常见报错:登录失败 → 授权码错或没开 SMTP 服务;连接超时 → 端口/SSL 配对不对(如 465 配 SSL)。
Dim 汇总 = "本月绩效通知已生成:" & "\n"
// 循环中逐行追加:
汇总 = 汇总 & 一行[0] & " - " & 等级 & "\n"
// 循环结束后:
发送邮件(SMTP服务器="smtp.qq.com", 服务器端口=465, SSL加密=True,
邮箱帐号=..., 登录密码=<授权码变量>, 收信邮箱=...,
邮件标题="月度绩效通知", 邮件正文=汇总) → 成功与否
安全习惯:授权码不要硬写在流程里,用变量或凭据管理。
第 6 关 · 加错误处理(进阶)
现实里总有一两行数据出问题(分数是空的、模板少了标记)。给核心循环包上 Try ... Catch,出错时记录是哪一行、然后继续处理下一行,而不是整个流程崩掉。
- 把循环里"处理这一行"的整块动作(算等级、打开文档、填标记、另存、关闭)选中,用
Try包起来。 - 在
Catch里输出定位信息:输出调试信息("第 " & 第几行 & " 行出错:" & 错误["Message"]),然后让它继续下一轮。 - 故意制造一个错误:把某人的分数删空或改空,重跑流程。期望:其余 5 人照常生成,只有那一行被记录为错误。
- 常见坑:把
Try包得太大(连循环本身都包进去)→ 一出错整批就跳出了;正确做法是只包"单行处理"这一块。
Try 3
处理这一行(填模板、另存)
Catch 错误
输出调试信息("第 " & 第几行 & " 行出错:" & 错误["Message"])
继续下一行
End Try
这一关做的就是真实的"异常处理",也是初级→中级的门槛。
五、卡住时怎么办(别硬扛)
- 切到源代码视图,把当前流程块的代码复制出来——这比截图好排查。
- 看报错原文:先判断是"找不到元素/文件"(环境问题)还是"逻辑错"(代码问题)。
- 把流程缩小到最小可复现:只留出错那一条命令,用行右侧的小三角单独运行它。
- 还是不行,把代码 + 报错 + 你期望的结果三样一起发我。
三个高频坑,先自查一遍:① 模板标记与代码不一致(含空格、全半角);② 另存路径拼接少了 \ 或目录不存在;③ 循环里该"每轮重置"的变量定义到了循环外,导致上一行的结果残留到下一行。
六、技术点索引
| 用到的东西 | 复习哪节 |
|---|---|
| 二维数组、For Each | 第 6 课、第 5 课 |
| If 判断(无 Then) | 第 4 课 |
变量、类型转换、& 拼接 | 第 3 课 |
| 打开/读取/写入/保存/关闭 Excel | Excel 命令速查 |
| Word 标记填充、另存为 | Word 命令速查 |
| SMTP 发邮件、授权码 | Email 命令速查 |
| Try/Catch 异常处理 | BotScript 参考 · 异常 |
项目复盘
你真正学会的能力
- 把 Excel 表读成二维数组,并用
For Each逐行处理(第 5、6、7 课) - 用
If / ElseIf / Else把连续的分数量化成离散的等级(第 4 课) - 在循环里用 Word 模板 + 标记替换批量生成个性化文档并正确命名(第 8 课)
- 回写 Excel 并调用
保存Excel真正落盘(第 7 课) - 用 SMTP 把汇总结果发出去,且授权码不硬写(第 9 课)
- 用 Try/Catch 让个别坏数据不拖垮整批(进阶,初级→中级的门槛)
结课自测
不看上面,凭记忆作答。答错不要紧,解析会告诉你为什么。