Du hittar en lovande GitHub-profil, öppnar tio flikar, skummar repos, kopierar länkar och tappar sedan tråden halvvägs. När du väl är klar har du fortfarande inget felfritt, delbart underlag. Bara utspridda anteckningar och ett halvifyllt kalkylark.
Tekniska rekryterare känner av det här först. Men talent ops-team och sourcers på byråer hamnar i samma röra när de försöker skala GitHub Sheets automation bortom en handfull profiler.
Det här arbetsflödet hämtar en lista med GitHub-profil-URL:er, skrapar detaljerna och skriver en strukturerad rapport i Google Sheets med en flik per person, medan Slack håller dig uppdaterad under körningen. Du ser vad som skapar fel i den manuella processen, vad automatiseringen förändrar och vad du behöver för att köra den stabilt.
Så fungerar automatiseringen
Se hur detta löser problemet:
n8n Workflow Template: GitHub till Google Sheets, rensade profiler med Slack
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Run a workflow task", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Get details of a workflow task", pos: "b", h: 48 }
n5["<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/>Code in JavaScript"]
n6@{ icon: "mdi:database", form: "rounded", label: "Create sheet", pos: "b", h: 48 }
n7["<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/merge.svg' width='40' height='40' /></div><br/>Merge"]
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out1", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out2", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Clear sheet", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n13@{ icon: "mdi:database", form: "rounded", label: "Append row in sheet", pos: "b", h: 48 }
n14["<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/merge.svg' width='40' height='40' /></div><br/>Merge1"]
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/slack.svg' width='40' height='40' /></div><br/>Send a message"]
n16@{ icon: "mdi:database", form: "rounded", label: "User Data", pos: "b", h: 48 }
n17@{ icon: "mdi:database", form: "rounded", label: "User Links", pos: "b", h: 48 }
n18@{ icon: "mdi:database", form: "rounded", label: "User Repositories", pos: "b", h: 48 }
n7 --> n9
n7 --> n8
n7 --> n10
n14 --> n2
n8 --> n17
n16 --> n14
n9 --> n16
n10 --> n18
n17 --> n14
n11 --> n13
n12 --> n11
n6 --> n12
n2 --> n15
n2 --> n3
n18 --> n14
n5 --> n6
n5 --> n7
n13 --> n7
n1 --> n2
n3 --> n4
n4 --> n5
n0 --> n1
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 n0 trigger
class n1,n6,n11,n13,n16,n17,n18 database
class n5 code
classDef customIcon fill:none,stroke:none
class n5,n7,n14,n15 customIcon
Utmaningen: granska GitHub-profiler utan att tappa sammanhanget
GitHub är rikt på signaler, men rörigt när du behöver granska snabbt. Profiler har pinnade repos, senaste aktivitet, organisationer, stjärnor, länkar och en lång svans av ledtrådar som bara spelar roll när du kan fånga dem konsekvent. Manuellt får du anteckningar som inte matchar från person till person. Än värre: du återvänder till samma profil två gånger eftersom du inte ser vad du redan har kollat. Det handlar inte bara om tid. Det är mental belastning, och den sänker i det tysta kvaliteten på din shortlist.
Friktionen växer snabbt. En profil är irriterande; en batch på 30 blir en hel eftermiddag du inte planerade för.
- Att kopiera och klistra in reponamn, länkar och statistik i ett ark bjuder in småfel som senare ser ut som ”dåliga kandidater”.
- Du får ett enda jättestort kalkylark som ingen vill läsa, vilket gör att beslut drar ut på tiden.
- Manuell granskning gör det svårt att jämföra personer rättvist, eftersom du aldrig fångar samma fält i samma ordning.
- När en kollega frågar ”var kom den här profilen ifrån?” letar du i Slack-trådar och webbläsarhistorik.
Lösningen: skrapa GitHub-profiler till strukturerade Google Sheets
Automatiseringen börjar med ett enkelt underlag: ett Google Sheet med GitHub-profil-URL:er du vill granska. Den bearbetar varje profil en i taget, skickar ett Slack-meddelande så att du vet vad som hanteras och använder BrowserAct för att skrapa hela profilsidan plus repo- och social-/länkdata. Sedan konsoliderar ett JavaScript-steg för datarensning den råa skrapningen till ett prydligt JSON-objekt (ärligt talat är det här delen som gör outputen användbar). Till sist skapar arbetsflödet en dedikerad flik för personen i din rapporteringsfil, rensar den inför en ny körning och skriver tre korrekt formaterade avsnitt: profildetaljer, länkar och repositories. Resultatet är ett repeterbart ”profildossier” som du kan dela med en rekryterande chef eller spara som intern dokumentation.
Arbetsflödet startas manuellt i dag, men det är byggt så att du kan byta trigger senare (schemalägg det, eller mata in det från ett sourcingflöde). Därifrån är det konsekvent: läs URL:er från Sheets, skrapa med BrowserAct, rensa datan och skriv en strukturerad rapport samt notifiera Slack när varje profil körs.
Vad som förändras: före vs. efter
| Det här elimineras | Effekt du kommer se |
|---|---|
|
|
Effekt i verkligheten
Säg att du granskar 25 GitHub-profiler för en roll varje vecka. Manuellt kanske du lägger cirka 10 minuter per profil på att öppna repos, hämta länkar och skriva en användbar sammanfattning, vilket blir ungefär 4 timmar ”research-admin”. Med det här arbetsflödet klistrar du in URL:erna i huvudarket i Google Sheets, kör flödet och låter BrowserAct sköta skrapningen medan Slack håller dig uppdaterad. Din tid sjunker till kanske 20 minuters uppsättning plus snabb granskning av de färdiga flikarna, så du får tillbaka större delen av eftermiddagen.
Krav
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för egen drift om du föredrar det (Hostinger fungerar bra)
- Google Sheets för inputlistan och outputrapporterna.
- Slack för att posta statusnotiser under körningen.
- BrowserAct för att skrapa GitHub-profiler och repositories.
- BrowserAct API-nyckel (hämta den i din BrowserAct-dashboard).
Kunskapsnivå: Medel. Du kopplar konton, klistrar in credentials och är bekväm med att testköra och justera några fält.
Behöver du hjälp att implementera detta? Prata med en automatiseringsexpert (gratis 15-minuters konsultation).
Flödet i arbetsflödet
Manuell start (eller schemalagd körning) drar igång processen. Du triggar arbetsflödet när du är redo att berika en batch, oftast efter att du samlat profil-URL:er i ditt kandidatark.
Google Sheets levererar källistan. Arbetsflödet läser rader från ditt huvudkalkylark och hämtar varje GitHub-profil-URL du vill bearbeta. Om du senare vill ha en annan källa kan du byta input utan att skriva om allt.
Varje profil körs i en kontrollerad loop. n8n bearbetar en kandidat i taget (Split in Batches), postar en Slack-notis att profilen startar och anropar sedan BrowserAct för att köra skrapningsjobbet. En uppföljande request hämtar jobbdataljerna när BrowserAct är klart.
Rå skrapdata rensas och organiseras. Ett JavaScript Code-steg konsoliderar det BrowserAct returnerar till ett enda felfritt objekt, sedan skapar (och rensar) arbetsflödet en dedikerad Google Sheets-flik med användarens namn. Efter det delar det upp den rensade datan i tre strömmar så att profilinfo, länkar och repos hamnar i förutsägbara avsnitt.
Google Sheets blir leveransen. Arbetsflödet lägger till rubriker, skriver profilavsnittet, skriver länkar, skriver repos och slår sedan ihop grenarna igen så att loopen kan fortsätta. Slack-notiser gör att körningen inte känns som en svart låda.
Du kan enkelt modifiera formatet på källarket för att stödja extra kolumner (roll, steg, sourcer) utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera den manuella triggern
Starta arbetsflödet manuellt så att ni kan testa berikningen från början till slut innan ni automatiserar.
- Lägg till och behåll Manual Launch Trigger som startnod.
- Koppla Manual Launch Trigger till Retrieve Sheet Rows för att mata in käll-URL:er i arbetsflödet.
Steg 2: anslut Google Sheets
Konfigurera era Google Sheets-källor och målflikar som används i hela arbetsflödet.
- Öppna Retrieve Sheet Rows och välj källkalkylarket och arket för era GitHub-URL:er.
- Referens krävs: Anslut era googleSheetsOAuth2Api-referenser för Retrieve Sheet Rows.
- Öppna Generate Sheet Tab och ställ in Operation till
create, med Title satt till={{ $json.Name }}. - Referens krävs: Anslut era googleSheetsOAuth2Api-referenser för Generate Sheet Tab, Wipe Sheet Tab, Append Header Row, Write Profile Data, Write Link Data och Write Repo Data (grupperade Google Sheets-noder).
Steg 3: konfigurera webbläsarautomatisering och parsning
Använd BrowserAct för att hämta profildata och parsa svaret till strukturerad JSON.
- Konfigurera Execute Browser Task med Workflow ID satt till
[YOUR_ID]och ställ in Target_Page till={{ $json.URL }}. - Referens krävs: Anslut era browserActApi-referenser för Execute Browser Task och Fetch Task Details.
- I Fetch Task Details ställer ni in Operation till
getTask, Task ID till={{ $json.id }}, Wait For Finish tilltrue, Max Wait Time till900och Polling Interval till20. - Behåll Transform Parsed Data som den är för att reparera felaktig JSON och slå ihop objekt till en enda utdata.
$input.first().json.output.string.Steg 4: konfigurera datasplitting och parallell bearbetning
Dela upp den parsade profilen, länkarna och repositories i separata grenar och slå sedan ihop dem igen för batchning.
- Bekräfta att Transform Parsed Data skickar utdata parallellt till både Generate Sheet Tab och Combine Streams.
- Verifiera att Combine Streams är satt till Mode
chooseBranchmed Use Data Of Input satt till2. - Ställ in Separate Links att dela upp på Field To Split Out
Links. - Ställ in Separate Profile att dela upp på Field To Split Out
Nameoch inkluderaUsername, Summary, Location. - Ställ in Separate Repos att dela upp på Field To Split Out
Repositories. - Säkerställ att Rejoin Outputs har Number Inputs satt till
3för att vänta in alla tre grenarna.
Steg 5: konfigurera utdestinationsmål och notifieringar
Skapa rena bladflikar, skriv data i kolumner och skicka en Slack-notifiering.
- I Assign Empty Fields bekräftar ni att tomma strängar tilldelas för Name, Username, Location, Site, link, Title, Summary, Date, Programing Language och Stars.
- I Wipe Sheet Tab ställer ni in Operation till
clearoch Sheet Name till={{ $('Transform Parsed Data').item.json.Name }}. - I Append Header Row ställer ni in Operation till
appendoch säkerställer att kolumnvärdena inkluderar={{ $('Assign Empty Fields').item.json.Name }}och={{ $('Assign Empty Fields').item.json.Username }}. - I Write Profile Data mappar ni Name till
={{ $json.Name }}, Summary till={{ $json.Summary }}, Location till={{ $json.Location }}och Username till={{ $json.Username }}. - I Write Repo Data mappar ni Programming Lang till
={{ $json["Programing Language"] }}och Repositories_Name till={{ $json.Title }}. - I Post Slack Alert ställer ni in Text till
Users Data Scrapped from Githuboch väljer er kanal. - Referens krävs: Anslut era slackOAuth2Api-referenser för Post Slack Alert.
={{ $('Transform Parsed Data').item.json.Name }}. Säkerställ att fältet Name finns i den parsade datan, annars kommer skapande av arkflik och skrivningar att misslyckas.Steg 6: testa och aktivera ert arbetsflöde
Kör ett manuellt test för att validera webbläsarautomatisering, JSON-parsning och utdata till Sheets innan ni aktiverar.
- Klicka på Execute Workflow och verifiera att Manual Launch Trigger startar körningen.
- Bekräfta att Execute Browser Task och Fetch Task Details returnerar slutförda uppgifter med en utdatasträng.
- Kontrollera att Generate Sheet Tab skapar en ny bladflik namngiven efter användaren och att Wipe Sheet Tab rensar den innan skrivning.
- Validera att data hamnar i rätt kolumner från Write Profile Data, Write Link Data och Write Repo Data.
- Verifiera att ett Slack-meddelande publiceras via Post Slack Alert efter att Iterate Records har slutförts.
- När allt fungerar växlar ni arbetsflödet till Active för att köra det i produktion vid behov.
Se upp med
- BrowserAct-credentials kan löpa ut eller kräva specifika behörigheter. Om något skapar fel, kontrollera först din BrowserAct API-nyckel och workspace-åtkomst i BrowserAct-dashboarden.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om nedströmsnoder fallerar på tomma svar.
- Skapandet av Google Sheets-flikar kan misslyckas när namn krockar eller innehåller udda tecken. Om du ser fel, sanera fliknamnet i Code-steget och bekräfta att kalkylarket har redigeringsåtkomst för din Google Sheets-credential.
Vanliga frågor
Om dina BrowserAct-, Google Sheets- och Slack-konton är klara, räkna med ungefär en timme.
Ja. Det är ingen traditionell kodning, men någon behöver vara bekväm med att koppla credentials och köra några testprofiler. När det väl fungerar är den dagliga användningen i princip ”lägg till URL:er i arket och klicka kör”.
Ja. n8n har ett gratis alternativ för egen drift och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volymer. Du behöver också räkna in BrowserAct-kostnader, eftersom skrapningskörningar debiteras av BrowserAct.
Två alternativ: n8n Cloud (hanterat, enklast uppsättning) eller egen drift på en VPS. För egen drift är Hostinger VPS prisvärd och hanterar n8n bra. Egen drift ger dig obegränsade körningar men kräver grundläggande serveradministration.
Du kan behålla samma GitHub Sheets automation-struktur och ändra inputs och outputs. De enklaste justeringarna görs i ”Retrieve Sheet Rows” (ändra vilka kolumner du läser), ”Transform Parsed Data” (byt namn på eller lägg till fält du bryr dig om) och de tre skrivstegen (”Write Profile Data”, ”Write Link Data”, ”Write Repo Data”) för att matcha din föredragna rapportlayout. Vanliga tweaks är att lägga till poängkolumner, skriva till en delad ”Summary”-flik utöver flikar per användare och filtrera bort repos under ett minsta antal stjärnor.
Oftast är det en API-nyckel som löpt ut eller att community-noden inte är installerad på din self-hostade n8n. Generera en ny BrowserAct-nyckel, bekräfta att workspace och template är åtkomliga och spara sedan om credentials i n8n. Om det bara fallerar på större batcher kan det också vara rate limiting eller att skrapjobbet tar längre tid än förväntat, så att anropet ”Fetch Task Details” returnerar innan resultaten är klara.
Den skalar till hundratals profiler så länge din skrapleverantörs- och Google Sheets-gränser respekteras och du är okej med batchkörningar som tar tid.
Ofta, ja, eftersom det här inte bara är ”skicka data från A till B”. Du loopar över en lista, väntar på ett externt skrapjobb, transformerar stökig output och skriver till flera avsnitt i ett kalkylark. n8n hanterar den typen av förgreningar och datamodellering mer naturligt, och egen drift undviker prissättning per task när du kör stora batcher. Zapier eller Make kan fortfarande fungera om du håller omfattningen liten, men du kommer känna friktionen när du lägger till rensningslogiken och flikhantering per kandidat. Prata med en automatiseringsexpert om du vill ha en snabb rekommendation baserat på din volym och process.
Du får en felfri plats att granska GitHub-kandidater, och Slack gör att körningen inte försvinner i tomma intet. Sätt upp det en gång och låt sedan arbetsflödet göra grovjobbet medan du fokuserar på 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.