Din ”source of truth” är förmodligen ett Google Sheet som började enkelt, och sedan i det tysta blev en skör röra. En trasig formel, ett copy-paste-misstag, en flik som någon ”städade upp”, och plötsligt stämmer inte dina totalsummor med det ekonomi förväntar sig.
Det är här Sheets to Postgres-automation snabbt ger effekt. Marknadsleads slutar bråka med ops om siffror. Företagsägare får samma svar två gånger i rad. Och analytiker som är trötta på kalkylblads-whack-a-mole får äntligen ett felfritt rapporteringslager.
Det här arbetsflödet flyttar strukturerad data från Google Sheets (eller CSV) till PostgreSQL, och låter dig sedan ställa frågor på enkel svenska och få konsekventa totalsummor tillbaka. Du får se vad det automatiserar, vad du får ut av det och hur du undviker de vanligaste fallgroparna vid uppsättning.
Så fungerar den här automatiseringen
Hela n8n-arbetsflödet, från trigger till slutligt resultat:
n8n Workflow Template: Google Sheets till PostgreSQL, svar du kan lita på
flowchart LR
subgraph sg0["Google Drive Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>create table query"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>create insertion query"]
n2@{ icon: "mdi:play-circle", form: "rounded", label: "Google Drive Trigger", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "change_this", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "is not in database", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/postgres.svg' width='40' height='40' /></div><br/>table exists?"]
n9@{ icon: "mdi:database", form: "rounded", label: "fetch sheet data", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/postgres.svg' width='40' height='40' /></div><br/>remove table"]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/postgres.svg' width='40' height='40' /></div><br/>create table"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/postgres.svg' width='40' height='40' /></div><br/>perform insertion"]
n6 --> n8
n11 --> n1
n10 --> n0
n8 --> n9
n9 --> n7
n0 --> n11
n7 --> n0
n7 --> n10
n2 --> n6
n1 --> n12
end
subgraph sg1["When chat message received Flow"]
direction LR
n3@{ icon: "mdi:wrench", form: "rounded", label: "execute_query_tool", pos: "b", h: 48 }
n4@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n5@{ icon: "mdi:wrench", form: "rounded", label: "get_postgres_schema", pos: "b", h: 48 }
n14@{ icon: "mdi:play-circle", form: "rounded", label: "When chat message received", pos: "b", h: 48 }
n19@{ icon: "mdi:robot", form: "rounded", label: "AI Agent With SQL Query Prompt", pos: "b", h: 48 }
n3 -.-> n19
n5 -.-> n19
n4 -.-> n19
n14 --> n19
end
subgraph sg2["Execute Workflow Flow"]
direction LR
n13@{ icon: "mdi:play-circle", form: "rounded", label: "Execute Workflow Trigger", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "response output", pos: "b", h: 48 }
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/postgres.svg' width='40' height='40' /></div><br/>sql query executor"]
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/postgres.svg' width='40' height='40' /></div><br/>schema finder"]
n18["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>schema to string"]
n17 --> n18
n16 --> n15
n13 --> n16
n13 --> n17
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n2,n14,n13 trigger
class n19 ai
class n4 aiModel
class n3,n5 ai
class n7 decision
class n8,n9,n10,n11,n12,n16,n17 database
class n0,n1,n18 code
classDef customIcon fill:none,stroke:none
class n0,n1,n8,n10,n11,n12,n16,n17,n18 customIcon
Problemet: kalkylbladssiffror du inte kan stå för
Google Sheets är utmärkt för att samla in data. Det är mindre bra när det ska granskas som en databas, särskilt när frågorna blir specifika. ”Total försäljning förra veckan” låter enkelt tills datum är inkonsekvent formaterade, en kolumnrubrik ändras eller ett filter lämnas på. Då jagar du felet mellan flikar, fixar formler och försöker minnas vilken version av arket som var ”rätt” för förra månadens rapport. Det värsta är att förtroendet urholkas: även när siffran ser rätt ut kan du inte fullt ut bevisa det.
Det blir snabbt mycket. Här är var det ofta havererar i riktiga team.
- Små formeländringar sprider sig i arket, vilket gör att gårdagens totalsummor mystiskt ändras i dag.
- Två personer bygger två olika pivottabeller, och du slösar en timme på att bara diskutera definitioner.
- När någon ställer en ny fråga hamnar du i manuell filtrering och omkontroll av beräkningar i stället för att svara.
- Att dela en kalkylbladslänk känns ”enkelt”, men det bjuder också in till oavsiktliga ändringar och tysta fel.
Lösningen: lägg kalkylbladsdata i PostgreSQL och ställ sedan frågor
Det här n8n-arbetsflödet tar den strukturerade data du redan har i Google Sheets (eller en CSV) och gör om den till en riktig rapporteringsdatabas i PostgreSQL. När en fil ändras i Google Drive hämtar arbetsflödet de senaste raderna, granskar kolumnrubrikerna och bygger den SQL som behövs för att skapa en matchande tabell. Om tabellen inte finns skapar det den. Om den finns kan det bygga om den och fylla på igen så att databasen speglar arket. Sedan, i stället för att skriva SQL, ställer du en fråga på naturligt språk i chatten. En AI-agent översätter frågan till en SQL-fråga, kör den mot PostgreSQL och returnerar resultatet med den hastighet och konsekvens du förväntar dig av en databas.
Arbetsflödet startar med en Google Drive-trigger (eller manuell körning) för att hämta ditt Sheet/CSV. Det bygger schema-medveten SQL, skapar eller uppdaterar en PostgreSQL-tabell och lägger in raderna. Till sist routar en chatt-trigger din fråga till en AI SQL-agent, som frågar PostgreSQL och formaterar svaret.
Det här får du: automation vs. resultat
| Vad det här arbetsflödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du har ett ekonomiark med 5 flikar och varje vecka svarar du på 10 ”snabba frågor” från ledningen. Manuellt tar varje fråga oftast cirka 10 minuter av filtrering, dubbelkontroll och att göra om en pivot, så du hamnar på ungefär 100 minuter i veckan. Med det här arbetsflödet: du lägger cirka 20 minuter en gång på att koppla ihop arket och databasen, och sedan är varje ny fråga ett chattmeddelande plus några sekunder för att frågan ska köras. Det är enkelt en till två timmar tillbaka varje vecka, och svaren slutar glida.
Det här behöver du
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för egen hosting om du föredrar det (Hostinger fungerar bra)
- Google Drive som trigger när din fil uppdateras.
- Google Sheets som källa för strukturerad data.
- PostgreSQL för att lagra data för pålitliga frågor.
- OpenAI eller Google Gemini för att generera SQL från frågor.
Kunskapsnivå: Medel. Du kopplar konton, lägger till credentials och bekräftar hur tabell/data ska hanteras (skapa vs. bygg om).
Vill du inte sätta upp detta själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
En ändring i Google Drive drar i gång allt. När den bevakade filen uppdateras hämtar n8n kalkylbladslänken och konfigurationen som behövs för att läsa rätt data.
Arbetsflödet granskar dina kolumner och förbereder databasen. Det kontrollerar om PostgreSQL-tabellen finns, bygger ”create table”-SQL från dina rubriker och kan radera/återskapa tabellen när du vill göra en felfri uppdatering.
Rader flyttas från Sheets till Postgres automatiskt. Arbetsflödet bygger insert-satser och laddar din kalkylbladsdata i PostgreSQL så att du frågar mot stabila poster, inte formler.
Du ställer en fråga i chatten, agenten returnerar siffran. En chatt-trigger skickar din prompt till AI-agenten, som använder dina schemadetaljer för att skriva SQL, kör den i Postgres och formaterar ett tydligt svar som du kan klistra in i Slack eller en rapport.
Du kan enkelt ändra uppdateringsbeteendet till att bara lägga till nya rader i stället för att bygga om tabeller varje gång, beroende på dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera triggern Drive File Watcher
Det här arbetsflödet startar när en specifik Google Drive-fil ändras och skickar sedan filkontexten vidare in i sheet-till-Postgres-pipelinen.
- Lägg till och öppna Drive File Watcher.
- Ställ in Trigger On på
specificFile. - I File to Watch väljer ni kalkylarksfilen (den måste matcha arket som används senare).
- Behörighet krävs: Anslut era googleDriveOAuth2Api-inloggningsuppgifter.
Steg 2: Anslut Google Sheets
Dessa noder definierar vilket ark som ska läsas och hämtar sedan alla rader från det arket.
- Öppna Configure Sheet Inputs och ställ in table_url till
https://docs.google.com/spreadsheets/d/[YOUR_ID]/edit?gid=0#gid=0. - Ställ in sheet_name till
product_list(detta blir tabellsuffixet). - Öppna Retrieve Sheet Records och bekräfta att Document ID använder
{{ $('Configure Sheet Inputs').item.json.table_url }}. - Bekräfta att Sheet Name använder
{{ $('Configure Sheet Inputs').item.json.sheet_name }}. - Behörighet krävs: Anslut era googleSheetsOAuth2Api-inloggningsuppgifter.
Steg 3: Konfigurera tabellverifiering och villkorsstyrt flöde
Arbetsflödet kontrollerar om måltabellen finns och tar sedan, beroende på resultatet, bort och återskapar den innan nya rader infogas.
- Öppna Verify Table Presence och bekräfta att frågan är
SELECT EXISTS ( SELECT 1 FROM information_schema.tables WHERE table_name = 'ai_table_{{ $json.sheet_name }}' );. - Behörighet krävs: Anslut era postgres-inloggningsuppgifter i Verify Table Presence (det här arbetsflödet använder flera Postgres-noder).
- Öppna Check Table Missing och bekräfta att villkoret använder
{{ $('Verify Table Presence').item.json.exists }}med den booleska operatorn satt tillfalse. - Säkerställ att routningen från Check Table Missing går till Build Table SQL (true-vägen) och till Drop Existing Table (false-vägen), och därefter till Build Table SQL.
⚠️ Vanlig fallgrop: Arknamnet i Configure Sheet Inputs måste matcha det faktiska fliknamnet i Google Sheets, annars kontrollerar Verify Table Presence fel tabellnamn.
Steg 4: Sätt upp SQL-generering och insert-pipeline
Dessa noder bygger en dynamisk CREATE TABLE-sats och förbereder parameteriserade inserts för Postgres.
- Öppna Build Table SQL och behåll det dynamiska tabellnamnet baserat på
ai_table_{{ $('Configure Sheet Inputs').first().json.sheet_name }}. - Öppna Create New Table och säkerställ att frågan är satt till
{{ $json.query }}. - Behörighet krävs: Anslut era postgres-inloggningsuppgifter i Create New Table, Drop Existing Table och Insert Rows.
- Öppna Compose Insert SQL och behåll den dynamiska insert-genereringen kopplad till Build Table SQL och Retrieve Sheet Records.
- I Insert Rows bekräftar ni att frågan använder
{{$json.query}}och att Query Replacement använder{{ $json.parameters }}.
Steg 5: Sätt upp AI-gränssnittet för frågor
Det här arbetsflödet innehåller en AI-agent som kan svara på chattfrågor genom att slå upp schemadetaljer och köra SQL.
- Öppna SQL Query Agent och granska systeminstruktionerna (inga ändringar krävs om ni inte vill ha annat beteende).
- Säkerställ att Gemini Chat Engine är ansluten som språkmodell för SQL Query Agent och ställ in Model Name till
models/gemini-2.0-flash. - Behörighet krävs: Anslut era googlePalmApi-inloggningsuppgifter i Gemini Chat Engine.
- Bekräfta att verktygen Run Query Tool och Fetch DB Schema Tool är anslutna till SQL Query Agent. Lägg till inloggningsuppgifter i den överordnade SQL Query Agent om era verktyg kräver åtkomst.
- Öppna Chat Message Trigger för att möjliggöra manuell chattbaserad testning av agenten.
⚠️ Vanlig fallgrop: Verktygsnoder som Run Query Tool och Fetch DB Schema Tool ärver behörigheter från den överordnade agenten—lägg inte till inloggningsuppgifter direkt på verktygsnoderna.
Steg 6: Konfigurera körning av subflöde och parallella SQL-grenar
Arbetsflödet har en subflödestrigger som kör två SQL-grenar samtidigt och returnerar ett kombinerat svar.
- Öppna Subflow Trigger och behåll den som startpunkt för körning av arbetsflödet från ett annat arbetsflöde.
- Subflow Trigger skickar ut till både Execute SQL Request och Lookup Schema Details parallellt.
- I Execute SQL Request bekräftar ni att frågan använder
{{ $json.query.sql }}. - Behörighet krävs: Anslut era postgres-inloggningsuppgifter i Execute SQL Request och Lookup Schema Details.
- Säkerställ att Lookup Schema Details matar in i Schema Text Builder för att formatera schemats utdata.
- I Prepare Response Payload behåller ni response satt till
{{ $json }}.
Steg 7: Testa och aktivera ert arbetsflöde
Kör tester från båda triggrarna för att validera flödet från kalkylark till databas och AI-gränssnittet för frågor.
- Klicka på Execute Workflow och ändra den övervakade filen för att trigga Drive File Watcher.
- Verifiera att en ny tabell med namnet
ai_table_product_listskapas och fylls i Postgres. - Använd Chat Message Trigger för att skicka en testfråga och bekräfta att agenten returnerar resultat från Postgres.
- Kontrollera Prepare Response Payload för ett strukturerat svar när ni använder Subflow Trigger.
- När allt är validerat växlar ni arbetsflödet till Active för användning i produktion.
Vanliga fallgropar
- Google Drive-credentials kan löpa ut eller kräva specifika behörigheter. Om det skapar fel, börja med att kontrollera n8n:s credential-inställningar och filens delningsbehörighet.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in er tonalitet tidigt, annars kommer du att redigera output för alltid.
Vanliga frågor
Cirka 30 minuter om din databas och ditt ark är redo.
Ingen kodning krävs. Du klistrar mest in credentials, väljer ett ark och testar ett par frågor.
Ja. n8n har ett gratis alternativ för egen hosting och en gratis provperiod på n8n Cloud. Molnplaner börjar på 20 USD/månad för högre volym. Du behöver också räkna in kostnader för AI-modellanvändning (ofta bara några dollar i månaden vid lättare frågekörning).
Två alternativ: n8n Cloud (hanterat, enklast att komma i gång) eller egen hosting på en VPS. För egen hosting är Hostinger VPS prisvärt och klarar n8n bra. Egen hosting ger obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det är en vanlig justering. Lägg till en Schedule Trigger och koppla den till samma flöde ”Retrieve Sheet Records → table check → insert rows”. Om du inte vill att tabellen ska raderas vid varje körning, låt grenen ”Drop Existing Table” vara avstängd och byt till insert som bara appendar. Vissa team lägger också till en ”last_updated”-kolumn så att agenten kan filtrera på färsk data.
Oftast är det behörigheter. Se till att arket är delat med Google-kontot som är kopplat till dina n8n-credentials, och bekräfta att arknamnet matchar det arbetsflödet förväntar sig. Om du använder en URL från Drive, verifiera att filen fortfarande ligger på samma plats och inte har ersatts. Kontrollera också rate limits om du hämtar många rader på en gång.
Om du hostar n8n själv finns ingen fast körningsgräns, och volymen beror främst på din server och Postgres-prestanda. På n8n Cloud beror gränsen på din plans månatliga körningar, men de flesta mindre rapportsynkar ryms utan problem. I praktiken är tusentals rader per synk normalt; om du har väldigt stora ark kan du vilja använda batchning och inkrementella uppdateringar.
Ofta, ja. Det här arbetsflödet är inte bara ”flytta rader”; det bygger också schema-medveten SQL och kör dynamiska frågor, vilket är där no-code-verktyg kan bli klumpiga eller dyra. n8n ger dig också förgreningar, databaskontroll och möjligheten att hosta själv för högre volym utan oväntade kostnader. Om du bara behöver en enkel tvåstegssynk kan Zapier eller Make gå snabbare. Om du vill ha tillförlitliga siffror och ett riktigt frågelager vinner den här lösningen oftare än inte. Prata med en automationsexpert om du vill ha en snabb rekommendation.
När din kalkylbladsdata väl ligger i PostgreSQL slutar rapporteringen vara en gissningslek. Arbetsflödet sköter den repetitiva infrastrukturen så att du kan fokusera på beslut, inte felsökning av totalsummor.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.