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
具体怎么做
建触发与附件拆分
新建工作流,加Gmail触发节点(或用每小时定时+Gmail搜索),搜索条件填 filename:pdf has:attachment;其后加拆分逻辑把每封邮件的多个PDF附件变成逐条item循环处理,用一封带两个PDF的测试邮件确认循环条数正确。
上传Drive并提取文本
在循环内加Google Drive上传节点,folderId替换为你的测试文件夹ID;随后下载该文件并用PDF文本提取操作拿到纯文本,保存到字段如pdfText,检查输出里能看到发票文字而非乱码。
Gemini先分类后抽取
加第一个Gemini聊天节点,用下方分类提示词判断是否发票,接IF分支:否则调Drive删除节点删掉刚传的文件;是则进第二个Gemini节点,用下方抽取提示词加JSON schema,输出fatura_no、tarih、satici、toplam等抬头字段和kalemler明细数组。
写入两张表
加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