2026-09-08 · 原文发布日
招聘申请自动筛选、通知与面试排期
候选人通过n8n表单提交申请和简历后,流程生成唯一编号、校验有效性并查重,无效或重复项写入表格并在Slack提醒管理员。简历解析失败的会通过Gmail请候选人重新上传;解析成功则把简历文本和岗位要求交给Gemini输出结构化信息、匹配评分和风险提示,结果入表后按分数走Slack和Gmail的入围、待审或拒信分支。授权评审在Slack里用表情回复批准后,自动查日历空闲、创建含Meet链接的面试并邮件通知候选人。
原文要点
该n8n工作流(iamvaar发布)用Form Trigger接收候选人申请和简历上传,生成唯一申请ID、加载岗位配置、校验后把无效项写入Google Sheets并在Slack提醒管理员;再按邮箱在Sheets查重,重复则Slack通知。简历文本提取失败会记表并通过Gmail请候选人重传;成功后把简历文本与岗位要求发给Google Gemini输出结构化数据、匹配评分、推荐意见和风险提示。结果入表后按分数走Slack/Gmail的入围、知会、人工复核或拒信分支。授权评审在Slack对消息加表情(reaction_added事件)批准后,流程查Google Calendar空闲、创建含Meet链接的面试并邮件通知候选人。需要Sheets服务账号、Gemini API、Slack(开启reaction事件订阅)、Gmail与Calendar OAuth2五类凭据。
这次做成什么
在自己的n8n实例里搭建一个招聘申请处理练习流:表单收申请→校验查重→AI评分→按分支通知→Slack表情批准后自动排面试。这是本站依据原流程描述独立设计的简化练习方案,不是原工作流文件;具体节点名、字段键名和表达式需以n8n.io/workflows/19400原模板为准核对。
准备什么
- 一个可自托管或云端可用的n8n实例及管理员权限
- Google Cloud项目:Sheets服务账号、Gemini API Key、Gmail与Calendar OAuth2客户端
- 一个Slack工作区及可创建应用、订阅reaction_added事件的权限
- 一份练习用岗位要求文本和至少两份虚构简历PDF或DOCX
具体怎么做
建表与表单入口
在Google Sheets建Applicants和Rejected两个工作表,列含application_id、name、email、score、recommendation、status。n8n新建Form Trigger,字段设姓名、邮箱、求职岗位、简历文件上传;发布后得到候选URL。上传字段的二进制键名要与后续节点引用一致,练习版统一用resume_file。
校验、编号与查重
接Code节点生成申请编号,练习逻辑:'APP-'+时间戳后6位。用IF节点校验邮箱含@且简历文件存在,不合格写Rejected表并向Slack管理频道发消息。再用Google Sheets节点按email列查找现有记录,找到则发Slack重复提醒并结束。
解析简历并调用Gemini评分
用Extract from File节点把上传的PDF/DOCX转文本;解析为空时走失败分支:记Rejected表、Gmail发重传邮件。成功则把简历文本和岗位要求拼入提示词发Gemini,要求返回JSON:score、recommendation、risks。解析结果连同原始字段写入Applicants表。
按分数分支通知
用Switch节点:score≥80发Slack入围消息给评审并邮件通知候选人待安排;60–79发Slack人工复核请求;<60走Gmail拒信模板。所有分支都先确保Sheets该行的status列同步更新。
Slack表情批准后排面试
另起Slack Trigger监听reaction_added,过滤指定表情(如white_check_mark)且用户ID在授权评审名单内。通过后Google Calendar节点查询空闲时段、创建事件并勾选生成Meet会议链接,最后Gmail把时间和Meet链接发给候选人。
可直接复制的材料
Gemini简历评分提示词
本站独立编写的示例提示词,非原模板原文;job_requirements和resume_text占位符在n8n中用表达式替换。
你是招聘筛选助手。根据下面的岗位要求和候选人简历文本,输出严格JSON,不要输出其他文字。
【岗位要求】
{job_requirements}
【简历文本】
{resume_text}
返回格式:
{"score": 0到100的整数, "recommendation": "shortlist|review|reject之一", "strengths": ["最多3条优势"], "risks": ["最多3条风险或缺口"], "summary": "50字内中文结论"}
评分标准:技能匹配占50分,相关经验年限占30分,沟通与稳定性信号占20分。信息不足时在risks里注明,不要臆测。练习用Applicants表结构
本站虚构合成数据,直接粘贴为CSV导入Google Sheets练习;无真实个人信息。
application_id,name,email,position,score,recommendation,status
APP-482913,林小舟,linxz@example.com,前端工程师,86,shortlist,shortlisted
APP-517204,陈默,chenmo@example.com,前端工程师,62,review,pending_review分支阈值与字段映射配置
本站设计的练习配置示例;Slack用户ID、频道名、时区和时段需替换为自己的值,表情事件订阅需在Slack应用后台开启。
{
"thresholds": {"shortlist": 80, "review": 60},
"binaryKey": "resume_file",
"slack": {"adminChannel": "#recruit-admin", "reviewChannel": "#hiring-review", "approveReaction": "white_check_mark", "authorizedReviewers": ["U01EXAMPLE1"]},
"calendar": {"slotMinutes": 45, "workingHours": "10:00-17:00", "timezone": "Asia/Shanghai"}
}输入与输出示例
本站虚构演示输入与示意输出,未实际运行,评分数字不保证与任何模型真实输出一致。
输入
候选人提交表单:姓名林小舟,邮箱linxz@example.com,岗位前端工程师,上传简历PDF含文本:'3年Vue/React经验,主导过两个B端项目,熟悉TypeScript与单元测试'。岗位要求:'2年以上前端经验,熟悉React或Vue,掌握TypeScript,有组件库或中后台项目经验者优先'。对应输出
Gemini返回JSON:{"score":86,"recommendation":"shortlist","strengths":["3年React/Vue经验超出年限要求","有中后台项目主导经验","掌握TypeScript与测试"],"risks":["未提及组件库建设经验"],"summary":"技能匹配度高,建议进入短名单"}。Applicants表新增行APP-482913状态shortlisted,Slack #hiring-review 收到入围消息,候选人收到'已进入面试候选'邮件。评审加✅表情后,日历创建次日14:00-14:45事件并邮件发送Meet链接。做完检查这些
- 提交缺少邮箱或漏传简历的申请后,Rejected表出现新行且Slack管理频道收到提醒,流程不再继续评分
- 用同一邮箱重复提交,第二次触发Slack重复通知且Applicants表不新增行
- 上传一份内容损坏或纯图片PDF,候选人邮箱收到请重新上传可读文件的Gmail邮件
- 评分≥80的记录在Slack出现入围消息,评审加指定表情后日历出现含Meet链接的面试事件且候选人收到邮件
- 评分<60时只发拒信邮件,不触发任何日历操作
容易卡住的地方
- Slack表情批准依赖Slack应用的reaction_added事件订阅,仅在n8n里放Slack Trigger而不去Slack后台订阅事件,批准分支永远不会触发
- 简历二进制字段键名不一致会导致解析节点取不到文件,表现为每次都被当作解析失败
- Gemini的模型名和端点因账号与地区而异,原模板默认设置需按自己凭据可用模型核对,不要假设默认可用
- 服务账号必须被分享到有权限的两张Google Sheets,否则写入报权限错误而非校验失败
- 查日历空闲依赖正确的时区和工作时段配置,时区错误会把面试排在半夜
- 本站练习方案简化了原流的分支数量,完整四种通知路径需以原模板为准
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Screen and triage job applications with Gemini, Google Sheets, Slack and Gmail
- 原作者
- iamvaar
- 原始发布日期
- 2026-09-08T15:36:12.942Z
- 来源
- https://n8n.io/workflows/19400