2026-10-03 · 原文发布日
n8n模板:从采购申请邮件自动生成采购单
免费n8n模板:拉取主题含purchase request的未读Gmail邮件,用Groq上的模型把自由文本解析成含紧急度和明细数量的结构化JSON,再与Airtable商品目录模糊匹配,套用量身价格、供应商并算出总金额。全部匹配且非紧急的自动在Airtable生成已批准采购单并写Google Sheets审批日志;匹配失败或加急的则建待人工处理或待加急审核的记录。匹配严格度、解析提示词、换模型节点的方法文中都有说明。
原文要点
该免费n8n模板(WeblineIndia发布)手动启动后用$getWorkflowStaticData记录本次运行时间戳供下次增量拉取,从Gmail取最多5封主题含“purchase request”的未读邮件,规范化出申请正文和申请人地址。经n8n的LangChain集成送Groq聊天模型,按严格JSON schema解析出紧急度和明细数量;再从Airtable加载商品目录做模糊匹配,套用SKU、首选供应商、合同价/标准价并算出采购单总额。路由规则:有匹配失败项进Pending Triage,标记加急进Pending Urgent Review,全部匹配且非加急的写Google Sheets审批日志并在Airtable upsert一条“Approved - Auto”采购单。作者给出的自定义点:Code节点里把匹配阈值0.3提到0.5-0.6更严;解析提示词可教模型识别项目代码、成本中心;Groq节点可换成OpenAI/Anthropic/Ollama。文中排障表建议温度调低或换严格JSON模型应对解析失败。
这次做成什么
重建一条“邮件申请→AI解析→目录匹配→自动开单或分流”的采购自动化流程。原模板需到n8n模板页导入,本指南给出独立重建步骤、可粘贴的解析提示词、合成目录数据和匹配阈值示例代码,并提醒:静态数据时间戳只在工作流正式激活后跨执行保留,手动测试会重复拉信。
准备什么
- n8n实例,Gmail OAuth2凭据,且申请邮件保持未读且主题含“purchase request”
- Groq API key(或按文中方法换成OpenAI/Anthropic/Ollama节点)
- Airtable账号:一张商品目录表(含Search Keywords或Item Name、SKU、Vendor、Price、可选Contract Price、可选Preferred Rank)和一张采购单目标表
- Google Sheets凭据及一张审批日志表,列名固定为Date、Total Cost、Matched SKUs、Vendors、Status
具体怎么做
建Airtable目录与日志表
在Airtable建Catalog表,列:Item Name、Search Keywords、SKU、Vendor、Price、Contract Price、Preferred Rank,先按下方合成CSV填6-8行,Search Keywords多写同义词(文中排障表指出关键词不对齐是全部进人工的首要原因)。再建Purchase Orders表,列含PO编号、申请人、明细、总额、Status。Google Sheets建审批日志,列名严格用Date、Total Cost、Matched SKUs、Vendors、Status。
配触发与拉信
加Manual Trigger,接一个Code节点用$getWorkflowStaticData('static')存lastRunTimestamp。接Gmail节点Search Messages:查询条件subject:"purchase request" is:unread,上限5封。逐封规范化出raw_text(正文纯文本)和requester(From地址)。练习阶段先手动执行,确认能拉到测试邮件。
Groq解析为严格JSON
加LangChain链节点挂Groq Model节点,系统提示词粘贴下方材料。输出schema限定为{is_urgent, requester_note, items:[{item_name, quantity, target_spec}]}。后接Structured Output Parser节点强制校验;若解析报错,按文中排障建议把模型温度调低,或换严格遵循JSON的模型。
模糊匹配与定价
Airtable节点读出Catalog全表,接Code节点做匹配:对每个申请item在Search Keywords/Item Name上算相似分,取最高分且>=0.3的候选(下方示例代码),命中则取Contract Price优先、否则Price,乘数量得行金额,累加po_total_cost;未命中标记unmatched。
三路分支落库
If节点判断:存在unmatched→Airtable创建Status=Pending Triage的PO记录;is_urgent=true→Status=Pending Urgent Review;否则先Google Sheets追加一行审批日志(Date、Total Cost、Matched SKUs、Vendors、Status=Approved - Auto),再Airtable upsert一条Approved - Auto采购单。跑通后可把Manual Trigger换成Schedule Trigger并正式激活,让时间戳增量生效。
可直接复制的材料
Groq解析系统提示词(本站独立撰写)
本站独立撰写,非原模板提示词;可在此基础上教模型识别你公司的项目代码格式。Groq调用按官方计费。
你是采购申请解析助理。把一封自由文本采购申请邮件解析为严格JSON,不输出任何其他文字。
schema:{"is_urgent":true或false,"requester_note":"40字内概括申请人意图","items":[{"item_name":"物品通用名","quantity":整数,"target_spec":"品牌/规格偏好,无则空字符串"}]}
规则:邮件中出现URGENT、加急、今天必须等表述时is_urgent为true;数量缺失默认1;物品名用通用名而不是品牌名(如“无线鼠标”而非“MX Master”);若邮件含项目代码或成本中心编号,原样放入requester_note末尾。无法解析时返回{"is_urgent":false,"requester_note":"无法解析","items":[]}。Airtable Catalog合成数据
本站合成数据,金额为人民币示例;Preferred Rank用于多候选时优先取排名小的供应商。
Item Name,Search Keywords,SKU,Vendor,Price,Contract Price,Preferred Rank
无线鼠标,无线鼠标 mouse 鼠标 罗技,IT-MOUSE-01,Acme办公,45.00,38.50,1
A4打印纸,A4 打印纸 paper 复印纸,OF-PAPER-A4,晨光供应链,22.00,,1
白板笔,白板笔 马克笔 whiteboard marker,OF-MARKER-01,晨光供应链,3.50,3.00,1
咖啡豆,咖啡豆 coffee 中度烘焙,OF-COFFEE-01,城市烘焙坊,88.00,,2
显示器27寸,显示器 27寸 monitor 2K,IT-MON-27,Acme办公,1299.00,1150.00,1匹配阈值示例代码(本站编写)
本站独立简化版,仅演示阈值与合同价优先逻辑;原模板打分算法未公开,0.3阈值路由行为出自原文,可按原文建议上调到0.5-0.6。
// Code: Match & Price Logic(简化版)
const catalog = $('Airtable: Read Catalog').all().map(i => i.json);
const parsed = $json; // Groq解析结果
const sim = (a, b) => { // 简化的包含式打分:命中关键词数/关键词总数
const kws = (b['Search Keywords'] || '').split(/\s+/);
const hit = kws.filter(k => k && a.toLowerCase().includes(k.toLowerCase()));
return hit.length / Math.max(kws.length, 1);
};
let total = 0; const matched = []; const unmatched = [];
for (const it of parsed.items) {
let best = null, score = 0;
for (const c of catalog) { const s = sim(it.item_name, c); if (s > score) { score = s; best = c; } }
if (score >= 0.3 && best) { // 想更严格改成0.5或0.6
const price = Number(best['Contract Price'] || best['Price']);
total += price * it.quantity;
matched.push({ ...it, sku: best.SKU, vendor: best.Vendor, unit_price: price, score: Number(score.toFixed(2)) });
} else unmatched.push(it);
}
return [{ json: { is_urgent: parsed.is_urgent, matched, unmatched, po_total_cost: Number(total.toFixed(2)) } }];输入与输出示例
本站虚构演示,未实际调用Groq;真实分数取决于你的打分算法和目录关键词覆盖度。
输入
测试邮件主题“purchase request - 市场部”,正文:“请帮忙采购:无线鼠标2个(最好罗技)、A4打印纸10包、展会定制易拉宝3套。不急。”对应输出
Groq解析示意:{"is_urgent":false,"requester_note":"采购鼠标打印纸和易拉宝","items":[{"item_name":"无线鼠标","quantity":2,"target_spec":"罗技"},{"item_name":"A4打印纸","quantity":10,"target_spec":""},{"item_name":"展会定制易拉宝","quantity":3,"target_spec":""}]}。匹配结果:鼠标命中IT-MOUSE-01按合同价38.50×2=77.00,打印纸命中OF-PAPER-A4按22.00×10=220.00,易拉宝目录无此项且得分低于0.3进入unmatched,po_total_cost仅对已匹配项计297.00。因存在unmatched,路由到Pending Triage:Airtable新建一条待人工处理PO记录,不写自动审批日志。做完检查这些
- 全部匹配且非加急的申请在Google Sheets日志中出现一行,Total Cost与手工用目录价重算一致,Airtable出现Status=Approved - Auto的记录
- 含未匹配物品的申请一定进Pending Triage且不会产生Approved - Auto记录或审批日志
- 含URGENT字样的申请即使全部匹配也进Pending Urgent Review而不是自动批准
- 正式激活后第二次运行只处理新邮件,不重复开单(手动测试重复拉信属已知行为)
- 把阈值从0.3调到0.5后,边缘措辞的申请被更多地送进人工队列
容易卡住的地方
- $getWorkflowStaticData只在工作流正式激活后跨执行保留,手动测试期间会重复处理同一批邮件,别据此判断去重失效
- Search Keywords与员工日常措辞不对齐会让所有申请进人工,先按排障表补同义词再考虑降阈值
- LLM可能输出schema以外的内容,务必用Structured Output Parser并调低温度,别在下游直接信任裸文本
- 金额阈值护栏(如超过1000美元强制经理审批)是原文的扩展建议,模板本身没有,需要自己加If节点
- 合同价字段为空时若不做回退会用0元计价,示例代码里的Contract Price||Price回退必须保留
- Groq模型可用性以你账号为准;换OpenAI/Anthropic/Ollama时要同步检查输出parser兼容性
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Create purchase orders from Gmail using Groq LLM, Airtable, and Google Sheets
- 原作者
- WeblineIndia
- 原始发布日期
- 2026-10-03T11:38:55.136Z
- 来源
- https://n8n.io/workflows/20378