Sådan bygges en slack bot med kun Google Sheets

Kilde: BetterCloud

TL; DR

I denne artikel diskuterer jeg, hvordan man udvikler en serverløs Slack-app, der læser oplysninger fra et Google Sheet og returnerer det til en bruger.

Baggrundshistorie

Jeg er heldig nok til at arbejde for en virksomhed, der holder så meget på medarbejdernes velfærd. En af fordelene, som virksomheden leverer sine ansatte, er en fuldt serviceret indkvarteringsfacilitet. Når nye medarbejdere ansøger om en plads i boligfaciliteten, føjes de normalt til en venteliste. Denne venteliste opdateres manuelt bag kulisserne, når der bliver plads tilgængelig.

Medarbejdere, der ønsker at få opdateringer om deres status på ventelisten, skal normalt sende nogen på faciliteterne en besked og derefter vente på et svar. Facilitetsteamet gør et godt stykke arbejde med at holde alle opdaterede, når de anmoder om opdateringer. Det var imidlertid ikke en særlig effektiv proces. Jeg kom med en idé om at automatisere denne proces med en Slack bot i en weekend, hvor jeg var nødt til at få opdateringer om min ventestatus, og kollegaen, som jeg skulle sende en besked, ikke var tilgængelig. Ideen lød spændende, da vi alle brugte Slack til hele virksomheden kommunikation.

Den følgende uge havde jeg en chat med et medlem af faciliteterne, der var ansvarlig for pladsfordeling. Hun var begejstret for ideen og hvordan det ville hjælpe hende med at spare værdifuld tid til andre opgaver. Vi var i stand til at nå til enighed om, at en bot automatiserer processen. Bot'en ​​tager brugerens e-mail som input, læser data fra Google-arket, der indeholder tildelingsoplysningerne, og informerer derefter brugeren om deres nuværende nummer på listen.

Resten af ​​denne artikel beskriver, hvordan jeg oprettede denne bot.

Designe en løsning

For at komme i gang med løsningsdesignet er her de funktionelle og ikke-funktionelle krav, der definerer omfanget af problemet og styrer løsningen.

Funktionelle krav

  • Systemet (Slack-app og afhængigheder) har en kommando, som du kan få adgang til hvor som helst i Slack-arbejdsområdet
  • Systemet accepterer medarbejderens e-mail som input
  • Systemet kontrollerer medarbejderens e-mail mod deres nummer på listen og returnerer oplysninger om nummeret
  • Systemet returnerer et passende svar, hvis input er ugyldigt eller ikke findes på listen.

Ikke-funktionelle krav

  • Systemet har næsten 100% oppetid (så det kan bruges når som helst og endda i weekenden)
  • Systemet reagerer hurtigt på brugeranmodninger
  • Systemet er i stand til at udføre flere anmodninger samtidig uden at blokere
  • Systemet har nul vedligeholdelsesomkostninger.

Undersøger de tilgængelige indstillinger

I denne del undersøger vi tilgængelige muligheder for at imødekomme vores krav.

Funktionskrav nr. 1

Vores første krav er at have en bestemt kommando, der er tilgængelig overalt i arbejdsområdet. Et hurtigt kig gennem Slack API-dokumentationen viser, at der er to nemme måder at opnå dette på:

  • Udgående webhooks
  • Slash-kommandoer

For at hjælpe os med at vælge mellem disse to alternativer bemærker vi, at udgående webhooks vil blive udskrevet i fremtidige udgivelser af Slack API. De er heller ikke tilgængelige på tværs af et Slack-arbejdsområde, da de generelt lytter på en bestemt kanal. Sidstnævnte adfærd krænker vores første funktionelle krav, som siger, at kommandoen skal være tilgængelig i hele arbejdsområdet. Det er også vigtigt at bemærke, at udgående webhooks automatisk konverterer e-mail-adresser til mailto-links, hvilket gør det sværere at analysere de e-mail-adresser, der sendes til serveren. Slash-kommandoer har på den anden side ikke nogen af ​​disse begrænsninger og er den åbenlyse løsning på det første krav. Jeg fik oprindeligt at vide om webhook-metoden fra denne artikel, der diskuterer et lignende emne.

Funktionskrav nr. 2

Vores andet krav er at få systemet til at acceptere medarbejderens e-mail som input. Dette krav betyder, at vi er nødt til at definere / designe en grænseflade, der giver medarbejderen mulighed for at specificere deres e-mail-adresse. I betragtning af at vi bruger skråstregskommandoer, sidder vi fast med en kommando-grænseflade. Vores bedste billede er at designe en kommando-grænseflade, der er intuitiv og fornuftig. Når vi ser gennem Slack API-dokumenter igen, har en typisk skråstregskommando formen:

/ todo bede @crushermd om at bage en fødselsdagskage til @worf i # d-social

I ovenstående kommandolinje er todo kommandoen, og resten af ​​sætningen er teksten. Et rimeligt design til vores skråstregskommando efter denne struktur vil være:

/ listbot check [email protected]

listbot udløser vores app og videresender teksten, som indeholder en kontrolhandling og et argument [email protected] Jeg valgte denne struktur, fordi den ligner, hvordan vi bruger kommandoer på traditionelle CLI'er. F.eks. Tilføj myfile.txt.

Funktionskrav nr. 3

Vores tredje funktionelle krav er, at systemet kan kontrollere medarbejderens e-mail på et Google-ark og returnere det nummer, der er knyttet til e-mailen. For at imødekomme dette krav skal vi have en slags backend, der modtager vores kommando fra Slack, og det skal være i stand til at læse data fra Google-ark. Hvordan gør vi det? I mit tilfælde havde jeg tidligere erfaring med at hjælpe en klient med at automatisere visse opgaver på Google-ark, så jeg vidste svaret. Men jeg tror, ​​en lille Google-søgning er alt, hvad det vil tage for at nå frem til Google App Scripts. Det er en javascript-baseret platform, der hjælper os med at udvide kraften i Google Apps (hvoraf ark er en).

Med et Google App-script kan vi læse data fra et Google-ark. Dette løser den første del af vores tredje funktionelle krav. Interessant også kan vi distribuere scriptet som en webapp, som effektivt løser den anden del af vores funktionelle krav. Voila! Vores tredje funktionelle krav er opfyldt. Den største fordel ved at bruge Google App-script her, er, at det også opfylder alle vores ikke-funktionelle krav.

Bemærk: Et alternativ ville have været at opsætte en Node.js-server på en gratis Heroku dyno-forekomst og bruge Google Sheets API til at læse data fra vores Google-ark. Men Heroku-frie dynoer kan lide at sove meget, hvilket ikke opfylder vores ikke-funktionelle krav til hurtige svar og næsten 100% oppetid. Heroku er selvfølgelig ikke den eneste PaaS-udbyder der er. Men gratis niveauer hos de fleste andre udbydere har generelt lignende begrænsninger og er relativt en overkill for en så simpel bot.

Funktionskrav nr. 4

Vores fjerde funktionelle krav er kun logik, der kører i vores Google App-script. Så det er også opfyldt.

Implementering

For at komme i gang med implementeringen af ​​vores løsning, har vi brug for følgende miljøopsætning:

Miljøopsætning

  • Et Slack-arbejdsområde, som du har administratoradgang til (Besøg slack.com for at oprette et).
  • Et Google-ark med kolonnestrukturen nedenfor (dette er en forenklet version af det virkelige ark)

Sæt appopsætning

Efter opsætning af miljøet er vi nødt til at oprette vores Slack-app og konfigurere den. Processen til at gøre dette er ganske let og er fuldt ud forklaret i Slack API-dokumenter. Her er en oversigt over de involverede trin:

  • Klik på “Start bygning” CTA-knappen på API-startsiden. Dette pop-up et modal, hvor du specificerer appnavnet og det arbejdsområde, du vil installere det til.
  • På den side, der kommer op næste, skal du vælge "Slash Commands" i afsnittet "Tilføj funktioner og funktionalitet". Dette vil navigere til en side, der giver dig mulighed for at konfigurere Slash-kommandoen. Konfigurer som vist nedenfor:

Bemærk: Marker ikke afkrydsningsfeltet “Escape-kanaler, brugere og links sendt til din app”. Dette giver os mulighed for at få den rå tekst til e-mails. Lad også feltet Anmod om URL være tomt. Vi udfylder feltet, når vi implementerer vores Google app-script.

Håndtering af anmodninger fra Slack med Google Apps Script

For at komme i gang med Google Apps-script skal du åbne det Google-ark, du oprettede tidligere. Klik på Værktøjslinjen på Værktøjer> Scripteditor, og din browser skal åbne en ny side, der indeholder scripteditoren. Det er her vi opretter vores Google App-script.

Bemærk: Du kan også oprette et enkeltstående Google App-script. Denne metode er imidlertid ikke i tråd med titlen på denne artikel.

For at håndtere anmodninger fra Slack skal vi:

  • Hent anmodningsorganet
  • Analyse af anmodningsorganet
  • Rute brugeranmodning til den rigtige behandler
  • Få behandleren til at behandle brugeranmodningen og returnere resultatet af driften
  • Send svar til brugeren

Hurtig note til læseren: Google Apps-script understøtter ikke ES6 + til udvikling.

For at få anmodningskrop, fanger vi de bogførte data i doPost () -funktionen som følger:

Efter at have hentet anmodningsorganet og konverteret det til et almindeligt objekt, vil vores req-objekt have følgende form:

Vi kan derefter gå videre til det næste trin med parsning af tekstegenskab for req-objektet for at udtrække handlingen og argumenterne, der er angivet af brugeren. For at gøre dette opretter vi først et handlingsobjekt, der indeholder hver handling som en nøgle. Værdien af ​​hver handlingstast på sin side vil omslutte alle oplysninger relateret til denne handling. Dette design sikrer, at vi kan udvide vores app med flere handlinger, hvis det er nødvendigt. Handlingsobjektet implementeres som følger:

Vi analyserer tekstegenskaber for hvert anmodningsobjekt som følger:

Nu, hvor vi er i stand til at udtrække handlingen, der er beregnet af brugeren, og de leverede handlingsargumenter, kan vi påkalde den rigtige handler og videregive de medfølgende argumenter til handlerfunktionen i den specificerede rækkefølge.

Efter at have opstillet skeletet til vores handlingshåndterer, er det tid til at implementere det. For den handling, vi arbejder på (check), er vi nødt til at:

  • Hent en forekomst af Google-arket, vi arbejder med
  • Få intervallet med dataværdier
  • Søg i e-mail-kolonnen i intervallet for brugerens e-mail
  • Returner det tilsvarende nummer for e-mailen, hvis den findes; ellers returnere null

Her er kodestykket, der hjælper os med at opnå dette:

Nu hvor vi er i stand til at få brugerens nummer på listen, kan vi endelig returnere et svar til vores forventningsfulde bruger. Den interessante del er, at al den kode, du ser ovenfor, vil have udført på mindre end 2 sekunder. Vi kan dele jobbet med at sende et svar i to dele, der komponerer og faktisk sender meddelelsen. Her er en implementering af denne adskillelse af bekymringer:

Indsætte

Ups! Vores løsning er klar. Det er tid til at implementere. Gem scriptet, og klik på Udgiv> Distribuer som web-app på værktøjslinjen. En modal dukker op. Udfyld felterne i modalen som vist nedenfor:

Klik på "Distribuer", så får du et URL-endepunkt, som du kan sende beskeder til. Kopier dette URL-slutpunkt og gå tilbage for at indsætte det i feltet Anmod om URL i din Slack-app's konfiguration. Udløs din app ved at skrive / listbot hvor som helst i arbejdsområdet og se, hvordan systemet kommer til live. Sådan ser det ud for mig:

Det er alt, hvad der er at oprette en Slack bot ved kun at bruge Google Sheets. Hvis du har brug for den fulde version af kodestykkerne, der er præsenteret i denne artikel, skal du tjekke denne Github-repo.

Mange tak for at have taget tid til at læse et så langt stykke. Hvis du kunne lide indholdet af denne artikel og gerne vil have flere til at opdage gode ting som denne, er du velkommen til at klappe artiklen op til 50 gange. Det går langt! Du kan også slå mig op på Twitter @olusola_dev, hvis du har spørgsmål.

Har du brug for at ansætte topudviklere? Tal med Andela for at hjælpe dig med at skalere.
Leder du efter at fremskynde din karriere som udvikler? Andela ansætter i øjeblikket seniorudviklere. Ansøg nu.