综合项目 把七部分串起来

月度绩效通知机器人

一个项目,把 Excel、判断、循环、Word、邮件全用上。分 6 关,每关都能独立跑通。

项目目标

预计用时:4–6 小时(分 6 关,可以分段做、每关都能停) |  前置知识:第 1–9 课,重点第 3 课(变量)、第 4 课(判断)、第 5 课(循环)、第 6 课(数组)、第 7 课(Excel)、第 8 课(Word)、第 9 课(邮件) |  本课性质:综合项目(认证实操的准备,把零散命令连成一条产线)

别急着一次做完。每一关都是完整的一步,做完一关就能停下来。按顺序来,卡住就停下问我——不要跳到下一关还欠着上一关。

知识地图

这是整套课程的第一个综合项目,位置在"四类办公自动化(Excel / Word / 邮件 / 网页)"之后、认证实操之前。前面每一课教的都是单个命令,这个项目第一次要求你把它们按真实工单的先后顺序排成一条流水线:先读、再算、再产出、最后通知。

本项目在哪儿
综合项目 1,把第 3–9 课的命令串成一条完整产线;做完它就具备认证实操的基本功。
重点
二维数组遍历 + 循环内生成 Word + 回写 Excel 后正确落盘。
难点
Word 标记的"完全一致"、另存路径的拼接、变量在循环里的作用范围。
学完的标志
不看答案,你能从空流程做出一个跑通 6 关、并收到汇总邮件的机器人。

一、需求说明(像真实工单那样)

背景: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 关 · 批量生成 Word 第 4 关 · 回写 Excel 第 5 关 · 发邮件 第 6 关 · 加个错误处理
绩效通知项目六关流水线:读数据、算等级、生成 Word、回写 Excel、发邮件,第六关用错误处理包住整条流程 六关叠加成一条流水线:读 → 算 → 生成 → 回写 → 通知 每关只加一个新动作,前面的成果都能保留。 ① 读数据 读 A1:C7 含表头 7 行 得到二维数组 ② 算等级 分数 → 等级 优秀 / 良好 / 待改进 ③ 生成 Word 模板 + 数据 替换 $姓名$ 等 每人一份 ④ 回写 Excel 写等级列 留下处理记录 方便核对 ⑤ 发邮件 汇总通知 带附件 发给 HR 第 6 关 · 错误处理(包住整条流水线) 文件不存在 某行数据异常 邮件发送失败 报错时要说清:哪一步、哪一条数据,别让整批任务悄悄中断。 第 1–5 关每关只加一个新动作;第 6 关是初级与中级的分水岭。
图 10 · 前五关是一条线性流水线;第六关用错误处理包住它,处理文件、数据、邮件三类异常。

建议节奏:第 1–2 关先在一台电脑上把"读 + 算"跑顺;第 3 关是项目的核心,卡住很正常;第 4–5 关是"留痕 + 通知";第 6 关是拉开初级和中级的门槛。每过一关,把代码发我一次。

三、准备目录与文件

在你的流程文件夹下建好:

你的流程/
├── res/
│   ├── 绩效表.xlsx      ← 放入上面的样例数据
│   └── 通知模板.docx     ← 内容见下
└── 通知/                 ← 空目录,存生成的 Word

通知模板.docx 的正文:

尊敬的 $姓名$:

您本月在 $部门$ 的绩效分数为 $分数$,等级为 $等级$。
请继续努力!

HR 部

准备步骤

  1. 在流程目录下新建 res 和 通知 两个文件夹。期望:目录结构与上面完全一致(通知/ 先留空)。
  2. 把 绩效表.csv 用 Excel 打开,另存为 res\绩效表.xlsx。期望:用 Excel 打开后,第一行是表头"姓名 部门 分数",下面 6 行数据。
  3. 新建一个 Word,照着上面的模板正文打字,保存为 res\通知模板.docx。期望:正文里能清楚看到 4 个 $…$ 标记,前后无多余空格。
  4. 常见报错:若后面流程报"找不到文件",先检查文件名是否真的叫 绩效表.xlsx(Windows 有时隐藏扩展名,显示成 绩效表),以及 res 的拼写和大小写。

四、逐关实现

第 1 关 · 读数据并打印

用到:第 6 课(二维数组)、第 7 课(Excel 四步)、第 5 课(遍历循环)

先用 打开Excel 打开表格,用 读取区域 读 "A1:C7"(含表头)到一个变量,再用 For Each 逐行输出。

  1. 在变量区新建三个变量:objExcelWorkBook、rows、第几行。期望:变量列表里能看到它们(类型先留空,赋值时 APA Creator 会自动推断)。
  2. 拖入 打开Excel,属性区把文件路径填 res\绩效表.xlsx、可见填 True、输出到 objExcelWorkBook。期望:单独运行这一步,Excel 窗口被打开并显示绩效表。
  3. 拖入 读取区域:工作簿选 objExcelWorkBook、工作表填 Sheet1、区域填 A1:C7、结果存入 rows。期望:rows 读进来 7 行(1 行表头 + 6 行数据)、每行 3 列。
  4. 拖入"赋值"把 第几行 设为 0;再拖 For Each 遍历 rows,循环体第一句就写 第几行 = 第几行 + 1。期望:每转一圈 第几行 就加一,用来数现在是第几行。
  5. 拖 If 判断 第几行 = 1:成立就 输出调试信息("这是表头:" & 一行[0]),否则输出 一行[0] & "/" & 一行[1] & "/" & 一行[2]。注意:BotScript 的条件判断不写 Then。
  6. 循环结束后拖入 关闭Excel工作簿 关闭 objExcelWorkBook。
  7. 点运行,看输出面板。常见报错:若读不到数据,多半是工作表名不是 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)
验收:输出面板应出现 6 行"姓名/部门/分数"(表头那行单独提示)。
如果报错:多半是工作表名不是 Sheet1,改成 0 试试;或区域行数不对。

第 2 关 · 算等级

用到:第 4 课(条件判断)、第 3 课(变量与类型转换)

给每行算出等级。注意:Excel 读出来的"分数"可能是数字,也可能是文字,比较前先确认类型——必要时用 转为整数数据。

  1. 在第 1 关循环体内、拿到 一行 之后,新增两个变量:分数、等级。
  2. 拖入 转为整数数据,把 一行[2] 转成整数并存进 分数。期望:先 输出调试信息(分数),确认它是能参与比较的数字,而不是带引号的文字。
  3. 拖入 If / ElseIf / Else 三段判断:分数 >= 90 给 等级 = "优秀";分数 >= 75 给 等级 = "良好";否则 等级 = "待改进"。
  4. 每轮用 输出调试信息(一行[0] & ":" & 等级) 打印结果,先验证再加第 3 关的 Word 逻辑。常见报错:若报类型不匹配,说明 分数 还是文字,回去确认第 2 步的转换有没有落到 分数 上。
关键片段
Dim 分数 = 转为整数数据(一行[2])
Dim 等级 = ""
If 分数 >= 90
    等级 = "优秀"
ElseIf 分数 >= 75
    等级 = "良好"
Else
    等级 = "待改进"
End If
验收:6 个人的等级应为:优秀、良好、待改进、良好、优秀、待改进。

第 3 关 · 批量生成 Word(项目最核心)

用到:第 8 课(标记填充法、另存为)

在循环里,每处理一行就打开一次模板、填 4 个标记、另存为姓名、关闭。上一关的等级变量直接拿来用。

  1. 先确认第 2 关的等级全部正确,再往下做——后面生成的 Word 内容全依赖这个 等级。
  2. 在循环体内、等级算好之后,拖入 打开文档,路径填 res\通知模板.docx、输出到 objWord。期望:能在后台/前台打开模板。
  3. 依次做四组替换:每组先 查找文本后设置光标位置(objWord, "$标记$", "选中文本"),紧接着 写入文字(objWord, 对应值)。四个标记分别是 $姓名$、$部门$、$分数$、$等级$。
  4. 拖入 文档另存为,路径拼成 输出目录 & 一行[0] & ".docx"(记得目录末尾带反斜杠)。期望:文件按姓名命名,存进 通知/。
  5. 拖入 关闭文档 关闭 objWord;点运行。期望:通知/ 目录里出现 6 个 .docx。
  6. 常见报错:标记没被替换 → 检查模板里的 $姓名$ 和代码里是否完全一致(中文符号、全半角、空格都算);另存路径报错 → 检查拼接后是否少了反斜杠、或文件名里混进了非法字符。
关键片段
打开文档(res\通知模板.docx, 可见=True) → objWord
查找文本后设置光标位置(objWord, "$姓名$", "选中文本")
写入文字(objWord, 一行[0])
查找文本后设置光标位置(objWord, "$部门$", "选中文本")
写入文字(objWord, 一行[1])
查找文本后设置光标位置(objWord, "$分数$", "选中文本")
写入文字(objWord, 一行[2])
查找文本后设置光标位置(objWord, "$等级$", "选中文本")
写入文字(objWord, 等级)
文档另存为(objWord, 路径 & 一行[0] & ".docx")
关闭文档(objWord)
验收:通知/ 目录里出现 6 个 .docx,内容各自正确。
常见坑:标记没被替换 → 检查模板里的 $姓名$ 和代码里是否完全一致(中文符号也算);另存路径记得拼接正确。

第 4 关 · 回写 Excel

用到:第 7 课(写入单元格、立即保存)

给表格加第 4 列"等级"。逐行写 D列(表头行写"等级",数据行写算出的等级)。

  1. 先在表头行写 D1 = "等级":写入单元格(objExcelWorkBook, "Sheet1", "D1", "等级", 立即保存=否)。
  2. 在循环里、等级算好之后,按行号写数据列:写入单元格(..., "D" & 第几行, 等级, 立即保存=否)。注意:行号与第 1 关的 第几行 对齐,表头行是第 1 行。
  3. 循环结束后调用 保存Excel(objExcelWorkBook) 真正落盘。期望:运行结束时表格文件被更新。
  4. 关闭 Excel 后,用 Excel 打开 绩效表.xlsx 检查 D 列。常见坑:忘了"立即保存"或忘了 保存Excel → 文件没变;把表头行也写成了等级 → 检查行号判断。
关键片段
写入单元格(objExcelWorkBook, "Sheet1", "D1", "等级", 立即保存=否)
// 循环中,按行号写:
写入单元格(objExcelWorkBook, "Sheet1", "D" & 第几行, 等级, 立即保存=否)
// 循环结束后:
保存Excel(objExcelWorkBook)
验收:用 Excel 打开 绩效表.xlsx,D 列出现等级且与你算的一致。
常见坑:忘了"立即保存"或忘了 保存Excel → 文件没变。

第 5 关 · 发邮件

用到:第 9 课(SMTP 发送邮件)

把所有结果拼成一段文字,用 发送邮件 发给自己(发给自己最简单,回执立刻能验证)。

  1. 在循环开始前定义汇总字符串:Dim 汇总 = "本月绩效通知已生成:" & "\n"。
  2. 在循环里逐行追加:汇总 = 汇总 & 一行[0] & " - " & 等级 & "\n"。期望:循环结束后 汇总 含 6 行"姓名 - 等级"。
  3. 循环结束后拖入 发送邮件,照着示例填 SMTP 服务器、端口、SSL、邮箱帐号;登录密码填你事先准备的授权码变量,收信邮箱填自己,标题"月度绩效通知",正文传 汇总,结果存入 成功与否。
  4. 运行并查收邮件。常见报错:登录失败 → 授权码错或没开 SMTP 服务;连接超时 → 端口/SSL 配对不对(如 465 配 SSL)。
关键片段
Dim 汇总 = "本月绩效通知已生成:" & "\n"
// 循环中逐行追加:
汇总 = 汇总 & 一行[0] & " - " & 等级 & "\n"
// 循环结束后:
发送邮件(SMTP服务器="smtp.qq.com", 服务器端口=465, SSL加密=True,
         邮箱帐号=..., 登录密码=<授权码变量>, 收信邮箱=..., 
         邮件标题="月度绩效通知", 邮件正文=汇总) → 成功与否
验收:收到邮件,正文含 6 行姓名 + 等级。
安全习惯:授权码不要硬写在流程里,用变量或凭据管理。

第 6 关 · 加错误处理(进阶)

用到:第 5 关的流程复跑 + Try/Catch(进阶语法)

现实里总有一两行数据出问题(分数是空的、模板少了标记)。给核心循环包上 Try ... Catch,出错时记录是哪一行、然后继续处理下一行,而不是整个流程崩掉。

  1. 把循环里"处理这一行"的整块动作(算等级、打开文档、填标记、另存、关闭)选中,用 Try 包起来。
  2. 在 Catch 里输出定位信息:输出调试信息("第 " & 第几行 & " 行出错:" & 错误["Message"]),然后让它继续下一轮。
  3. 故意制造一个错误:把某人的分数删空或改空,重跑流程。期望:其余 5 人照常生成,只有那一行被记录为错误。
  4. 常见坑:把 Try 包得太大(连循环本身都包进去)→ 一出错整批就跳出了;正确做法是只包"单行处理"这一块。
思路
Try 3
    处理这一行(填模板、另存)
Catch 错误
    输出调试信息("第 " & 第几行 & " 行出错:" & 错误["Message"])
    继续下一行
End Try
验收:故意把某个人的分数删掉或改空,重跑流程——其余 5 人照常生成,只有那一行被记录为错误。
这一关做的就是真实的"异常处理",也是初级→中级的门槛。

五、卡住时怎么办(别硬扛)

  1. 切到源代码视图,把当前流程块的代码复制出来——这比截图好排查。
  2. 看报错原文:先判断是"找不到元素/文件"(环境问题)还是"逻辑错"(代码问题)。
  3. 把流程缩小到最小可复现:只留出错那一条命令,用行右侧的小三角单独运行它。
  4. 还是不行,把代码 + 报错 + 你期望的结果三样一起发我。

三个高频坑,先自查一遍:① 模板标记与代码不一致(含空格、全半角);② 另存路径拼接少了 \ 或目录不存在;③ 循环里该"每轮重置"的变量定义到了循环外,导致上一行的结果残留到下一行。

六、技术点索引

用到的东西复习哪节
二维数组、For Each第 6 课、第 5 课
If 判断(无 Then)第 4 课
变量、类型转换、& 拼接第 3 课
打开/读取/写入/保存/关闭 ExcelExcel 命令速查
Word 标记填充、另存为Word 命令速查
SMTP 发邮件、授权码Email 命令速查
Try/Catch 异常处理BotScript 参考 · 异常

项目复盘

你真正学会的能力

二维数组 行列表格数据 For Each 逐行遍历 If/ElseIf 分级判断 标记填充 Word 占位替换 文档另存为 按姓名命名 立即保存 写一格存一格 SMTP 邮件发送协议 Try/Catch 异常捕获

结课自测

不看上面,凭记忆作答。答错不要紧,解析会告诉你为什么。

精读一手来源

本项目的命令细节以官方文档为准:《来也开发者指南》与命令手册。 建议按关卡回查对应章节——Excel 相关看"表格/Excel"分类,Word 看"Word 文档"分类,邮件看"邮件"分类;遇到命令名或参数不确定,以命令手册里的当前版本为准。