Comunidad de diseño web y desarrollo en internet

Cómo programar Google Apps con Google Appscript

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…

El único requerimiento para trabajar con la plataforma es tener una cuenta de Gmail, Google for Education o Google Apps for Business y tener en cuenta que estamos limitados a ciertas peticiones por productos.




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.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate