Comment construire un Slack Bot avec seulement Google Sheets

Source: BetterCloud

TL; DR

Dans cet article, je discute de la façon de développer une application Slack sans serveur qui lit les informations d'une feuille Google et les renvoie à un utilisateur.

Histoire de fond

J'ai la chance de travailler pour une entreprise qui se préoccupe tellement du bien-être de ses employés. L’un des avantages que la société offre à ses employés est un centre d’hébergement avec services complets. Lorsque de nouveaux employés demandent une place dans l’hébergement, ils sont généralement ajoutés à une liste d’attente. Cette liste d'attente est mise à jour manuellement dans les coulisses lorsque de l'espace est disponible.

Les employés qui souhaitent obtenir des mises à jour sur leur statut sur la liste d'attente doivent généralement envoyer un message à un membre de l'équipe des installations, puis attendre une réponse. L'équipe des installations fait du bon travail pour garder tout le monde à jour lorsqu'il demande des mises à jour. Cependant, ce n’était pas un processus très efficace. J'ai eu l'idée d'automatiser ce processus avec un bot Slack un week-end, lorsque je devais obtenir des mises à jour sur mon statut d'attente et que le collègue auquel je devais envoyer un message n'était pas disponible. L'idée semblait excitante puisque nous avons tous utilisé Slack pour la communication à l'échelle de l'entreprise.

La semaine suivante, j'ai discuté avec un membre de l'équipe des installations chargé de l'attribution des espaces. Elle était enthousiasmée par cette idée et par la manière dont cela l’aiderait à gagner un temps précieux pour d’autres tâches. Nous avons pu parvenir à un consensus sur l’automatisation du processus par un robot. Le bot prendra le courrier électronique de l'utilisateur en tant qu'entrée, lira les données de la feuille Google contenant les informations d'attribution, puis informera l'utilisateur de son numéro actuel sur la liste.

Le reste de cet article explique comment j'ai créé ce bot.

Concevoir une solution

Pour commencer à concevoir la solution, voici les exigences fonctionnelles et non fonctionnelles qui définissent l'étendue du problème et guident la solution.

Exigences fonctionnelles

  • Le système (application Slack et dépendances) comporte une commande accessible de n’importe où dans l’espace de travail Slack.
  • Le système accepte le courrier électronique de l'employé en tant qu'entrée
  • Le système compare le courrier électronique de l'employé à son numéro figurant dans la liste et renvoie des informations sur le numéro.
  • Le système renvoie une réponse appropriée si la saisie est invalide ou introuvable dans la liste.

Prérogatives non fonctionnelles

  • La disponibilité du système est presque de 100% (elle peut donc être utilisée à tout moment, même le week-end)
  • Le système répond rapidement aux demandes des utilisateurs
  • Le système est capable d'exécuter plusieurs demandes simultanément sans bloquer
  • Le système n'a aucun coût de maintenance.

Recherche des options disponibles

Dans cette partie, nous explorons les options disponibles pour répondre à nos exigences.

Exigence fonctionnelle n ° 1

Notre première exigence est d’avoir une commande spécifique disponible partout dans l’espace de travail. Un rapide coup d'œil dans la documentation de l'API Slack montre qu'il existe deux manières simples d'y parvenir:

  • Webhooks sortants
  • Commandes slash

Pour nous aider à choisir entre ces deux alternatives, nous notons que les Webhook sortants vont devenir obsolètes dans les futures versions de l'API Slack. Ils ne sont pas non plus disponibles dans un espace de travail Slack car ils sont généralement à l'écoute sur un canal spécifique. Ce dernier comportement enfreint notre première exigence fonctionnelle, qui stipule que la commande doit être disponible dans tout l'espace de travail. Il est également important de noter que les webhook sortants convertissent automatiquement les adresses électroniques en liens mailto, ce qui complique l'analyse des adresses électroniques envoyées au serveur. Les commandes slash, d’autre part, n’ont aucune de ces limitations et constituent la solution évidente à la première condition. J'ai d'abord appris l'existence de l'approche Webhook à partir de cet article traitant d'un sujet similaire.

Exigence fonctionnelle n ° 2

Notre deuxième exigence est que le système accepte le courrier électronique de l’employé comme entrée. Cette exigence signifie que nous devons définir / concevoir une interface permettant à l'employé de spécifier son adresse électronique. Étant donné que nous utilisons des commandes slash, nous sommes bloqués avec une interface de commande. Notre meilleur atout est de concevoir une interface de commande intuitive et raisonnable. En parcourant à nouveau les documents de l'API Slack, une commande slash typique prend la forme suivante:

/ todo demander à @crushermd de faire un gâteau d'anniversaire pour @worf dans # d-social

Dans la ligne de commande ci-dessus, todo est la commande et le reste de la phrase est le texte. Une conception raisonnable pour notre commande slash suivant cette structure sera:

/ listbot check randomuser@gmail.com

Listbot déclenche notre application et passe le texte qui contient une action de vérification et un argument randomuser@gmail.com. J'ai choisi cette structure car elle présente des similitudes avec la manière dont nous utilisons les commandes sur les CLI classiques. Par exemple, git add myfile.txt.

Exigence fonctionnelle n ° 3

Notre troisième exigence fonctionnelle est que le système puisse vérifier le courrier électronique de l'employé sur une feuille Google et renvoyer le numéro associé au courrier électronique. Pour répondre à cette exigence, nous avons besoin d’une sorte de backend recevant notre commande de Slack et capable de lire les données à partir de feuilles de Google. Comment fait-on cela? Dans mon cas, j'avais déjà aidé un client à automatiser certaines tâches sur des feuilles de Google, donc je connaissais la réponse. Mais je crois qu’un peu de recherche sur Google est tout ce qu’il faudra pour arriver à Google App Scripts. Il s’agit d’une plate-forme basée sur javascript qui nous aide à étendre la puissance de Google Apps (dont 1 feuille).

Avec un script Google App, nous pouvons lire les données d'une feuille de Google. Cela résout la première partie de notre troisième exigence fonctionnelle. Il est également intéressant de noter que nous pouvons déployer le script en tant qu’application Web, ce qui résout efficacement la deuxième partie de nos besoins fonctionnels. Voila! Notre troisième exigence fonctionnelle est satisfaite. Le principal avantage de l'utilisation du script Google App ici est qu'il répond également à toutes nos exigences non fonctionnelles.

Remarque: une solution alternative aurait été de configurer un serveur Node.js sur une instance gratuite de Heroku Dyno et d'utiliser l'API Google Sheets pour lire les données de notre feuille Google. Mais les dynos gratuits Heroku peuvent aimer dormir beaucoup, ce qui ne répond pas à nos besoins non fonctionnels en matière de réponses rapides et de temps de disponibilité proche de 100%. Bien entendu, Heroku n'est pas le seul fournisseur de PaaS disponible. Mais les niveaux gratuits de la plupart des autres fournisseurs ont généralement des limitations similaires et sont relativement exagérés pour un bot aussi simple.

Exigence fonctionnelle n ° 4

Notre quatrième exigence fonctionnelle n’est autre que la logique qui sera exécutée dans notre script Google App. Donc, cela est satisfait aussi.

la mise en oeuvre

Pour commencer à mettre en œuvre notre solution, nous aurons besoin de la configuration d’environnement suivante:

Configuration de l'environnement

  • Un espace de travail Slack auquel vous avez un accès administrateur (visitez slack.com pour en créer un).
  • Une feuille Google avec la structure de colonne ci-dessous (il s'agit d'une version simplifiée de la feuille réelle)

Slack App Setup

Après avoir configuré l'environnement, nous devons créer notre application Slack et la configurer. Le processus pour ce faire est assez facile et est expliqué en détail dans la documentation de l'API Slack. Voici un aperçu des étapes à suivre:

  • Cliquez sur le bouton "Démarrer la création" CTA sur la page d'accueil de l'API. Cela affichera un modal dans lequel vous spécifiez le nom de l'application et l'espace de travail sur lequel vous souhaitez l'installer.
  • Dans la page suivante, sélectionnez «Commandes Slash» dans la section «Ajouter des fonctionnalités et des fonctionnalités». Cela vous conduira à une page qui vous permettra de configurer la commande Slash. Configurez comme indiqué ci-dessous:

Remarque: ne cochez pas la case "Chaînes d'échappement, utilisateurs et liens envoyés à votre application". Cela nous permettra d’obtenir le texte brut des courriels. En outre, laissez le champ URL de la demande vide. Nous remplirons le champ lorsque nous déploierons notre script d'application Google.

Traitement des demandes de Slack avec Google Apps Script

Pour commencer à utiliser Google Apps Script, ouvrez la feuille Google que vous avez créée précédemment. Dans la barre d’outils, cliquez sur Outils> Editeur de script. Votre navigateur devrait ouvrir une nouvelle page contenant l’éditeur de script. C'est ici que nous allons créer notre script Google App.

Remarque: vous pouvez également créer un script Google App autonome. Cette méthode ne correspond toutefois pas au titre de cet article.

Pour traiter les demandes de Slack, nous devons:

  • Obtenir le corps de la demande
  • Analyser le corps de la requête
  • Acheminer la demande de l'utilisateur au gestionnaire de droite
  • Faire en sorte que le gestionnaire traite la demande de l'utilisateur et renvoie le résultat de l'opération
  • Envoyer une réponse à l'utilisateur

Remarque rapide pour le lecteur: le script Google Apps ne prend pas en charge ES6 + pour le développement.

Pour obtenir le corps de la demande, nous capturons les données publiées dans la fonction doPost () comme suit:

Après avoir récupéré le corps de la demande et l'avoir converti en objet simple, notre objet req aura la forme suivante:

Nous pouvons ensuite passer à l'étape suivante d'analyse de la propriété text de l'objet req afin d'extraire l'action et les arguments spécifiés par l'utilisateur. Pour ce faire, nous créons d’abord un objet actions contenant chaque action sous forme de clé. La valeur de chaque clé d'action encapsulera à son tour toutes les informations liées à cette action. Cette conception garantit que nous pouvons étendre notre application avec plus d’actions si nécessaire. L'objet actions est implémenté comme suit:

Nous analysons la propriété text de chaque objet request comme suit:

Maintenant que nous sommes en mesure d'extraire l'action voulue par l'utilisateur et les arguments d'action fournis, nous pouvons appeler le gestionnaire de droite et transmettre les arguments fournis à la fonction de gestionnaire dans l'ordre spécifié.

Après avoir configuré le squelette de notre gestionnaire d’actions, il est temps de le mettre en œuvre. Pour l’action sur laquelle nous travaillons (contrôle), nous devons:

  • Récupérer une instance de la feuille Google avec laquelle nous travaillons
  • Obtenir la plage de valeurs de données
  • Recherchez dans la colonne de courrier électronique de la plage le courrier électronique de l'utilisateur.
  • Renvoyer le numéro correspondant à l'email si trouvé; sinon retourne null

Voici l'extrait de code qui nous aide à atteindre cet objectif:

Maintenant que nous pouvons obtenir le numéro de l'utilisateur sur la liste, nous pouvons enfin renvoyer une réponse à notre futur utilisateur. La partie intéressante est que tout le code que vous voyez ci-dessus aura été exécuté en moins de 2 secondes. Nous pouvons diviser le travail d’envoi d’une réponse en deux parties: la composition et l’envoi du message. Voici une mise en œuvre de cette séparation des préoccupations:

Déployer

Oups! Notre solution est prête. Il est temps de se déployer. Enregistrez le script et dans la barre d’outils, cliquez sur Publier> Déployer en tant qu’application Web. Un modal apparaîtra. Remplissez les champs dans le modal comme indiqué ci-dessous:

Cliquez sur "Déployer" et vous obtiendrez un point de terminaison d'URL sur lequel vous pourrez poster des messages. Copiez ce point de terminaison d'URL et revenez-le pour le coller dans le champ URL de la demande de la configuration de votre application Slack. Déclenchez votre application en tapant / listbot à partir de n’importe où dans l’espace de travail et regardez le système prendre vie. Voici à quoi ça ressemble pour moi:

C’est tout ce qu’il ya à créer un bot Slack en utilisant uniquement Google Sheets. Si vous avez besoin de la version complète des extraits de code présentés dans cet article, consultez ce dépôt Github.

Merci beaucoup d'avoir pris le temps de lire un long article. Si vous avez aimé le contenu de cet article et que vous souhaitez que plus de personnes découvrent de telles bonnes choses, n'hésitez pas à les publier jusqu'à 50 fois. Cela ira un long chemin! Vous pouvez également me contacter sur Twitter @olusola_dev si vous avez des questions.

Avez-vous besoin de recruter les meilleurs développeurs? Parlez à Andela pour vous aider à évoluer.
Souhaitez-vous accélérer votre carrière de développeur? Andela recrute actuellement des développeurs seniors. Appliquer maintenant.