Din innehållskalender ljuger för dig. Inte med flit. Men när idéer ligger i ett Google Sheet, utkast ligger i Google Docs och ”publicerad” ligger i någons minne, så tappar ni snabbt bollen.
Den här Sheets WordPress-automationen slår hårdast mot content managers, men solofounders och byråledare känner av den också. Du slutar med att skriva om samma prompts, kopiera samma block och dubbelkolla samma statusar, vecka efter vecka.
Det här arbetsflödet gör om en enda rad i kalkylbladet till ett planerat inlägg, sedan ett utkast och sedan ett publiceringsklart WordPress-utkast som du kan granska innan det går live. Du får se hur det fungerar, vad du behöver och var team oftast går fel.
Så här fungerar automationen
Hela n8n-flödet, från trigger till slutresultat:
n8n Workflow Template: Google Sheets till WordPress – utkast redo att publicera
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Settings", pos: "b", h: 48 }
n1@{ icon: "mdi:play-circle", form: "rounded", label: "ScheduleTrigger", pos: "b", h: 48 }
n2@{ icon: "mdi:play-circle", form: "rounded", label: "ManualTrigger", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Schedule", pos: "b", h: 48 }
n4["<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/>Config"]
n5@{ icon: "mdi:database", form: "rounded", label: "fetchConfig", pos: "b", h: 48 }
n6@{ icon: "mdi:brain", form: "rounded", label: "AgentLLM", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "IfScheduledNow", 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/code.svg' width='40' height='40' /></div><br/>PreparedData"]
n9["<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/>RecombinedDataRow"]
n10@{ icon: "mdi:database", form: "rounded", label: "SaveBackToSheet", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "IfActionPublish", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "IfTakeAction", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-horizontal", form: "rounded", label: "IfPromptExists", pos: "b", h: 48 }
n14@{ icon: "mdi:robot", form: "rounded", label: "Basic LLM Chain", pos: "b", h: 48 }
n15["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>CreatePost"]
n16@{ icon: "mdi:database", form: "rounded", label: "SetToPublish", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>PrepareXmlPost"]
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/>HandleXMLRPCResponse"]
n19@{ icon: "mdi:swap-horizontal", form: "rounded", label: "PostingSuccessful", pos: "b", h: 48 }
n20@{ icon: "mdi:database", form: "rounded", label: "LogStatus", pos: "b", h: 48 }
n21@{ icon: "mdi:database", form: "rounded", label: "LogPublished", pos: "b", h: 48 }
n6 -.-> n14
n3 --> n8
n0 --> n5
n0 --> n3
n20 --> n10
n15 --> n18
n5 --> n4
n12 --> n11
n21 --> n19
n8 --> n12
n2 --> n0
n13 --> n14
n7 --> n17
n17 --> n15
n14 --> n9
n11 --> n7
n11 --> n13
n1 --> n0
n19 --> n16
n9 --> n20
n18 --> n21
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 n1,n2 trigger
class n14 ai
class n6 aiModel
class n7,n11,n12,n13,n19 decision
class n3,n5,n10,n16,n20,n21 database
class n15 api
class n4,n8,n9,n17,n18 code
classDef customIcon fill:none,stroke:none
class n4,n8,n9,n15,n17,n18 customIcon
Problemet: ert innehållsflöde fastnar i ”nästan klart”
Att planera innehåll i ett kalkylblad är okej… tills du försöker skala. Du skriver utkast på ett ställe, klistrar in i WordPress, märker att formateringen är fel och uppdaterar sedan arket igen så att kalendern inte ser fel ut. Nästa vecka frågar någon vad som är redo att publiceras och du pusslar ihop ledtrådar från tidsstämplar och halvt uppdaterade statusar. Värst är den mentala belastningen. Du lägger riktig fokus på admin, och ska sedan växla om och skriva något bra. Det är utmattande.
Friktionen byggs på. Här är var det faller isär i verkligheten.
- Du tappar tid på ”små” copy-paste-steg som tillsammans blir några timmar varje vecka.
- Statusfält driver isär, så du kan inte lita på vad ”utkast” eller ”schemalagd” faktiskt betyder.
- Prompts och varumärkesriktlinjer tillämpas inkonsekvent, vilket leder till fler omskrivningar och sämre output.
- Publicering blir en skör manuell checklista, så tempot går ner så fort den enda ”WordPress-personen” är upptagen.
Lösningen: en stegvis Google Sheets → WordPress-pipeline du styr
Den här automationen använder ditt Google Sheet som enda sanningskälla och flyttar sedan varje ämne genom tydliga steg: plan, utkast, slutversion och publicera. Den startar på schema (varje timme) eller när du manuellt triggar den i n8n. Flödet läser ditt ark ”Schedule”, kontrollerar varje rads Status och Action och avgör vad som ska hända härnäst. Om ett ämne behöver planering eller utkast hämtar den promptinställningar från ett ark ”Config”, kör din valda LLM och skriver tillbaka genererat innehåll till samma rad. Sedan stannar den och lämnar kontrollen till dig, så att du kan redigera resultatet och bestämma nästa Action. När du sätter en rad till publicera skapar den ett WordPress-inlägg via XML-RPC och loggar resultatet så att du ser vad som hände.
Flödet är lätt att leva med. Kalkylbladet blir kontrollpanelen. n8n gör det repetitiva jobbet i bakgrunden, och WordPress kopplas in först när ett inlägg faktiskt är redo att bli ett utkast eller gå live.
Vad du får: 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 publicerar 4 inlägg per vecka. Manuellt kanske du lägger cirka 20 minuter på att skapa en disposition, 45 minuter på att producera ett första utkast med AI-prompts och sedan ytterligare 15 minuter på att kopiera in i WordPress och fixa formatering, alltså runt 5 timmar per vecka bara för att få utkasten ”in i systemet”. Med det här flödet uppdaterar du en rad i Google Sheets (en minut eller två), låter LLM:en jobba i bakgrunden och granskar sedan ett WordPress-utkast när det är klart. Realistiskt landar du på cirka 2 timmar granskning och redigering per vecka, inte 5 timmar repetitiv hantering.
Det här behöver du
- n8n-instans (prova n8n Cloud gratis)
- Self-hosting-alternativ om du föredrar det (Hostinger fungerar bra)
- Google Sheets för att hantera schema och prompts.
- WordPress för att ta emot utkast och publicera inlägg.
- OpenRouter API-nyckel (hämta den i din OpenRouter-dashboard).
Svårighetsnivå: Medel. Du kopplar konton, kopierar en kalkylbladsmall och klistrar in några ID:n och URL:er i n8n-inställningar.
Vill du inte sätta upp detta själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Ett schema eller en manuell körning sätter igång. Flödet körs som standard varje timme, men du kan också trigga det på beställning när du vill bearbeta nya ämnen direkt.
Ditt kalkylblad blir ”routern”. n8n läser arket Schedule (ämnen, schemalagt datum, aktuell Status och nästa Action) och laddar även arket Config, där dina prompts, kontext och till och med vilken LLM-modell som ska användas finns.
AI genererar nästa steg bara när det behövs. Om en rads Action säger ”plan”, ”draft” eller ”final” körs LLM-kedjan och skriver tillbaka resultatet till rätt kolumner, tillsammans med statusloggar så att du ser vad som ändrats.
Publicering sker bara när du säger till. När du ändrar Action till ”publish” sätter flödet ihop en XML-RPC-payload, skickar den till WordPress, validerar att det lyckas och markerar sedan raden som publicerad samt lägger till en loggrad för publiceringen.
Du kan enkelt ändra namnen på Status/Action så att de matchar er interna process. Se den fullständiga implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: Konfigurera den schemalagda triggern
Konfigurera hur arbetsflödet startar, antingen enligt ett schema eller manuellt för testning.
- Öppna Scheduled Automation Trigger och ställ in Rule så att den körs varje timme (fältet interval
hours). - Låt Manual Start Trigger vara ansluten till Config Variables för manuella testkörningar.
- Verifiera att båda triggerarna är kopplade till Config Variables så att schemalagda och manuella körningar delar samma konfigurationsflöde.
Steg 2: Anslut Google Sheets
Definiera kalkylarksparametrar och anslut alla Google Sheets-noder som läser scheman, konfigurationer och loggar.
- I Config Variables ställer ni in kalkylarket och WordPress-värden: urlSpreadsheet till
https://docs.google.com/spreadsheets/d/[YOUR_ID]/edit?gid=0#gid=0, sheetSchedule till=Schedule, sheetConfig tillConfigoch sheetLog tillLog. - Bekräfta att Config Variables skickar output till både Retrieve Config Sheet och Read Schedule Sheet parallellt.
- Öppna Read Schedule Sheet och ställ in Document till
{{ $('Config Variables').item.json.urlSpreadsheet }}och Sheet Name till{{ $('Config Variables').item.json.sheetSchedule }}. - Öppna Retrieve Config Sheet och ställ in Document till
{{ $('Config Variables').item.json.urlSpreadsheet }}och Sheet Name till{{ $('Config Variables').item.json.sheetConfig }}. - Inloggningsuppgifter krävs: Anslut era
googleSheetsOAuth2Api-uppgifter till Read Schedule Sheet, Retrieve Config Sheet, Write Back to Sheet, Append Status Log, Append Publish Log och Mark As Published.
Steg 3: Sätt upp bearbetning och AI-generering
Omvandla schemarader till AI-prompter, generera innehåll och slå ihop output tillbaka till raddatan.
- Låt Build Config Map vara kopplad efter Retrieve Config Sheet för att bygga konfigurationspar av nyckel/värde för prompter och modeller.
- I Prepare Row Payload låter ni Mode vara satt till
runOnceForEachItemför att generera prompt- och modellinställningar per rad. - Verifiera att Verify Action Needed kontrollerar
{{ $json.takeAction }}så att endast rader med nya åtgärder går vidare. - Bekräfta att Check Publish Action jämför
{{ $json.row.Action }}med{{ $('Config Variables').item.json.actionPublish }}, och notera att Check Publish Action skickar output till både Check Schedule Time och Confirm Prompt Present parallellt. - Öppna Confirm Prompt Present och säkerställ att den validerar att
{{ $json.prompt }}inte är tom innan AI körs. - I LLM Prompt Chain ställer ni Text till
{{ $json.prompt }}och låter Prompt Type vara satt tilldefine. LLM Chat Model är ansluten som språkmodell för LLM Prompt Chain — se till att inloggningsuppgifter är tillagda i LLM Chat Model. - Inloggningsuppgifter krävs: Anslut era
openAiApi-uppgifter till LLM Chat Model och låt Model vara satt till{{ $json.model }}. - I Merge Generated Output låter ni Mode vara satt till
runOnceForEachItemför att normalisera och slå ihop AI-output tillbaka in i schemaraden.
prompt_* och prompt_*_model.Steg 4: Konfigurera publiceringsoutput till WordPress
Bygg XML-payloaden, skicka den till WordPress via XML-RPC och validera svaret.
- I Check Schedule Time låter ni jämförelsen mellan
{{ DateTime.now().ts }}och{{ DateTime.fromFormat($json.row.Scheduled, "yyyy-MM-dd HH:mm:ss").ts }}vara kvar, så att endast inlägg som förfaller publiceras. - I Compose XML Post behåller ni genereringen av XML-RPC-payloaden som sätter inläggstitel och innehåll från
$json.row.Titleoch$json.row.final. - I WordPress XML-RPC Call ställer ni in URL till
=https://{{ $('Config Variables').item.json.urlWordpress }}/xmlrpc.php, Method tillPOST, Body till{{ $json.xmlRequestBody }}och Raw Content Type tilltext/xml. - Låt Parse XML-RPC Reply vara ansluten för att fånga
postIdeller XML-RPC-fel. - I Validate Post Success bekräftar ni att den kontrollerar
{{ $('Parse XML-RPC Reply').item.json.postId }}innan den går vidare till uppdateringar. - I Mark As Published bekräftar ni att Status är satt till
{{ $('Config Variables').item.json.actionPublish }}och att raden matchas med{{ $('Prepare Row Payload').item.json.row.row_number }}.
wordpressUsername och wordpressApplicationPassword, annars kommer XML-RPC-anropet att returnera ett fel.Steg 5: Konfigurera loggning och uppdateringar i arket
Logga statusändringar och skriv tillbaka genererat innehåll till schemabladet.
- I Append Status Log låter ni Operation vara satt till
appendoch låter formeln för Message vara satt till=Status {{ $json.Status }} for row {{ $('Prepare Row Payload').item.json.row.row_number }}. - I Write Back to Sheet låter ni Operation vara satt till
updateoch Matching Columns satt tillrow_numberså att raden uppdateras korrekt. - I Append Publish Log låter ni Type vara satt till
{{ $json.errorCode ? 'error' : 'info' }}och Message satt till=Publishing row {{ $('Prepare Row Payload').item.json.row.row_number }}: {{ $json.postId }}{{ $json.errorCode }}{{ $json.error }}.
Steg 6: Testa och aktivera ert arbetsflöde
Kör ett manuellt test, bekräfta förväntade resultat och aktivera den schemalagda automatiseringen.
- Klicka på Execute Workflow på Manual Start Trigger för att testa med en känd schemarad.
- Kontrollera att Append Status Log och Append Publish Log lägger till rader i
Log-bladet. - Bekräfta att schemaraden uppdateras av Write Back to Sheet och, om publicerad, av Mark As Published.
- Verifiera att ett inlägg skapas i WordPress när Parse XML-RPC Reply returnerar ett
postId. - När ni är nöjda, växla arbetsflödet till Active så att Scheduled Automation Trigger körs varje timme i produktion.
Vanliga fallgropar
- Google Sheets-autentiseringsuppgifter kan gå ut eller sakna åtkomst till just den kalkylbladskopian. Om rader slutar uppdateras, kontrollera Google-kopplingen i n8n och bekräfta att kalkylbladet är delat med rätt konto.
- Om du använder Wait-noder eller extern rendering varierar bearbetningstiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- WordPress-publicering via XML-RPC kan misslyckas om ditt applösenord är fel eller om din användarroll inte får publicera. Kontrollera dina inställningar för WordPress applösenord och bekräfta att XML-RPC är tillåtet av din host eller ditt säkerhetsplugin.
Vanliga frågor
Cirka en timme om ditt kalkylblad och din WordPress-åtkomst är redo.
Nej. Du kopplar konton och klistrar in några värden i Settings-noden. Arbetsflödet innehåller redan logiken för att läsa rader, skriva tillbaka och publicera.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Molnplaner startar på 20 USD/månad för högre volym. Du behöver också räkna in OpenRouter API-kostnader, som beror på vilken modell du väljer.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och klarar n8n bra. Self-hosting ger obegränsade körningar men kräver grundläggande serverhantering.
Ja, men du vill ha en tydlig separering. Det enklaste är att duplicera arbetsflödet och peka varje kopia mot en annan WordPress-URL och ett annat applösenord i Settings-noden. Vissa team duplicerar också kalkylbladet per sajt, vilket gör att prompts och scheman inte trasslar ihop sig. Om du föredrar ett kalkylblad kan du lägga till en kolumn ”Site” och routa rader genom en extra If-nod innan WordPress XML-RPC-anropet.
Oftast är det ett problem med applösenordet eller blockerad XML-RPC. Skapa ett nytt WordPress applösenord, uppdatera det i arbetsflödet och bekräfta att din WordPress-användare har rättigheter att skapa inlägg. Om du använder ett säkerhetsplugin eller en hanterad host, kontrollera deras inställningar eftersom vissa stänger av XML-RPC som standard. Kontrollera också att WordPress-URL:en i Settings-noden är exakt den bas-URL som din XML-RPC-endpoint förväntar sig.
Med n8n Cloud Starter kan du köra en bra mängd timvisa kontroller för en mindre kalender, och högre planer klarar mer volym. Om du self-hostar finns ingen begränsning i antal körningar, det beror mest på din server och din LLM-hastighet. I praktiken kör de flesta team detta varje timme och bearbetar allt från några rader till några dussin rader per körning. Om du börjar generera hundratals utkast kommer du att slå i LLM:ens rate limits innan du slår i n8n-gränser.
Ofta, ja. Det här flödet bygger på grenlogik (kontroller av Status + Action), att skriva strukturerade resultat tillbaka till arket och att hantera WordPress-publiceringssvar med validering och loggar, vilket är precis där enklare verktyg blir klumpiga eller dyra. n8n ger dig också möjligheten att self-hosta, så att du inte betalar mer varje gång du kör timvisa kontroller. Zapier eller Make kan ändå passa bättre om du bara vill ha ett enkelt flöde ”ny rad → skapa utkast” och du inte bryr dig om godkännanden i flera steg. Om du är osäker, prata med en automationsexpert och beskriv hur ni jobbar med er kalenderprocess.
När det här väl är på plats slutar kalkylbladet vara en stökig checklista och börjar fungera som en riktig produktionspipeline. Arbetsflödet tar det repetitiva jobbet. Du tar besluten.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.