fbpx

Enviar un correo puede que parezca una tarea muy simple y rápida si solo tienes que hacerlo una vez. Pero si te encuentras constantemente enviando el mismo correo varias veces los mismos días, con información solamente un poco diferente (por ejemplo, cambiando una cantidad o el nombre), seguramente te has preguntado si no hay forma de automatizar el proceso. Hoy justamente aprenderemos, de una forma muy sencilla y directa, a enviar correos desde una Hoja de Cálculo de Google Sheets.

Preparar la información

En esta guía usaremos código de Apps Script, que es código que puede ejecutarse dentro de nuestra hoja de cálculo y nos da mucha más flexibilidad y funciones para maniobrar tareas como esta. Así podremos usar la información que ya tenemos lista en la hoja de cálculo organizada en filas y columnas, y combinarla para crear el asunto y el cuerpo de un mensaje de correo que se enviará desde aquí mismo.

Supongamos entonces que tenemos esta información sobre una persona a la que hay que enviarle un correo. Ya preparamos el cuerpo del mensaje y el asunto usando las columnas disponibles, pensando en que tal vez después querríamos agregar más filas para enviar correos similares y solamente cambiar los nombres

Código básico para enviar correos en Google Sheets

Lo que sigue, es preparar el código que permitirá enviar el correo. Entonces primero vamos al menú Herramientas – Editor de secuencias de comandos:

Esto nos abrirá el editor de código de Apps Script de esta hoja de cálculo. Comencemos por borrar el código que nos aparece por default, porque lo vamos a reemplazar por este otro:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();

function onOpen() {  
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Correos')
      .addItem('Enviar correo', 'enviarCorreos')
      .addToUi();
}

function enviarCorreos() {
  // Rango A2:F2
  var dataRange = sheet.getRange("A2:F2");
  var data = dataRange.getValues();

  var fila = data[0];

  var nombre = fila[0];
  var correo = fila[1];
  var cantidad = fila[2];
  var asunto = fila[3];
  var mensaje = fila[4]
  var enviado = fila[5];

  if(enviado != "Enviado") {
    MailApp.sendEmail(correo, asunto, mensaje);
    sheet.getRange("F2").setValue("Enviado");
    // Recomendado por Google para obligar a la hoja a actualizarse
    SpreadsheetApp.flush();
  }
}

Vamos paso a paso a explicar cada parte del código, para que quede súper claro.

Primero, obtenemos los objetos de la hoja de cálculo principales para poderla manipular y también agregamos un menú a la interfaz gráfica, que simplemente ejecutará la función enviarCorreos al utilizarlo:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();

function onOpen() {  
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Correos')
      .addItem('Enviar correo', 'enviarCorreos')
      .addToUi();
}

Luego, ya en la función enviarCorreos(), primero definimos el rango que vamos a tomar para trabajar, que por ahora solo incluye la fila donde tenemos datos, y guardamos los valores de ese rango en una variable:

  var dataRange = sheet.getRange("A2:F2");
  var data = dataRange.getValues();

Como solo tenemos una fila por el momento, para demostrar desde lo más básico sin meternos en detalles de programación, equiparamos esta variable a los valores que acabamos de tomar en data:

  var fila = data[0];

Después, hacemos una variable por cada campo que tenemos, aunque no los usemos todos propiamente, vale la pena verlos así para demostrar y aprender. Fíjate cómo el arreglo de valores empieza en 0.

  var nombre = fila[0];
  var correo = fila[1];
  var cantidad = fila[2];
  var asunto = fila[3];
  var mensaje = fila[4];
  var enviado = fila[5];

Luego vamos a revisar si en la celda de «Status» correspondiente a esta fila, tenemos escrita la palabra «Enviado», esto como una prevención de envío de duplicados. Si ya está ese valor escrito, no entramos a este condicional.

  if(enviado != "Enviado") {

Ahora sí, esta es la parte que estábamos esperando ver, en la que utilizamos la clase MailApp y su método sendEmail para enviar un correo, usando los 3 argumentos principales: correo, asunto y mensaje, que ya teníamos definidas antes como variables. Realmente todo lo que llevamos hecho es para poder ejecutar esta sencilla línea:

  MailApp.sendEmail(correo, asunto, mensaje);

Por último, escribimos la palabra «Enviado» en la celda que corresponde, para que, en la revisión que hacemos al principio de este condicional, si se vuelve a ejecutar, no se envíe un duplicado. O bien, si se necesita reenviar, solamente habrá que borrar la palabra Enviado de la hoja.

  sheet.getRange("F2").setValue("Enviado");

Probando el código para enviar un correo desde Google Sheets

Guardamos nuestro código, y damos click en Ejecutar una vez para que nos pida los permisos correspondientes:

Esto es prácticamente todo, con esa función puedes enviar correos fácilmente y adaptar el código para tus propias necesidades. Si guardas el código y refrescas la hoja, debes ver tu nuevo menú Correos – Enviar correo

Al ejecutar esta función, verás cómo se pone a trabajar el código que hicimos, y si todo salió bien, se escribirá la palabra «Enviado» en el lugar correspondiente y se habrá enviado el correo a la dirección en cuestión, con el mensaje que definimos.

Te recomiendo revisar la documentación oficial de MailApp por si quieres hacer cosas más avanzadas como enviar archivos adjuntos o imágenes, o mostrar una dirección diferente como remitente (en este ejemplo básico, aparecerá siempre el correo de la persona dueña de esta hoja de cálculo). Recuerda que en Apps Script puedes escribir toda tu lógica en JavaScript.

Código para enviar varios correos

Como bonus, te dejo el código actualizado de la función enviarCorreos() que contempla el envío de varios correos suponiendo que cada fila en nuestro ejemplo es un mensaje diferente. Solamente hay que usar un ciclo de programación para iterar la hoja:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var dataRangeAll = sheet.getDataRange();
var ultimaFila = dataRangeAll.getLastRow();

function onOpen() {  
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Correos')
      .addItem('Enviar correos', 'enviarCorreos')
      .addToUi();
}

function enviarCorreos() {
  var filaInicial = 2;
  var dataRange = sheet.getRange(filaInicial, 1,ultimaFila, 6);
  var data = dataRange.getValues();

  for(var i=0; i< data.length; i++){
    var fila = data[i];

    var nombre = fila[0];
    var correo = fila[1];
    var cantidad = fila[2];
    var asunto = fila[3];
    var mensaje = fila[4];
    var enviado = fila[5];

    // Revisamos que no esté ya "Enviado" el correo y que la fila tenga información en la columna del correo, para no tomar en cuenta filas en blanco sobrantes
    if(enviado != "Enviado" && correo != "") {
      MailApp.sendEmail(correo, asunto, mensaje);
      sheet.getRange(filaInicial + i,6).setValue("Enviado");
      // Recomendado por Google para obligar a la hoja a actualizarse
      SpreadsheetApp.flush();
    }
  }
}

Límites de envío de correos en Google Sheets

Una cosa que debes tomar en cuenta, es que esta función tiene límites sobre cuántos correos puedes enviar por día. Esta información se actualiza constantemente, pero puedes revisarla en estos dos links:

Si tienes una lista de más de 2000 mensajes a enviar, probablemente sea mejor que consideres una opción diferente que escale a tus necesidades, como SendGrid o MailChimp.

Guía en video

Si tienes dudas puedes ver esta misma guía explicada en video:

¡Espero que te haya sido útil esta guía! No olvides seguirnos en YouTube para más tips, trucos y guías de productividad.