Uso de los comandos Slack Slash para enviar datos de Slack a hojas de Google

Desde que trabajo desde casa, la mayoría de mis interacciones diarias ocurren a través de Slack. Es mi equivalente al enfriador de agua. Un lugar para pasar el rato y discutir ideas con amigos.

Soy parte de un canal de recomendaciones de libros. La gente comparte libros todo el tiempo, pero desaparecen rápidamente, perdidos en un mar de mensajes.

Necesitaba una forma de registrar los libros recomendados por la gente.

Así que construí una pequeña aplicación Slack para enviar datos de recomendaciones de libros directamente a una hoja de Google, usando Google Apps Script.

Al final de este tutorial, habrás creado tu propia aplicación Slack para registrar datos en un Google Sheet.

Aquí está en acción:

¿Qué son los Comandos de Slack Slash?

Los Comandos de Slack Slash permiten a los usuarios activar una interacción con su aplicación directamente desde el cuadro de mensaje en Slack.

Escriba la barra inclinada hacia adelante en su cuadro de mensaje Slack y verá la lista de comandos de barra predeterminados:

Por ejemplo, / active, / away, / archive, / invite, / mute, / shrug

son ​​ejemplos de los Comandos Slash Slash.

Al final de este tutorial, habrás creado tu propio Comando Slash. , que aparecerá en esta lista también:

Consulte la documentación de Slack para obtener más información sobre los Comandos de barra.

Uso de los Comandos de Slack Slash para enviar datos a las Hojas de Google

Configuración inicial con Google Hojas de comandos y aplicaciones

Obviamente, para que esto funcione, necesita una hoja de Google para que actúe como almacén de datos, por lo que el primer paso es crear una nueva hoja de Google. Usaremos Apps Script el lenguaje de script basado en Javascript, para agregar funcionalidad a esta hoja de Google.

Luego, abra el editor de Script de aplicaciones en el menú Herramientas: Herramientas> Editor de scripts

Elimine el código de la caldera myFunction () y reemplácelo con las siguientes líneas:

 función doPost (e) {
  if (typeof e! == 'undefined') {
    var ss = SpreadsheetApp.getActiveSpreadsheet ();
    var sheet = ss.getSheetByName ('Sheet1');
    sheet.getRange (1,1) .setValue (JSON.stringify (e));
  }
} 

Cuando su aplicación Slack envía a su aplicación Google Apps Script una solicitud POST HTTP, el Script de aplicaciones ejecuta esta función doPost (e), que pega los datos como una cadena en la celda A1 de la Hoja 1 de su Hoja de Google. [19659002SinembargoantesdequepuedahaceresodeberápublicaresteproyectodeScriptdeaplicacionescomounaaplicaciónweb

Desde la ventana del Editor de secuencias de comandos, elija Publicar> Implementar como aplicación web …

Debe configurar el acceso a " Cualquiera, incluso anónimo ", de lo contrario verá un 401_client_error message en Slack cuando intenta usar el Slash Command.

Cuando hace clic en Deploy, se le solicita que autorice su aplicación.

Cuando esto se completa, aparece una ventana emergente de confirmación con la URL de la aplicación web actual. Copie esto como lo necesitará más adelante en la aplicación Slack.

Más tarde, a medida que realice cambios en el código del script, deberá regresar a Publicar> Implementar como aplicación web … para crear un nueva versión y actualícela:

Ok, esa es la configuración de Google Sheet (por ahora). Volvamos a Slack y creamos una nueva aplicación.

Creando tu aplicación Slack

Dirígete a la página de inicio de Slack API y haz clic en "Comenzar a construir". (Tendrás que iniciar sesión si aún no lo has hecho).

En la ventana emergente "Crear una aplicación Slack", asigna un nombre a tu aplicación y elige el espacio de trabajo Slack al que está adjunto.

Cuando su aplicación haya sido creada, querrá elegir “Comandos de barra” en el menú Características y luego Crear nuevo comando

En la nueva ventana, configure su Slash Command (por ejemplo, / libro) y péguelo en la URL de su aplicación de Google como URL de solicitud:

Haga clic en Guardar .

El último paso es " Instale su aplicación en su espacio de trabajo ”, que se encuentra en el menú Configuración> Información básica en la barra lateral.

Haga clic en Instalar aplicación y en la pantalla siguiente deberá Autorizar la aplicación.

Cuando esté hecho, verás dos marcas de verificación verdes debajo de la Información básica de tu aplicación:

¡Eso es todo lo que has hecho! Fácil, ¿eh?

¡Probémoslo!

Enviando datos de Slack a Google Sheets

En el área de trabajo de la aplicación Slack, ingresa el Comando Slash y el título de un libro, por ejemplo:

/ book the dilema del innovador

Esperamos que vuelvas a tener un lío de HTML confuso y feo en tu buzón de mensajes de Slack. Lo arreglaremos en un momento.

Pero mira tu hoja de Google. Debería ver una larga cadena de datos en la celda A1, con información acerca de su canal de Slack y el título del libro que está enterrado allí.

¡Boom! Eso es lo que buscas.

Eso es lo difícil. El resto son solo detalles. (Pero como sabemos, el diablo está en el detalle, ¿verdad?)

Lo que queda por hacer:

  • Envía un mensaje de confirmación a Slack
  • Analiza el paquete JSON para extraer los datos relevantes (por ejemplo, quién publicó la recomendación y lo que era)

Enviando un mensaje de vuelta a Slack

En este momento, el script no envía una respuesta a Slack para confirmar la recepción de los datos. El usuario recibe un montón de HTML con un mensaje de error. Obviamente, esto no es bueno.

Desea enviar una confirmación a Slack para evitar esto. También puede personalizar este mensaje de retorno con algún texto útil.

Agregue esta línea al código original:

 función doPost (e) {
    if (typeof e! == 'undefined') {
        var ss = SpreadsheetApp.getActiveSpreadsheet ();
        var sheet = ss.getSheetByName ('Sheet1');
        sheet.getRange (1, 1) .setValue (JSON.stringify (e));
    }
    devolver ContentService.createTextOutput (': books :: nerd_face: Gracias por tu recomendación de libro!: tada:');
} 

No olvides crear una nueva versión y actualizar tu aplicación web a través del menú Publicar> Implementar como una aplicación web … .

El : libros: : nerd_face: y : tada: las cadenas se convierten en emojis en Slack, para que el usuario reciba un mensaje de confirmación de recepción:

Analizando los datos en su Google Hoja

De vuelta en su hoja de Google, si observa la larga cadena de datos en la celda A1, puede ver todos los campos que necesita anidados debajo de la clave de parámetros.

Por lo tanto, debes conseguirlo:

 var parameters = e.parameter; 

Entonces es un caso de excavación para obtener lo que necesitas, por ejemplo:

 var bookName = parameters.text; 

El código completo de su aplicación ahora debería tener este aspecto:

 función doPost (e) {
  if (typeof e! == 'undefined') {
    var ss = SpreadsheetApp.getActiveSpreadsheet ();
    var sheet = ss.getSheetByName ('Sheet1');
    var lastRow = sheet.getLastRow ();


    // extraer los datos relevantes
    parámetro var = parámetro e;
    var teamDomain = parameters.team_domain;
    var channelName = parameters.channel_name;
    var userName = parameters.user_name;
    var bookName = parameters.text;
    var date = new Date ();
    var slackDetails = [date,teamDomain,channelName,userName,bookName];

    // pega los detalles de holgura a la hoja
    sheet.getRange (lastRow + 1,1,1,5) .setValues ​​([slackDetails]);
  }
  devolver ContentService.createTextOutput (': books :: nerd_face: Gracias por tu recomendación de libro!: tada:');
} 

Nuevamente, deberá crear una nueva versión y actualizar la aplicación web.

Para publicar datos en la hoja de Google, debe configurar el rango y luego establecer los valores, usando una doble notación de matriz [ [ ]] . Cada matriz interna es una fila de datos.

Intenta publicar una recomendación de libro nuevamente, y la salida en tu Hoja de Google se verá así:

¡Mucho mejor!

Esa es la aplicación básica hecha. Pero aún no es particularmente útil.

Para hacerlo más útil, hagamos la aplicación:

  • Llame a la API de Google Books para obtener detalles adicionales (por ejemplo, portada del libro, autor, número de páginas, enlace de vista previa, etc.)
  • Envíe un mensaje de respuesta completo a Slack.

Obtención de datos de libro de la API de Google Books

La idea aquí es enviar el título del libro a la API de Google Books para obtener algunos datos adicionales, para hacer el archivo más útil. Podemos conectar las Hojas de Google a las API externas usando el Script de Aplicaciones .

Por supuesto, hay muchas formas de estructurar su código, pero he separado la llamada a la API de Google Books en una función separada y lo llamé con el título del libro como argumento.

El corazón de esta nueva función es la llamada a la API de Google Books:

 // función para obtener detalles del libro
función getBookDetails (bookName) {
  // matriz vacía para contener los datos del libro
  var bookData = [];
  tratar {
    // llama a google books api
    var url = 'https://www.googleapis.com/books/v1/volumes?q=' + encodeURI (bookName) + '& country = US';
    respuesta var = UrlFetchApp.fetch (url);
    resultados var = JSON.parse (respuesta);

    // elige el primer libro
    libro var = resultados.items [0];

    // Obtener la información del libro
    var title = book.volumeInfo.title || 'Datos no encontrados';
    var subtitle = book.volumeInfo.subtitle || 'Datos no encontrados';
    var autores = libro.volumeInfo.authors.join () || 'Datos no encontrados'; // unirse para poner varios autores en cadena

    // agregar datos del libro a la matriz
    bookData.push (título, subtítulo, autores);
  }
  atrapar (e) {
    Logger.log ("Hmm, algo salió mal. Sugerencia:" + e);
  }

 // volver a la función principal
 devuelve bookData;
}

Los datos devueltos desde la API de Google Books son una serie de coincidencias que resultan de una búsqueda del nombre del libro que proporcionaste.

La secuencia de comandos selecciona el primer resultado del libro (hey, cuando haya terminado este tutorial, ¿por qué no agregar los botones al mensaje de retorno para permitir que el usuario elija qué libro?) Y luego analiza los campos relevantes. Estos datos se devuelven a la función principal para que se puedan agregar a su Google Sheet.

Actualice la función principal para incluir una llamada a la función getBookDetails, luego concatene las matrices de datos Slack y Book y actualice las referencias de rango para pegar datos en hojas (porque nuestra fila ahora tiene más campos).

 // recupera los detalles del libro
var bookData = getBookDetails (bookName);

// combinar matrices
var fullData = slackDetails.concat (bookData);

// pega los detalles de holgura a la hoja
sheet.getRange (lastRow + 1,1,1, fullData.length) .setValues ​​([fullData]);

Cuando luego actualice y publique una nueva versión, se le solicitará que autorice el archivo de Script de aplicaciones para conectarse a un servicio externo (API de Google Books).

Ahora intente publicar un nuevo título de libro a través de Slack. obtenga una salida como esta en Google Sheets:

¡Una nueva fila de datos con información adicional sobre el libro!

Puede arreglar su Google Sheet agregando títulos y formateando.

Otro toque agradable es agarrar el thumbnail Url para el libro, y se muestra en la Hoja de Google usando la función IMAGEN.

El código completo para este ejemplo, incluidas estas adiciones, está disponible aquí en GitHub .

Enviando un más mensaje complejo de vuelta a Slack

En lugar de solo la línea de texto de la respuesta actual, puede enviar respuestas mucho más ricas a Slack (e incluso agregar interactividad como botones, etc.).

En este caso de Script de aplicaciones, puede crear un objeto JSON y luego devolverlo como una cadena a S

El código para esto es:

 var resultado = {
  'text': ': books :: nerd_face: ¡Gracias por la recomendación de tu libro! : tada: ',
  'archivos adjuntos': [
    {
      'título': bookData [0],
      'author_name': bookData [2],
      'image_url': bookData [3]
    }
  ]
} l

devolver ContentService.createTextOutput (JSON.stringify (resultado)). setMimeType (ContentService.MimeType.JSON);

Ahora, sus usuarios verán un mejor mensaje de respuesta en su ventana Slack:

¿Mensajes de respuesta con retraso?

Slack espera una respuesta a un Comando de barra dentro de 3000 milisegundos (3 segundos), de lo contrario, su usuario verá un " Mensaje de error.

Entonces, si recibe datos de Slack y quiere hacer otras cosas con él, existe el peligro de alcanzar este límite de tiempo de espera.

Para resolver esto, los Comandos de Slack Slash proporcionan una respuesta retrasada URL en el paquete de datos que recibe. La idea es que su aplicación envíe una respuesta inmediata para decir que recibió los datos ("¡Hola, obtuve la recomendación del libro!") Y luego puede responder a la URL de respuesta cuando haya finalizado otras tareas.

Sin embargo, Google Apps Script es sincrónico, por lo que desafortunadamente no hay una manera de usar este patrón de respuesta demorada.

En este ejemplo, sin embargo, la llamada a la API de Google Books es muy rápida ya que los datos involucrados son muy pequeños, por lo que todo sucede de manera instantánea

Sin embargo, vale la pena saber acerca de otras aplicaciones, donde podría ser necesario.

Eso es todo de mi parte.

Es hora de elegir un nuevo libro para leer …

 Ben Collins

Acerca de Ben Collins

Ben Collins es un educador, analista de datos y experto en desarrolladores de Google centrado en G Suite Technology, específicamente Google Sheets, Apps Script y Data Studio. Es el fundador de The Collins School of Data donde el curso más nuevo es Apps Script Blastoff un curso gratuito de introducción para Google Apps Script.

Crea cursos en línea y escribe sobre el trabajo con datos, con un enfoque particular en los tutoriales para análisis de datos, automatización y paneles, utilizando Google Sheets, Apps Script y Data Studio.

Ben enseñó anteriormente Data Analytics para la Asamblea General y comenzó su carrera como contador forense.