AI PLAY玩法更新持续收录
← 回到更新流

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

具体怎么做

  1. 建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。

  2. 配触发与拉信

    加Manual Trigger,接一个Code节点用$getWorkflowStaticData('static')存lastRunTimestamp。接Gmail节点Search Messages:查询条件subject:"purchase request" is:unread,上限5封。逐封规范化出raw_text(正文纯文本)和requester(From地址)。练习阶段先手动执行,确认能拉到测试邮件。

  3. Groq解析为严格JSON

    加LangChain链节点挂Groq Model节点,系统提示词粘贴下方材料。输出schema限定为{is_urgent, requester_note, items:[{item_name, quantity, target_spec}]}。后接Structured Output Parser节点强制校验;若解析报错,按文中排障建议把模型温度调低,或换严格遵循JSON的模型。

  4. 模糊匹配与定价

    Airtable节点读出Catalog全表,接Code节点做匹配:对每个申请item在Search Keywords/Item Name上算相似分,取最高分且>=0.3的候选(下方示例代码),命中则取Contract Price优先、否则Price,乘数量得行金额,累加po_total_cost;未命中标记unmatched。

  5. 三路分支落库

    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