Cómo enviar correos masivos desde Google Sheets con Apps Script

En este tutorial aprenderás a enviar correos electrónicos a múltiples destinatarios desde Google Sheets usando Google Apps Script. Te mostraré cómo enviar el mismo correo a varios correos electrónicos en copia y copia oculta, sin necesidad de escribirlos uno a uno, lo que te ahorrará mucho tiempo si tienes que comunicarte con grupos grandes, como toda tu empresa. Además, veremos cómo manejar listas de correos dinámicas desde una hoja de cálculo y cómo usar funciones avanzadas de JavaScript para optimizar el proceso.

Ahora, vamos a ir construyendo el script para que puedas enviar correos a múltiples destinatarios desde Google Sheets.

Cómo enviar correos a múltiples destinatarios en Google Sheets

La forma más sencilla para enviar un correo a varias personas es separando los correos con comas dentro del parámetro destinatario. Por ejemplo:

GmailApp.sendEmail("correo1@example.com,correo2@example.com,correo3@example.com"; "Asunto"; "Mensaje del correo");

Pero no queremos escribir todos los correos manualmente cada vez, así que podemos usar una variable que contenga todos los correos separados por coma:

var correos = "correo1@example.com,correo2@example.com,correo3@example.com";
GmailApp.sendEmail(correos; "Asunto"; "Mensaje del correo");

Si tienes los correos en celdas separadas, por ejemplo en A1, A2 y A3, y quieres juntar esos correos para enviar el mensaje, puedes concatenarlos así:

var correo1 = "correo1@example.com";
var correo2 = "correo2@example.com";
var correo3 = "correo3@example.com";
var correos = correo1 + "," + correo2 + "," + correo3;
GmailApp.sendEmail(correos; "Asunto"; "Mensaje del correo");

Pero esto se vuelve poco práctico si tienes muchos correos. Por eso, lo ideal es traerlos directamente desde la hoja de cálculo.

Obteniendo correos desde un rango en Google Sheets

Para traer los correos desde un rango, por ejemplo de A1 a A5, usamos el método getRange y luego obtenemos los valores:

var hoja = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Hoja1");
var rangoCorreos = hoja.getRange(1; 1; 5; 1).getValues(); // 5 filas, 1 columna

El problema es que getValues() devuelve un arreglo de arreglos, donde cada elemento es una fila con una o más columnas, así:

ÍndiceValor
0[«correo1@example.com»]
1[«correo2@example.com»]
2[«correo3@example.com»]

Para convertir este arreglo de arreglos en un arreglo simple de correos, usamos la función map para extraer el primer elemento de cada subarreglo:

var arregloCorreos = rangoCorreos.map(function(fila) {
  return fila[0];
});

Luego, juntamos todos los correos en una sola cadena separada por comas usando join:

var correos = arregloCorreos.join(",");

Finalmente, usamos esta variable para enviar el correo:

GmailApp.sendEmail(correos; "Asunto del correo"; "Mensaje del correo");

Ejemplo completo de código para enviar correos a múltiples destinatarios

function enviarCorreosMultiples() {
  var hoja = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Hoja1");
  var rangoCorreos = hoja.getRange(1; 1; hoja.getLastRow(); 1).getValues();
  var arregloCorreos = rangoCorreos.map(function(fila) {
    return fila[0];
  });
  var correos = arregloCorreos.join(",");
  
  var asunto = "Bienvenida a la empresa";
  var mensaje = "Hola a todos, este es un mensaje de bienvenida para toda la empresa.";
  
  GmailApp.sendEmail(correos; asunto; mensaje);
}

Cómo enviar copias y copias ocultas en el mismo envío

La función sendEmail de GmailApp permite agregar opciones avanzadas, entre ellas enviar correos en copia (CC) y copia oculta (BCC). Esto se hace pasando un cuarto parámetro con las opciones en formato objeto.

GmailApp.sendEmail(destinatario; asunto; mensaje; {
  cc: "correoCopia@example.com";
  bcc: "correoCopiaOculta@example.com";
});

Estas listas de correos también deben ir separadas por comas si son múltiples.

Ejemplo para enviar un correo principal y varios en copia oculta

function enviarConCopias() {
  var hoja = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Hoja1");
  var rangoCorreos = hoja.getRange(2; 1; hoja.getLastRow() - 1; 1).getValues(); // Correos desde fila 2 hacia abajo
  var arregloCorreos = rangoCorreos.map(function(fila) {
    return fila[0];
  });
  var correosBCC = arregloCorreos.join(",");
  
  var correoPrincipal = hoja.getRange(1; 1).getValue(); // Primer correo en A1
  var asunto = "Mensaje con copia oculta";
  var mensaje = "Este mensaje se envía con copia oculta a varios destinatarios.";
  
  GmailApp.sendEmail(correoPrincipal; asunto; mensaje; {
    bcc: correosBCC
  });
}

Con este método, el correo principal lo recibirá el primer destinatario y el resto estarán en copia oculta, sin que los demás vean a quién más se envió el correo.

Consideraciones importantes

La función getLastRow() es muy útil para obtener dinámicamente la cantidad de filas con datos, pero debes asegurarte que en la hoja no haya datos dispersos en otras columnas que puedan alterar el conteo de filas. Lo ideal es tener una tabla limpia con solo los correos en la columna que usas para el rango.

Además, para evitar errores, siempre prueba enviando correos a tus propias cuentas o alias antes de enviar a toda la lista.

Resumen y próximos pasos

En este tutorial vimos cómo enviar correos a múltiples destinatarios desde Google Sheets usando Google Apps Script. Aprendimos a:

  • Enviar un correo a varios destinatarios separando los correos con comas.
  • Obtener los correos desde un rango de celdas y convertirlos en una lista para envío.
  • Usar funciones map y join para manejar arreglos en Apps Script.
  • Enviar correos con opciones avanzadas como copia (CC) y copia oculta (BCC).

Te recomiendo practicar estos ejemplos y luego explorar cómo personalizar los mensajes para cada destinatario usando plantillas y datos de la hoja. Si quieres profundizar más en Google Apps Script y automatizaciones con Google Sheets, puedes inscribirte en el curso completo de la academia JuanSGuzman.

Si quieres aprender a usar Google Forms y Google Sheets desde cero, te invito a tomar un curso gratis de 2 horas.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

JuanSGuzman
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.