מה יהיה לכם בסיום?
שורה אחת לכל חשבונית בגיליון Reviews: ספק, מספר, תאריך וסכומים, קישור לקובץ המקורי וסימון ברור של כל ערך חשוד.
מה להכין לפני שמתחילים
- סביבת n8n עם הרשאת ייבוא
- תיקיית Drive שאליה מגיעות חשבוניות PDF
- מפתח Gemini API בפרויקט Google AI Studio עם מכסה זמינה, הנשמר במנהל Credentials
- מי שעובר על הגיליון ומאשר כל שורה לפני הזנה למערכת הנהלת החשבונות
כלים ועלויות
צריך סביבת n8n וחשבון Google בעל הרשאת עריכה. n8n Cloud עשוי לדרוש תשלום לאחר תקופת הניסיון; באירוח עצמי יש עלות ותפעול שרת. כל חשבונית היא קריאה אחת ל-Gemini API, והמחיר תלוי במודל, במספר העמודים ובמסלול החשבון. בדקו מכסה ותמחור בפרויקט לפני שמריצים על תיקייה גדולה; מנוי לאפליקציית Gemini אינו מבטיח מכסת API.
מתחילים מדוגמה ברורה
השתמשו בנתוני הדוגמה לפני שמכניסים מידע מהעסק. הקלט והפלט כאן נועדו להמחיש את התרגיל.
הקלט
ארבע חשבוניות סינתטיות: אחת תקינה, אחת שבה הסכום הכולל אינו שווה לסכום לפני מע״מ ועוד מע״מ, אחת ללא תאריך שמספרה כבר קיים בגיליון, ואחת שתשובת המודל עבורה נקטעה. הטקסט שלהן נמצא ב-sample-invoices.md, וב-fixture.json יש את תשובות המודל המדומות שמשמשות לבדיקת ההיגיון.
התוצאה הצפויה
שלב אחר שלב
מכינים תיקייה, גיליון ותהליך
הורידו את הערכה. ב-Google Drive צרו תיקיית בדיקה ושמרו בה את ארבע החשבוניות מ-sample-invoices.md כקובצי PDF (העתיקו כל חשבונית למסמך והדפיסו ל-PDF). צרו Google Spreadsheet חדש וייבאו את Reviews.csv ללשונית בשם Reviews. ב-n8n פתחו תהליך חדש, בתפריט שלוש הנקודות בחרו Import from File ובחרו workflow.json. התהליך מגיע לא פעיל.
מחברים את Drive ואת Sheets
בכל צומת Google Sheets בחרו Credential to connect with והוסיפו Google Sheets OAuth2. ב-n8n Cloud התחברו לחשבון Google ואשרו גישה. באירוח עצמי הגדירו פרויקט Google Cloud, הפעילו Google Sheets API ו-Google Drive API, צרו OAuth client מסוג Web application והעתיקו אליו בדיוק את OAuth Redirect URL שמציג n8n. הזינו Client ID ו-Client Secret רק במסך Credentials. החליפו REPLACE_WITH_SPREADSHEET_ID במזהה שבכתובת המסמך, בין /d/ ל-/edit. בצומת List invoices החליפו REPLACE_WITH_INBOX_FOLDER_ID במזהה תיקיית הבדיקה, שמופיע בכתובת התיקייה אחרי /folders/. גם צמתי Drive צריכים credential של Google Drive OAuth2 באותו חשבון.
מגדירים את Gemini בלי לחשוף מפתח
בצומת AI extract בחרו Generic Credential Type ואז Header Auth. צרו credential עם Name: x-goog-api-key ו-Value שהוא מפתח Gemini API מ-Google AI Studio. המפתח נשמר רק ב-Credentials. הבקשה שולחת את קובץ ה-PDF עצמו ומבקשת JSON עם שמונה שדות בדיוק. ההנחיה למודל: להעתיק ערכים כפי שהם מודפסים, להחזיר null כשערך חסר או לא קריא, ולא לחשב או לתקן מספרים.
מבינים מה הקוד בודק
Check invoice מקבל את תשובת המודל ובודק אותה לפני שמירה: שהמבנה הוא בדיוק שמונת השדות, שמספר העוסק עובר בדיקת ספרת ביקורת, שהתאריך תקין ואינו בעתיד, שהמטבע ILS, שהסכום לפני מע״מ ועוד המע״מ שווה לסכום הכולל, ושהמע״מ קרוב ל-18% מהסכום שלפניו. ספק ומספר חשבונית שכבר קיימים בגיליון מסומנים possible_duplicate. כל בעיה נרשמת בעמודה flags והשורה מקבלת needs_attention; היא לא נעלמת ולא מתוקנת אוטומטית.
מריצים ובודקים מול התוצאה הצפויה
לחצו Execute workflow. Skip reviewed מדלג על קבצים שכבר יש להם שורה, ומטפל בעד 20 קבצים בכל הרצה. השוו את Reviews ל-expected.json: אותם סטטוסים ואותם סימונים. הסכומים צריכים להיות זהים למה שמודפס בחשבונית. אם המודל קרא ערך אחר, זה בדיוק מה שהבדיקה אמורה לתפוס, ולכן אל תשנו את הגיליון כדי שיתאים.
מוכיחים שהבדיקה עוצרת טעויות
בעותק בדיקה הוסיפו לפני Check invoice צומת Code שמחזיר תשובה מדומה עם total שגוי, וודאו שמתקבל total_mismatch. נסו גם מספר עוסק עם ספרה אחת שונה ותשובה עם שדה נוסף. החזירו את החיבור למודל בסוף. זו בדיקת כשל מכוונת; אין להציג את הפלט המדומה כתוצאת AI.
return [{json:{candidates:[{finishReason:"STOP",content:{parts:[{text:JSON.stringify({supplier_name:"ספק",supplier_tax_id:"514321769",invoice_number:"1",invoice_date:"2026-09-01",currency:"ILS",subtotal:100,vat:18,total:200})}]}}]}}];קובעים מי מאשר ומתי רץ
השורות הן טיוטה לבדיקה. מי שמאשר בודק מול הקובץ המקורי, מתקן בגיליון אם צריך וכותב את שמו ב-approved_by. רק שורה מאושרת עוברת להנהלת החשבונות, ידנית או בתהליך נפרד. כשהבדיקות עוברות אפשר להחליף את Manual test ב-Schedule Trigger, למשל פעם ביום, כי קובץ שכבר נבדק לא נשלח שוב למודל.
איך יודעים שזה עבד?
- ארבע שורות עם הסטטוסים והסימונים שב-expected.json.
- approved_by ריק בכל השורות; התהליך לא מאשר ולא מזין דבר להנהלת החשבונות.
- סכום כולל שגוי, מספר עוסק שגוי ושדה נוסף מסומנים ולא נשמרים כ-ready_for_review.
- הרצה חוזרת אינה שולחת שוב למודל קובץ שכבר יש לו שורה.
- כל שורה מקשרת לקובץ המקורי ב-Drive.
בדקו את התוצאה עצמה. הודעת הצלחה של הכלי לבדה לא מספיקה.
בדקתם את התוצאה בעצמכם?
אם ביצעתם את התרגיל ועברתם על הבדיקות, אפשר לסמן שהשלמתם. זהו דיווח שלכם, לא אימות נוסף של התוצאה.
כשמשהו לא עובד
List invoices מחזיר רשימה ריקה
בדקו את מזהה התיקייה ב-queryString, שהקבצים הם PDF אמיתי ולא קיצור דרך, ושהחשבון המחובר ל-n8n רואה את התיקייה.
שגיאת אימות, מכסה או גודל מ-Gemini
בדקו את Header Auth, את שם הכותרת x-goog-api-key ואת המכסה בפרויקט. קובץ גדול מדי נעצר עוד לפני השליחה; פצלו או דחסו אותו. AI extract ממשיך גם בשגיאה, והחשבונית תופיע עם ai_incomplete כדי שלא תאבד.
הרבה שורות מסומנות vat_rate_check
הבדיקה מניחה מע״מ 18%. חשבונית מעוסק פטור, חשבונית במטבע זר או חשבונית עם פריטים בשיעורים שונים תסומן, וזה תקין: אדם מחליט. אם שיעור המע״מ השתנה, עדכנו את VAT_RATE בצומת Check invoice.
חשבונית סרוקה ברזולוציה נמוכה נקראת חלקית
המודל אמור להחזיר null לערך שאינו קריא, והשורה תסומן missing. אל תוסיפו להנחיה בקשה לנחש. סרקו מחדש או הזינו את הערך ידנית.
הגיליון דוחה עמודה או מוסיף עמודות
השוו את הכותרות ל-Reviews.csv, כולל אותיות קטנות וקו תחתון. Handling extra fields מוגדר ל-Error כדי ששדה לא צפוי יעצור את ההרצה.
קחו את זה לעבודה
הערכה כוללת את הקבצים הבאים:
- הקמה, עלויות ובדיקת כשל
- תהליך n8n: Drive, Gemini, בדיקה ו-Sheets
- ארבע חשבוניות סינתטיות לשמירה כ-PDF
- כותרות גיליון הבדיקה ושורה קיימת
- תשובות מודל מדומות לבדיקת ההיגיון
- השורות המצופות
נרשמים לסדרת השיעורים השבועית, מאשרים באימייל ומקבלים גישה לכל ערכות העבודה. ההוראות והטקסטים בעמוד הזה נשארים פתוחים.
איך המדריך נבדק
- מצב הבדיקה
- טיוטה, האימות עדיין לא הושלם
- תאריך הרצה
- טרם תועדה הרצה מלאה
- נבדק על ידי
- טרם נקבע
- בדיקה חוזרת עד
- ייקבע לאחר האימות
שינוי מהותי בכלי עשוי לדרוש בדיקה מוקדמת יותר. שיעור ללא בדיקה בתוקף לא נשלח בסדרה השבועית.