Leer emails de Gmail y guardarlos en una planilla de Google

Hagamos una planilla que lea Gmail y acumule los correos que nos interesan sin repetirlos.

Uno de los típicos problemas a la hora de automatizar es como obtener los datos desde otro sistema. Para estos casos el email suele ser un aliado ya que la mayoría de los sistemas permiten enviar correos con información. Así podemos usar el email o Gmail en este caso como bandeja de entrada de la planilla de datos.

Haremos que cada correo que llega con determinadas palabras o remitentes sea introducido en la planilla con lo cual podemos iniciar un flujo de trabajo.

Para que nuestra planilla pueda acumular los correos debemos ejecutar la lectura en forma repetitiva, por lo que tenemos que pensar en un loop que se repita y guarde solo correos nuevos.

Buscar emails que contengan una palabra
Recorrer los hilos y cada email dentro del mismo
Guardar datos en planilla

Buscar emails que contengan una palabra
Recorrer los hilos y cada email dentro del mismo
Guardar datos en planilla (solo los nuevos!)
….
Esto en definitiva es un algoritmo.

// Planilla activa actual
var ss = SpreadsheetApp.getActiveSpreadsheet();
  
var hojaDatos = 'Emails';
var sheet = ss.getSheetByName(hojaDatos);


// Preparamos menu para que el usuario pueda actualizar desde la planilla sin entrar al editor de codigo
function onOpen() {

    // La función onOpen se ejecuta automáticamente cada vez que se carga un Libro de cálculo
    var menuEntries = [];
 
    menuEntries.push({
        name : "Leer Gmail",
        functionName : "leerGmail"
    });
    menuEntries.push(null);

    ss.addMenu("Actualizar", menuEntries);
}


function leerGmail() {

  // Lee de Gmail con un parametro de busqueda
  var emails = leerMails("G Suite");

  // Retorna solo emails nuevos que no estan presentes en la planilla comparando ID
  var emailsNuevos = reducirEmails(emails);

  // Escribe los emails nuevos a la planilla
  escribirEmails(emailsNuevos);

}


function leerMails(searchTerm = 'G Suite') {
  
  var threads = GmailApp.search(searchTerm,0,20);

  var mailsData = [];
    
  // Conversaciones o hilos (threads) que contienen muchos emails
  for (var i = 0; i < threads.length; i++) {
    Logger.log("Each Thread: "+threads[i].getFirstMessageSubject());
    
    var thread = threads[i];
    var messages = GmailApp.getMessagesForThread(thread);

    // Mensajes dentro de conversaciones
    for (var j = 0 ; j < messages.length; j++) {

      mailsData.push(messages[j]);      
      
    }
  }
   
  return mailsData;
}


// Los emails ya presentes en la planilla los descartamos
function reducirEmails(messages) {

  var emailsLimpios = [];
  var arrIdsMails = [];
  
  // IDs ya existentes  
  var arrIdsCells = [];
  
  // Columna A donde tenemos los IDs de los emails
  var dataRange = sheet.getRange(2,1,sheet.getMaxRows()-1,sheet.getMaxColumns());
  
  // Obtenemos los valores de la columna A, o sea un arreglo de IDs
  var dataCurrent = dataRange.getValues();
  
  // Guardamos un arreglo son los IDs que usaremos para comparar con IDs de emails nuevos
  for (var i = 0; i < dataCurrent.length; ++i) {
      
    var row = dataCurrent[i];
    
    // celdas actuales
    var valId = row[0];

    // si encontramos
    arrIdsCells.push(valId);

  }

  // Recorremos cada mensaje
  for (var j = 0 ; j < messages.length; j++) {

    var messageId = messages[j].getId();
    var messageDate = messages[j].getDate();
    var messageTitle = messages[j].getSubject();
    var messageBody = messages[j].getBody();       
    
    // Si no es de los ya existentes
    if (arrIdsCells.indexOf(messageId) == -1 && messageDate != undefined && messageDate != "") {
    
      Logger.log("Insertamos email: " + messageId);
      
      // Guardamos datos de cada email nuevo
      emailsLimpios.push([
        messageId,
        messageDate,
        messageTitle,           
      ]);
        
      // Agregarmos 
      arrIdsMails.push(messageId);
      
    } else {
      Logger.log("Ya existe: " + messageId);
    }

  }

  return emailsLimpios;

}


// Recorrer e insertar en planilla
function escribirEmails(mailsData) {
    
  // calculate the number of rows and columns needed
  var numRows = mailsData.length;

  if (numRows > 0) {
    var numCols = mailsData[0].length;
                      
    // Escribir en filas nuevas antes de la fila 2 (para mantener formato)
    sheet.insertRowsBefore(2, numRows);
    sheet.getRange(2, 1, numRows, numCols).setValues(mailsData);
  }

}

  

twitterpinterest