Last chance! 50% off DataCamp Premium
Sale ends in
L’inserimento manuale dei dati è il nemico della produttività. Se il tuo team si affida all’estrazione di dati da email operative, come fatture, conferme di prenotazione o moduli di feedback dei clienti, conosci bene l’incubo dei metodi di parsing tradizionali.
Storicamente, gli sviluppatori hanno fatto affidamento sulle espressioni regolari (Regex) per estrarre dettagli come numeri di fattura o importi di addebito. Ma le Regex sono estremamente fragili: al primo cambio del template dell’email da parte di un fornitore o all’aggiunta di un’interruzione di riga casuale, l’intero parser si rompe in silenzio.
In questo tutorial ti mostro come creare una pipeline completamente automatizzata e headless che risolve questo problema usando l’IA generativa. Scriveremo uno script leggero che legge i messaggi non letti di Gmail, passa il testo non strutturato alla Gemini API per un’estrazione intelligente e registra i dati JSON perfettamente strutturati direttamente in un Foglio Google.
Prerequisiti:
Google Apps Script è una piattaforma di sviluppo cloud-based e rapida, basata su JavaScript, che ti permette di automatizzare, personalizzare ed estendere le applicazioni Google Workspace come Documenti, Fogli, Presentazioni e altro.
Poiché la piattaforma gira direttamente sui server di Google, non c’è bisogno di installare software, configurare ambienti locali o gestire infrastrutture.
Apps Script offre a sviluppatori e low-code developer la possibilità di interagire in modo programmatico con gli strumenti di Google Workspace come Documenti, Fogli, Presentazioni, Drive e altro. Puoi creare ed eseguire automazioni tramite menu personalizzati, clic su pulsanti o pianificazioni temporali, oppure usare il servizio per creare e pubblicare componenti aggiuntivi sul Google Workspace Marketplace.
Google Apps Script astrae il lavoro pesante della configurazione backend e dell’autenticazione API, permettendoti di concentrarti direttamente su logica e dati. Lo fa tramite diverse funzionalità:
Prima di scrivere lo script, mappiamo il flusso dei dati attraverso questa pipeline. L’architettura si basa su quattro componenti distinti che lavorano insieme:

Il vantaggio principale è l’eliminazione completa dell’overhead infrastrutturale. Non serve alcun provisioning di server e non devi configurare container Docker o impostare flussi OAuth complicati solo per leggere le tue email o scrivere in un foglio di calcolo.
Poiché Apps Script si integra nativamente con servizi come GmailApp e SpreadsheetApp, Google gestisce l’autenticazione internamente. Devi solo scrivere il codice e collegare gli endpoint.
Prima di scrivere il codice, dobbiamo preparare le dipendenze esterne. Questo include ottenere l’accesso alla Gemini API, creare il foglio di destinazione e configurare la posta in arrivo di Gmail per etichettare correttamente le fatture in arrivo.
Per alimentare la nostra estrazione intelligente dei dati, ci serve l’accesso alla Gemini API.
Buona prassi di sicurezza: non perdere questa chiave e, soprattutto, non pensare di inserirla in chiaro nel tuo codice. Tienila negli appunti o in un notepad sicuro per ora; nel prossimo passaggio la metteremo al sicuro all’interno del nostro ambiente Apps Script.

Ci serve un posto dove archiviare i dati estratti. Questo foglio fungerà anche da base di lancio per il nostro script di automazione.
Blocca la prima riga così le intestazioni restano visibili man mano che i dati crescono.



GEMINI_API_KEY.
Il codice che scriveremo più avanti ora potrà recuperare in modo sicuro questo valore a runtime senza esporre le tue credenziali.
Mentre ti trovi nell’editor di Apps Script, elimina pure qualsiasi codice predefinito. Costruiremo il nostro motore di automazione blocco per blocco.
Iniziamo definendo un oggetto di configurazione globale. È una buona pratica di clean code che raggruppa tutte le variabili hardcoded in un unico posto, così dovrai modificare solo questo blocco iniziale.
Aggiungiamo anche una funzione onOpen(). Questo trigger integrato di Apps Script crea automaticamente un menu personalizzato nel tuo Foglio Google, permettendo agli utenti non tecnici di eseguire lo script manualmente senza aprire l’editor del codice.
const CONFIG = {
searchQuery: "is:unread label:invoices",
model: "gemini-2.5-flash",
adminEmail: Session.getActiveUser().getEmail() // Automatically emails the script owner if it crashes
};
/**
* Creates a custom menu in Google Sheets so non-technical users can run the script manually.
*/
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('🤖 AI Automations')
.addItem('Fetch New Invoices', 'processInvoices')
.addToUi();
}
La funzione processInvoices() funge da orchestratore principale. Inizia recuperando in modo sicuro la tua chiave API dalle Proprietà script che abbiamo impostato in precedenza.
Poi usa il servizio integrato GmailApp per interrogare la tua casella di posta.
Chiamando GmailApp.search(CONFIG.searchQuery), lo script recupera un array di thread email che corrispondono alla nostra regola is:unread label:invoices.
Se trova corrispondenze, scorre ogni thread, prende il messaggio più recente, estrae il corpo in testo semplice e isola eventuali PDF allegati.
function processInvoices() {
const apiKey = PropertiesService.getScriptProperties().getProperty("GEMINI_API_KEY");
if (!apiKey) {
throw new Error("GEMINI_API_KEY is missing! Please set it in Script Properties.");
}
const threads = GmailApp.search(CONFIG.searchQuery);
if (threads.length === 0) return;
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const batchData = [];
const processedThreads = [];
Mentre scorriamo i thread email, prendiamo il messaggio più recente. Tuttavia, le fatture raramente arrivano come testo semplice; quasi sempre sono allegate come PDF.
Sfruttando Gemini 2.5 Flash, che è nativamente multimodale, il nostro script scorre latestMessage.getAttachments(), rileva eventuali PDF, li converte in una stringa Base64 e li passa direttamente al payload dell’API come inlineData.
Gemini “legge” visivamente il PDF ed estrae i dati con la stessa facilità con cui legge il testo.
for (let i = 0; i < threads.length; i++) {
const thread = threads[i];
const latestMessage = thread.getMessages().pop();
const emailBody = latestMessage.getPlainBody();
const emailDate = latestMessage.getDate();
const emailLink = https://mail.google.com/mail/u/0/#inbox/${thread.getId()};
const attachments = latestMessage.getAttachments();
try {
const geminiParts = [];
geminiParts.push({ text: "Extract invoice details from this email and any attached documents:\n\n" + emailBody });
// Add PDF attachments as base64 to the prompt
for (const attachment of attachments) {
if (attachment.getContentType() === "application/pdf") {
geminiParts.push({
inlineData: {
mimeType: "application/pdf",
data: Utilities.base64Encode(attachment.getBytes())
}
});
}
}
// Invoke Gemini API
const extractedData = callGeminiAPI(apiKey, geminiParts);
Per ottimizzare le prestazioni, non scriviamo nel foglio di calcolo una riga alla volta.
Invece, inseriamo i dati JSON estratti in un array (batchData) e li scriviamo tutti in una volta sola alla fine usando setValues().
Nota il blocco try...catch.
Se Gemini allucina o fallisce su una specifica email, lo script non va in crash completo. Invece, intercetta l’errore in modo elegante e usa MailApp.sendEmail() per avvisare immediatamente l’amministratore, garantendo un’elevata osservabilità.
// Push to batch array instead of writing one-by-one
batchData.push([
emailDate,
extractedData.vendor || "Unknown Vendor",
extractedData.invoiceNumber || "N/A",
extractedData.totalAmount || 0.00,
extractedData.currency || "USD",
extractedData.itemsSummary || "N/A",
emailLink
]);
processedThreads.push(thread);
} catch (error) {
MailApp.sendEmail(CONFIG.adminEmail, "🚨 Invoice Pipeline Error", error.toString());
}
}
// Batch Write to Sheets
if (batchData.length > 0) {
const lastRow = Math.max(sheet.getLastRow(), 1);
sheet.getRange(lastRow + 1, 1, batchData.length, batchData[0].length).setValues(batchData);
}
// Mark all processed threads as read so they aren't parsed again
processedThreads.forEach(t => t.markRead());
}
Infine, lo script chiama thread.markRead() su ogni email elaborata. Questo garantisce che alla successiva esecuzione lo script ignori completamente queste email e cerchi solo quelle nuove.
Quando si chiamano LLM, gli sviluppatori spesso usano il prompt engineering tipo “Restituisci un blocco JSON”. Tuttavia, i modelli rispondono frequentemente con riempitivi conversazionali (ad es. “Certo, ecco i tuoi dati: [JSON]”), cosa che fa andare in crash i parser a valle.
Impostando responseMimeType: "application/json" e fornendo uno responseSchema rigoroso, forziamo la Gemini REST API a rispondere solo con un oggetto JSON garantito contenente le nostre esatte intestazioni di colonna del foglio di calcolo.
function callGeminiAPI(apiKey, partsArray) {
const url = https://generativelanguage.googleapis.com/v1beta/models/${CONFIG.model}:generateContent?key=${apiKey};
const responseSchema = {
type: "OBJECT",
properties: {
vendor: { type: "STRING" },
invoiceNumber: { type: "STRING" },
totalAmount: { type: "NUMBER" },
currency: { type: "STRING" },
itemsSummary: { type: "STRING" }
},
required: ["vendor", "totalAmount"]
};
const payload = {
contents: [{ parts: partsArray }],
generationConfig: {
responseMimeType: "application/json",
responseSchema: responseSchema
}
};
const options = {
method: "POST",
contentType: "application/json",
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(url, options);
const jsonResponse = JSON.parse(response.getContentText());
return JSON.parse(jsonResponse.candidates[0].content.parts[0].text);
}
Il codice è utile solo se ti semplifica la vita.
Google Apps Script offre potenti ambienti di esecuzione che vanno da pulsanti interattivi e orientati all’utente a cron job completamente headless in background.
Se stai creando questo strumento per un team contabile non tecnico, probabilmente non vorranno aprire l’editor di codice di Apps Script solo per elaborare le fatture di oggi.
Poiché abbiamo incluso la funzione onOpen() nel nostro codice, Apps Script collega automaticamente un menu personalizzato direttamente nell’interfaccia di Google Sheets ogni volta che il foglio di calcolo viene aperto.

Se vuoi una vera automazione imposta e dimentica, puoi usare i trigger nativi Time-Driven per eseguire la pipeline in autonomia in background.



La tua pipeline AI headless è ora completamente autonoma.
Anche con il computer completamente spento, i server di Google si “sveglieranno” ogni sei ore, eseguiranno la scansione della posta in arrivo, pareranno le fatture con Gemini, registreranno i dati in Sheets e torneranno in standby.
Puoi monitorare l’esito di queste esecuzioni in background facendo clic sulla scheda Esecuzioni nell’editor di Apps Script per visualizzare i log.
Ora che il codice è pronto, dobbiamo testarlo per assicurarci che la pipeline di estrazione funzioni come previsto.
Vediamo due scenari pratici per capire come la Gemini API gestisce diversi formati di dati e come appaiono le risposte effettive.
Per prima cosa testeremo una fattura incorporata direttamente nel corpo dell’email.


Dietro le quinte, Gemini riceve questo testo non strutturato e rispetta rigorosamente il nostro schema JSON.
Invece di rispondere con riempitivi conversazionali, restituisce un payload grezzo.
Poiché la risposta è JSON perfettamente strutturato, il nostro array batchData.push() legge senza problemi extractedData.totalAmount e registra 6550 direttamente nel Foglio Google senza bisogno di complessa logica Regex.

Ora testiamo la vera potenza di Gemini 2.5 Flash passandogli un documento PDF.


È qui che l’architettura dimostra il suo valore.
Non hai dovuto scrivere logica OCR (riconoscimento ottico dei caratteri) personalizzata, gestire una libreria separata per il parsing dei PDF o scrivere espressioni regolari per trovare l’importo totale.
L’LLM ha gestito i dati visivi non strutturati in modo nativo.
Automatizzare i flussi di lavoro aziendali non richiede la gestione di infrastrutture pesanti o la lotta con loop di autorizzazione complessi.
Abbinando Google Apps Script alla Gemini API, abbiamo costruito una pipeline di dati intelligente e serverless che gira interamente nel cloud che già usi ogni giorno.
La forza di questa architettura sta nella sua semplicità. Invece di fare il provisioning di server, configurare webhook o gestire file di credenziali sicuri su un server esterno, Apps Script gestisce nativamente contesto, autenticazione ed esecuzione.
Nel frattempo, Gemini elimina la necessità di espressioni regolari fragili o software OCR costosi, trasformando corpi email disordinati e PDF non strutturati in righe di database prevedibili con una singola chiamata API.
Per approfondire le tue competenze ed esplorare cos’altro puoi costruire con l’accesso programmatico agli LLM, ti consiglio di dare un’occhiata a Introduction to APIs in Python di DataCamp o di immergerti nella progettazione di workflow intelligenti con il corso AI Agent Fundamentals .
Scrivo e creo su internet. Google Developer Expert per Google Workspace, laureato in Informatica alla NMIMS e appassionato di automazione e di tecnologie di IA generativa.
I migliori corsi DataCamp
{count, plural, one {Corso} other {Corsi}}
{count, plural, one {Corso} other {Corsi}}
{count, plural, one {Corso} other {Corsi}}

{count, plural, one {blog} other {blogs}}
Abid Ali Awan
15 min
{count, plural, one {blog} other {blogs}}
Tim Lu
12 min

{count, plural, one {blog} other {blogs}}
Abid Ali Awan
10 min