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);
}
}