Google AppScript es una de esas joyas escondidas que si no bien sustituyen algún software o plataforma como servicio en particular, sí nos ayuda a sacar más provecho a todas esas aplicaciones que Google nos ofrece por defecto al abrir una cuenta de Gmail, tales como Calendar, Drive, Google Docs, Traductor, SpreadSheet, etc…
Porqué qué utilizar Google Appscript
Este lenguaje de Scripting basado en Javascript nos ayuda a que toda la información que generamos, ya sea desde una Google Form, SpreadSheet o Document sea aprovechada al comunicarse con otras Google Apps, que pueden ir de cosas tan sencillas como crear un documento, obtener el número de Mails no leídos, hasta cosas más complejas como enviar, a partir de una plantilla, un documento a todos los usuarios listados en un SpreadSheet, o que SpreadSheet sea una pequeña base de datos que podamos consultar como un servicio REST como se muestra en el siguiente video:
Es compatible con 11 Google Apps como inicio, pero además ofrece comunicarnos con servicios avanzados como Analytics, BigQuery, Youtube, Prediction API, AdSense u otros servicios externos ajenos a Google como JDBC, SOAP, XML y URL Fecth.
Existen 5 tipos de Scripts:
- Standalone Scripts,
- Container-Bound Scripts,
- Spreadsheet Custom Functions,
- Web Apps,
- Google Sites Gadgets.
En este post solo usaremos los primeros dos tipos.
Para generar nuestro primer Script nos dirigimos a Google Drive, de ahí elegimos la opción de Script (Si no aparece, ve a la parte de abajo que dice Connect more Apps y busca Script):
De inmediato, se mostrará una pantalla con algunas opciones para crear un Script, unos siendo plantillas, otros tutoriales, en todos los ejemplos nosotros crearemos un proyecto desde cero:
En la vista general del editor, tendremos las opciones suficientes para trabajar con nuestros scripts, como debugger y autocompletado (Los métodos estan descritos en la documentación oficial: developers.google.com/apps-script/reference/spreadsheet/) .
StandAlone Script
El Código de abajo, nos permite crear un documento que se llame “Hola mundo de AppScript” con un cuerpo de mensaje “Este Documento fue creado a partir de AppScript”, además que la URL del documento la mandamos a un correo electrónico, en este ejemplo en particular lo manda al email del usuario que edita el Script:
Código :
function createAndSendDocument() { //Crear un nuevo Documento de Nombre Hola Mundo de AppScript var doc = DocumentApp.create('Hola Mundo de AppScript'); //Obtenemos el Body del Documento y agregamos un Parrafo doc.getBody().appendParagraph('Este Documento fue creado a Partir de AppScript'); //URL del Documento Generado var url = doc.getUrl(); //Obtenemos nuestro Correo Electronico var email = Session.getActiveUser().getEmail(); //El asunto es el nombre del Documento var subject = doc.getName(); //El cuerpo del correo max 20kb indica la URL de nuestro documento var body = 'Link con tu Documento: ' + url; //Enviamos el correo (: GmailApp.sendEmail(email, subject, body); }
Lo guardamos y al hacerlo nos pedirá un nombre, en este caso lo llamaremos Script 1:
Para correr el script nos dirigimos a la barra superior del editor. El botón en forma de Play será el encargado de correr el script, seguido también tenemos la opción de correr en modo Debugger (los breakpoints se agregan dando click en donde aparece el número de línea) y el selector de la parte derecha, que en este caso solo contiene “myFunction”, servirá para correr la función que queramos (en este caso solo tenemos una, pero pueden ser “n”).
La primera vez que lo corremos, por seguridad, se pide autorización a la cuenta que creó el script, esto para que solo el dueño de la cuenta sea el encargado de manejar el script.
El resultado fue esperado, nos llegó un correo con la liga del Documento y ese documento fue creado desde el Script y guardado en nuestro Google Drive.
Quizás este ejemplo no tiene un valor agregado a hacer esto de manera manual, pero los StandAlone Scripts se aprovechan más cuando usamos “Triggers”. Estos pueden programarse por tiempo, además de recibir notificación si es Script falla.
Container-Bound Script y WebApps
Este ejemplo será más complicado a comparación del anterior. Pero da el mayor contexto de las cualidades de AppScript. A partir de una Google Form formaremos una base de usuarios (Nombre, Twitter, Correo), una vez que dichos usuarios estén en la spreadsheet se les notificará mediante correo electrónico su registro exitoso, pero dicha confirmación será a partir de una plantilla hecha en Document que sustituirá los datos de acuerdo a cada usuario.
Además, mediante esta base de usuarios, se creará un servicio REST con todos los datos hasta el momento, esto para que pueda ser consumido desde un servicio externo.
Lo primero que tenemos que hacer es una Form desde Drive, que contendrá solo tres preguntas: “Nombre”, “Twitter” y “Correo”. Cada uno de esos items se agregan con el botón “Add Item” y el tipo de pregunta para el ejemplo debe ser texto.
Para asegurarnos que todo va bien, en la opción de “View live Form”, tendremos la vista del formulario. Pero debemos crear un enlace de las respuesta a un SpreadSheet, para ello, nos dirigimos al menú “Responses” de ahí buscamos la opción “Choose response destination” que por defecto nos muestra una ventana para crear un nuevo SpreadSheet, le damos crear y ya tenemos nuestro SpreadSheet.
Cada vez que un usuario haga submit a nuestra form, se agrega al SpreadSheet, ahora empezaremos a agregar el Script, nos vamos a Tools y de ahi a Script editor:
La siguiente función va a recibir como parámetro cada usuario nuevo que se agregue, cada uno de sus datos está como parte de un arreglo, por lo que lo separamos, ahora como esta función va a activarse al evento “OnFormSubmit”, es importante darlo de alta en la sección de triggers, por lo lo agregamos con la configuración de “From SpreadSheet” seguido de “On Form Submit” (recordar como se agrega un trigger en el ejemplo de Stand-Alone Script).
Código :
function onFormSubmit(e) { var tiempoRegistro = e.values[0]; var nombre = e.values[1]; var twitter= e.values[2]; var correo = e.values[3]; var docId = DocsList.getFileById(TEMPLATE_ID).makeCopy().getId(); var doc = DocumentApp.openById(docId); doc.setName("Exito al Registrarte "+nombre); var body = doc.getActiveSection(); body.replaceText("%nombre%", nombre); body.replaceText("%twitter%", twitter); doc.saveAndClose(); //Una pausa para el servidor, de no ser así se satura y manda error Utilities.sleep(3000); GmailApp.sendEmail(correo, "Hola! "+nombre+" y Gracias por Registrarte", "Los datos del evento estan aqui:" +doc.getUrl()); }
En el script de arriba olvidé mencionar que previamente debemos crear un Document ya que cada vez que un usuario nuevo llegue, se le manda correo a partir de una plantilla, la plantilla de este ejemplo se encuentra abajo, y va a sustituir %nombre% y %twitter% por el de los usuarios.
El script usa el ID ya que a partir de eso, se hace una copia, el ID de un documento es la cadena que se muestra en rojo.
Lo único que nos falta es consultar los datos de la SpreadSheet como web app, para ello creamos dos funciones, una que cura la información del SpreadSheet y la otra que se encarga de mostrar los datos cuando se consulte como servicio web.
Curando la información
La función “getUsersData” se encarga de obtener toda la información del SpreadSheet y al final, regresar todos los datos en forma de arreglo de Objetos. Cada objeto que corresponde a cada persona, se construye bajo otra función auxiliar llamada “toObject”. Las constantes de HEADER_SIZE y FOOTER_SIZE corresponde a todos esos datos antes y después de lo que nos importa. En este caso HEADER_SIZE = 1 que es lo que describe cada columna:
Código :
function getUsersData() { var ss=SpreadsheetApp.openById(SPREADSHEET_ID); ss.setActiveSheet(ss.getSheets()[0]); var sheet = ss.getActiveSheet(); Utilities.sleep(3000); var data = sheet.getDataRange().getValues(); var total =(data.length)-(HEADER_SIZE+FOOTER_SIZE); var sl = HEADER_SIZE; var il = (total+HEADER_SIZE); var users = []; for(i=sl; i<il; i++){ users.push(data[i]); } var usersData = []; for(i in users){ var row = users[i]; var tiempoRegistro = row[0]; var nombre = row[1]; var twitter = row[2]; var correo = row[3]; var userData= new toObject(tiempoRegistro,nombre, twitter,correo); //creamos un objeto, con cada usuario Logger.log(userData); usersData[i] = userData; } return usersData; } function toObject(tiempoRegistro, nombre, twitter, correo){ this.tiempoRegistro = tiempoRegistro; this.nombre = nombre; this.twitter = twitter; this.correo = correo; }
Publicando como WebApp
Algo importante de mencionar, es que para que alguna funcionalidad de AppScript tenga acceso como Webapp, debemos tener una función que se llame estrictamente doGet(), en este caso lo que hacemos es convertir el arreglo de datos que obtuvimos durante la función getUsersData() a un formato JSON para mejor consulta:
Código :
function doGet() { var datos = getUsersData(); return ContentService.createTextOutput(JSON.stringify(datos)). setMimeType(ContentService.MimeType.JSON); }
Y listo! en el video de abajo muestro el ejemplo funcionando, recuerden que el código se encuentra en github, con los nombres de uno.js y final.js respectivamente. También en el canal de developers de google hay cinco tutoriales en video en español con algunos otros ejemplos.
Al final dejo el video del ejemplo funcionando, cualquier inquietud no duden en preguntar:
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Piero el 07 de Junio de 2014
Por s73b4n el 08 de Junio de 2014
Por thespianartist el 12 de Junio de 2014
Por s73b4n el 27 de Julio de 2014
Por thespianartist el 05 de Agosto de 2014
Por lol el 08 de Agosto de 2014
Por Difer el 24 de Agosto de 2014
Por pedro el 25 de Agosto de 2014
Por thespianartist el 30 de Agosto de 2014
Por Paco el 21 de Septiembre de 2014
Por camerius el 09 de Marzo de 2015
Por Vicragu el 23 de Julio de 2015
Por David el 22 de Agosto de 2015
Por Justino Agustin el 20 de Septiembre de 2015
Por Alfonso el 05 de Abril de 2016
Por mundonet el 15 de Febrero de 2017