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

2026-10-07 · 原文发布日

n8n用Gemini解析Gmail里的土耳其语发票PDF

处理发票邮件的n8n免费模板:每小时检查Gmail中带PDF附件的邮件,逐个把附件上传Google Drive再提取文本,先用Gemini判断是否为发票,不是就删掉文件,是就按结构化JSON schema提取发票抬头和明细行,分别写入Google Sheets的Faturalar和Kalem Detay两张表。需配置Gmail、Drive、Gemini、Sheets四个凭证并替换文件夹与表格ID。

原文要点

原模板为免费n8n工作流:每小时由Gmail触发器筛选含PDF附件的邮件(查询条件filename:pdf has:attachment),拆分附件逐个上传Google Drive指定文件夹,再下载提取PDF文本;先用Gemini判断是否发票,不是则删除Drive文件,是则按结构化JSON schema提取发票抬头与明细行,分别追加到Google Sheets的Faturalar(抬头)与Kalem Detay(明细)两个标签页。需配置Gmail、Drive、Gemini(PaLM)、Sheets四个OAuth2/API凭证并替换文件夹与表格ID。

这次做成什么

在n8n中搭建一条每小时扫描Gmail发票PDF、用Gemini提取土耳其语发票字段并写入两张Google Sheets标签页的小流程,并用一封虚构土耳其语发票邮件做端到端练习。

准备什么

  • 一个可登录的n8n实例(自托管或云版)且有添加凭证权限
  • Gmail、Google Drive、Google Sheets各自的OAuth2凭证已在n8n建好
  • Google Gemini(PaLM) API凭证及有效密钥
  • 一个Drive测试文件夹ID和含Faturalar、Kalem Detay两个标签页的测试表格ID

具体怎么做

  1. 建触发与附件拆分

    新建工作流,加Gmail触发节点(或用每小时定时+Gmail搜索),搜索条件填 filename:pdf has:attachment;其后加拆分逻辑把每封邮件的多个PDF附件变成逐条item循环处理,用一封带两个PDF的测试邮件确认循环条数正确。

  2. 上传Drive并提取文本

    在循环内加Google Drive上传节点,folderId替换为你的测试文件夹ID;随后下载该文件并用PDF文本提取操作拿到纯文本,保存到字段如pdfText,检查输出里能看到发票文字而非乱码。

  3. Gemini先分类后抽取

    加第一个Gemini聊天节点,用下方分类提示词判断是否发票,接IF分支:否则调Drive删除节点删掉刚传的文件;是则进第二个Gemini节点,用下方抽取提示词加JSON schema,输出fatura_no、tarih、satici、toplam等抬头字段和kalemler明细数组。

  4. 写入两张表

    加Google Sheets追加节点指向Faturalar页写入抬头字段;再加循环节点遍历kalemler数组,每条明细追加到Kalem Detay页并带上fatura_no外键,最后用测试邮件核对两表行数与金额一致。

可直接复制的材料

Gemini发票判定提示词(本站独立编写)

替换{{$json.pdfText}}为你流程中实际的文本字段名;模型与温度按原模板节点默认设置为准。

你是发票识别助手。下面是一段从PDF提取的土耳其语文本。只回答一个JSON对象,不要输出其他文字:{"is_invoice": true 或 false, "reason": "一句中文理由"}。判定标准:包含发票号(fatura no)、日期、卖方与买方、金额与税额等要素则视为发票;报价单、运单、广告不算。文本如下:
{{$json.pdfText}}

Gemini结构化抽取提示词与schema(本站独立编写)

字段为土耳其语发票常见要素的本站示例设计,Faturalar与Kalem Detay两表的列名需与此对应或自行改映射。

从以下土耳其语发票文本中提取信息,严格按此JSON schema输出,不要输出任何额外文字,找不到的字段填null:
{"fatura_no":"string","tarih":"YYYY-MM-DD","satici_unvan":"string","satici_vergi_no":"string","alici_unvan":"string","ara_toplam":number,"kdv":number,"genel_toplam":number,"para_birimi":"string","kalemler":[{"aciklama":"string","miktar":number,"birim_fiyat":number,"tutar":number}]}
发票文本:
{{$json.pdfText}}

测试用表格列结构配置

本站编写的列结构示例;列名以你自己的表格及实际导入的模板为准。

{
  "spreadsheetId": "替换为你的测试表格ID",
  "sheets": {
    "Faturalar": ["fatura_no", "tarih", "satici_unvan", "satici_vergi_no", "alici_unvan", "ara_toplam", "kdv", "genel_toplam", "para_birimi"],
    "Kalem Detay": ["fatura_no", "aciklama", "miktar", "birim_fiyat", "tutar"]
  },
  "driveFolderId": "替换为你的测试文件夹ID",
  "gmailQuery": "filename:pdf has:attachment"
}

输入与输出示例

本站虚构演示数据,金额按10×60+2×200=1000、KDV按18%推算,未真实调用Gemini。

输入

一封主题为"Fatura No: TR-2025-0417"的Gmail邮件,附件invoice.pdf提取文本含:Fatura No: TR-2025-0417,Tarih: 12.03.2025,Satici: Anadolu Ofis Malzemeleri Ltd.,Alici: Deniz Ticaret A.S.,Genel Toplam: 1.180,00 TL,明细两行:A4 kagit 10 x 60,00 TL、Toner kartus 2 x 200,00 TL。

对应输出

Gemini分类返回{"is_invoice":true};Faturalar新增一行:TR-2025-0417 | 2025-03-12 | Anadolu Ofis Malzemeleri Ltd. | Deniz Ticaret A.S. | 1000.00 | 180.00 | 1180.00 | TRY;Kalem Detay新增两行:(TR-2025-0417, A4 kagit, 10, 60.00, 600.00) 与 (TR-2025-0417, Toner kartus, 2, 200.00, 400.00)。

做完检查这些

  • 非发票PDF(如报价单)测试后Drive测试文件夹中该文件已被删除且两表无新增行
  • 一封含两个PDF的邮件产生两条独立循环,两表各自写入对应抬头与明细行
  • Kalem Detay中每条明细都带正确fatura_no,且明细tutar之和等于Faturalar中ara_toplam
  • Gmail查询条件只命中含PDF附件的邮件,纯文字邮件不会进入流程

容易卡住的地方

  • Gmail触发器默认频率与权限范围需允许读取附件,否则附件列表为空
  • 土耳其语数字用逗号作小数点(1.180,00),直接转数字会得到错误金额,需在写入前规范化
  • Gemini(PaLM)凭证未开通或地区受限时分类节点会直接报错中断循环
  • 节点名称与字段映射以实际导入的模板为准,自行搭建时可按上方步骤描述对照。
  • 若表格列顺序与写入映射不一致,会出现字段错位,先用一行测试数据核对

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Extract Turkish invoice data from Gmail PDFs with Google Gemini and Sheets
原作者
Onur Olgun
原始发布日期
2026-10-06T20:45:53.212Z
来源
https://n8n.io/workflows/20572