2026-10-12 · 原文发布日
收据邮件自动识别、登记与超额审批
免费n8n模板:每分钟监听Gmail里带附件的收据/发票邮件,把附件图片发给Google Gemini提取商户、日期、金额、税额、币种、类目等字段成JSON,校验后生成报销ID写入Google Sheets。超过设定限额(默认500)的在Slack财务频道发待审批提醒,无论是否超额都给员工回一封已受理邮件。每月定时汇总表格数据,算出总额、分类与员工维度统计,经Gmail发月度报告给财务。
原文要点
这是n8n.io上的免费报销收据处理模板:Gmail触发器每分钟轮询匹配receipt/invoice/expense关键词且带附件的邮件,下载第一个附件(attachment_0)送Google Gemini提取商户、日期、金额、税额、币种、类目、支付方式等字段为JSON;解析校验后以Gmail发件人作为员工兜底,生成报销ID,按ID为匹配键追加或更新到Google Sheets;金额超过限额(模板默认500)时向Slack财务频道发待审批提醒,无论是否超额都给员工回一封已受理邮件。另有每月定时分支读取全表,计算总额、税额、均值、分类与员工维度统计及最高单笔,经Gmail发月度报告(模板收件人默认为user@example.com需替换)。
这次做成什么
搭一条收据邮件自动登记流程:Gemini识别附件→校验→写表→超额走Slack审批→回复员工→月末汇总报告。本站给出表格结构、识别提示词与一条完整测试数据,可在测试邮箱与测试表格上跑通。
准备什么
- n8n实例及Gmail凭据(既要触发读邮件也要发邮件权限)
- Google Sheets凭据与一张测试报销表
- Google Gemini(PaLM/Gemini API)凭据,识别调用会产生费用
- Slack凭据与一个测试财务频道
- 一个可收发测试邮件的邮箱,用于充当员工与财务收件人
具体怎么做
建报销表与配置Gmail触发
在Google Sheets建表,列依次为Expense ID、Employee、Vendor、Receipt Date、Amount、Tax、Currency、Category、Payment Method、Over Limit、Approval Status、Validation Status、Processed At。Gmail Trigger保持每分钟轮询,查询条件包含receipt或invoice或expense且has:attachment,确保测试邮件主题带“receipt”字样并有图片附件。
Gemini识别附件
触发后下载附件,流程默认取attachment_0(第一个附件)。把图片送入Gemini节点,用下方提示词要求只返回JSON。若你的收据邮件常有多个附件,需在节点里调整二进制属性名或先加筛选。
解析校验与写表
解析Gemini返回的JSON:缺关键字段或金额非数字时把Validation Status置为failed并不写正式记录。校验通过后生成报销ID(本站练习方案:EXP-日期-邮件ID后6位),Employee优先取JSON里的员工名,否则用Gmail发件人地址兜底;Amount大于限额(模板默认500,可在校验节点改)时Over Limit=true。用Expense ID作为匹配键追加或更新到表格,避免同一邮件重复执行产生重复行。
分支通知
Over Limit=true的分支向Slack财务频道发待审批消息(含报销ID、员工、商户、金额),Approval Status置为pending;两条分支都用Gmail节点给员工回一封已受理邮件,内容含报销ID、识别金额与是否需要审批。
月度汇总报告
保留月度的Schedule Trigger分支:读取全表,计算总金额、总税额、平均单笔、按Category与按Employee的汇总、最高单笔记录,拼成正文后用Gmail发给财务邮箱。务必把模板里默认的user@example.com换成你的测试财务收件地址。
可直接复制的材料
收据字段提取提示词(Gemini用)
本站独立编写的示例提示词;原模板内的提取指令以模板节点为准,可按此对照补全。
请从这张收据或发票图片中提取信息,只输出JSON,不要输出任何其他文字或代码块标记:
{"vendor":"商户名称","receipt_date":"YYYY-MM-DD","amount":含税总金额的数字,"tax":税额数字,无税额则为0,"currency":"CNY|USD|其他币种代码","category":"餐饮|交通|住宿|办公|其他","payment_method":"现金|信用卡|支付宝|微信|其他","employee":"单据上出现的员工姓名,没有则为空"}
无法确定的字段留空字符串或0,不要编造数字。报销表首行测试数据(手工预置或流程写入后的对照基准)
本站虚构测试数据:一行超额(680>500)走审批,一行未超额自动通过,用于核对两个分支都工作。
Expense ID,Employee,Vendor,Receipt Date,Amount,Tax,Currency,Category,Payment Method,Over Limit,Approval Status,Validation Status,Processed At
EXP-20261012-a1b2c3,li.test@example.com,锦江之星测试酒店,2026-10-10,680.00,38.49,CNY,住宿,信用卡,true,pending,passed,2026-10-12T09:05:00
EXP-20261012-d4e5f6,wang.test@example.com,测试连锁咖啡,2026-10-11,45.00,2.55,CNY,餐饮,支付宝,false,auto_approved,passed,2026-10-12T09:06:00员工已受理回信模板(Gmail节点正文)
本站独立编写的中文回信示例,双花括号字段替换为流程变量;模板默认英文回信可在节点中替换。
主题:报销已受理 {{Expense ID}}
正文:
您好,您的报销已登记:
报销编号:{{Expense ID}}
商户:{{Vendor}}
日期:{{Receipt Date}}
金额:{{Currency}} {{Amount}}(含税 {{Tax}})
状态:{{Over Limit为true则显示“超过限额,已提交财务审批”;否则显示“限额内,已自动受理”}}
如信息有误请回复本邮件说明。输入与输出示例
本站虚构演示,未真实调用Gemini,金额与字段一一对应,仅说明期望行为。
输入
测试邮箱收到一封主题“10月住宿receipt”的邮件,发件人li.test@example.com,附件为一张虚构酒店收据图片:锦江之星测试酒店,2026-10-10,含税680.00元,税额38.49元,信用卡支付。限额保持默认500。对应输出
Gemini返回JSON {vendor:"锦江之星测试酒店",receipt_date:"2026-10-10",amount:680.00,tax:38.49,currency:"CNY",category:"住宿",payment_method:"信用卡"};表格新增一行Expense ID=EXP-20261012-xxxxxx,Over Limit=true,Approval Status=pending;Slack财务频道收到“报销EXP-20261012-xxxxxx(li.test@example.com,住宿,¥680.00)超限额,待审批”;li.test@example.com收到含该编号与金额的已受理回信。月末分支汇总时该行计入住宿类680.00并列为当月最高单笔之一。做完检查这些
- 发送带图片附件的测试收据邮件后一分钟内触发器命中,表格新增一行且Expense ID唯一
- 同一封邮件被重复处理时按Expense ID更新而非新增重复行
- 金额680.00(>500)走Slack审批分支,金额45.00走直接回信分支,两条路径都能收到员工回信
- Gemini返回缺字段或金额无法解析时Validation Status=failed且不污染正式统计
- 月度分支手动执行一次,财务测试邮箱收到含总额、税额与分类汇总的邮件
容易卡住的地方
- 模板月报收件人默认为user@example.com,不替换会发丢或报错
- 流程只分析attachment_0,多附件邮件的首附件若不是收据图会识别失败
- Gmail查询条件若与实际收件习惯不符(如公司用“报销”而非receipt)会漏邮件,需改查询串
- 限额500是模板默认值,币种混合时直接比较数字会失真,正式使用前应统一币种
- Gemini识别可能出错,超额审批环节不应省略人工确认
- Gemini API与Gmail/Slack的用量可能产生费用,免费仅指模板文件本身
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Track and approve expense receipts with Gmail, Google Gemini, Sheets and Slack
- 原作者
- WeblineIndia
- 原始发布日期
- 2026-10-12T05:33:34.154Z
- 来源
- https://n8n.io/workflows/20785