En este artículo vemos como enviar un correo electrónico de nuestra cuenta de Gmail desde Google Sheets con la ayuda de Google Apps Scripts (GAS).
¿Por qué enviar un correo desde Sheets?
La primera pregunta que nos podemos hacer es ¿Para qué tendría que enviar un correo desde Google Sheets pudiéndolo hacer desde Gmail u Outlook?
Estas son las situaciones en donde se me ocurre sería más eficiente enviar un correo desde Sheets
- Cuando queramos enviar el mismo correo a muchas personas al tiempo
- Cuando queramos enviar el mismo correo, pero cambiando alguna variable, para que quede más personalizado: el nombre, el tema, el producto, etc.
- Cuando queramos programar este correo repetitivo pero en distintas horas
- Cuando queramos enviar un mail cada vez que pase algo específico o se cumpla alguna condición: cuando chequeemos una casilla de verificación, o presionemos un botón, o recibamos un formulario
Para enviar correos necesitamos obligatoriamente la ayuda de Google Apps Script (GAS).
Enviar un correo automático desde Google Apps Script
Entonces lo primero que vamos a hacer es enviar un correo sencillo directamente desde Google Apps Script.
Para esto vamos a abrir un archivo de Apps Script así:
- Entramos en nuestro Google Drive
- Damos clic en el botón de «+»
- Escogemos «más»
- Escogemos «Google Apps Script»
Ahora podemos darle un título como «Enviar mail»
En este punto deberían ver algo como esto:

Nota: A finales del 2020 el editor cambió a una imagen más amigable como la que vemos en las nuevas imágenes.
Ahora cambiémosle el nombre a nuestra función por algo mejor, como enviarMail.
Para enviar un mail nos vamos a conectar con Gmail, para esto llamamos al servicio «GmailApp». (Nota: También se puede hacer con el servicio MailApp. Para envíos de mails da exactamente lo mismo)
Después ponemos un punto y GAS nos da sugerencias de lo que podemos hacer con código desde GmailApp.
Por ahora solo nos interesa enviar un correo muy sencillo, entonces vamos a escoger el método sendEmail.
GmailApp.sendEmail(recipient, subject, body)
Donde:
- recipient es el correo electrónico de destino
- subject es el asunto
- body es el cuerpo del mensaje
Como por ahora vamos a hacer una primera prueba muy sencilla, solo vamos a cambiar los argumentos predeterminados por datos escritos directamente y así probar este sencillo código.
Para esta prueba puedes escoger tu correo electrónico preferido, un asunto y un mensaje. En mi caso sería:
GmailApp.sendEmail("guzman.sheets@gmail.com", "Mi Primer correo desde GAS", "Es demasiado fácil!");
Ahora vamos a guardar y le damos «ejecutar».
La primera vez que lo corramos nos va a pedir que le demos autorización a Gmail para enviar correos. Lo hacemos así:
- Damos clic en «Revisar permisos»
- Escogemos nuestra cuenta de Google
- Nos aparece un mensaje que dice «Este app no se verificó»
- Damos clic en Configuración Avanzada
- Después bajamos y en el último renglón damos clic en «Enviar mail» (o como hayan llamado a su archivo)
- Y ahora si por fin podemos dar clic en Permitir para dar el permiso a Gmail
Un poco largo ¿no?
Lo bueno es que es solo lo debemos hacer la primera vez que lo ejecutamos en nuestro archivo.
Ahora probemos que efectivamente nos ha llegado, o si lo enviamos a otro correo que no sea el nuestro, podemos ir a la carpeta «Enviados» para verificar

Si quieres entrar a profundidad en todas las opciones de envío de correo con Google Apps Script, en la academia encuentras un Curso Completo Básico de Envío de correos
Enviar correo desde Google Sheets
El siguiente paso es poder escribir ciertas variables en celdas de Google Sheets y que el mail que envíe se escriba a partir de estas variables
Entonces lo primero que vamos a hacer es convertir nuestros textos directos en variables

function enviarMail() {
var mail = "guzman.sheets@gmail.com";
var asunto = "Mi Primer correo desde GAS";
var mensaje = "Es demasiado fácil!";
GmailApp.sendEmail(mail, asunto, mensaje);
}
Es bueno que vayamos probando ejecutándolo siempre, cada vez que hagamos algún cambio, así es más fácil identificar errores de manera temprana.
Fíjate que aquí lo único que hicimos es poner nuestras cadenas de texto en variables y reemplazar estas variables en nuestra función de envío de mail.
Ahora entonces nos queda fácil conectarnos con Sheets y asignar a cada una de estas variables un valor de una casilla o celda de Sheets.
Vámonos entonces a crear un nuevo archivo de Sheets, así:
- Entramos en nuestro Google Drive
- Damos clic en el botón de «+»
- Escogemos «Hoja de Cálculo de Google»
En la única pestaña, vamos a asignar una columna para el correo, una para el asunto y una para el mensaje, así:

Acuérdate que este artículo lo iniciamos creando un nuevo archivo de Google Apps Script. Si vamos a seguir usando este archivo, nos tenemos que «conectar» con nuestro nuevo archivo de Sheets.
Una mejor opción es volver a crear nuestro código, pero desde el archivo de Sheets que acabamos de crear. Para esto nos vamos a:
- Vamos al menú de «Herramientas»
- Escogemos la opción «<> Editor de Secuencia de Comandos»
- En la nueva ventana que nos aparece, damos un título a nuestro proyecto.
- Copiamos el código que ya hicimos a este nuevo proyecto de GAS
Ahora vamos a mejorar nuestro código
Primero, para conectarnos a nuestra hoja de Sheets usamos la siguiente línea:
var hoja = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Hoja 1");
Si siguen trabajando desde el proyecto independiente de GAS, pueden conectarse a un Sheets con esta variación.
var hoja = SpreadsheetApp.openById("1YmMXc3CRj-7uEBM06zRXyoVFKpB7nN0I9xMxIX4uVEI").getSheetByName("Hoja 1");
Ese código raro lo sacan del navegador donde tienen su archivo de Sheets

Y ahora vamos a traer el valor de cada una de nuestras columnas con la ayuda de la función getRange() y su método getValue().
Una primera opción es usar la notación clásica de Sheets, así:
var mail = hoja.getRange('A2').getValue();
var asunto = hoja.getRange('B2').getValue();
var mensaje = hoja.getRange('C2').getValue();
Una alternativa un poco más flexible es identificar las celdas por su fila y columna dentro de getRange(), así:
var mail = hoja.getRange(2,1).getValue();
var asunto = hoja.getRange(2,2).getValue();
var mensaje = hoja.getRange(2,3).getValue();
Donde la fila es siempre la misma para todos (2) y la columna va cambiando.
Esto nos da un indicio para después poder enviar varios correos, donde podriamos construir un ciclo que vaya cambiando la fila.
Aquí ya nos debería quedar funcionando.
¡Probémoslo de nuevo!
Antes de poder enviar otra vez nos va a pedir una autorización, pero ahora de Sheets. Aquí seguimos los mismos pasos mencionados arriba
Código para enviar un correo básico desde Google Sheets
Y eso es todo. Una forma muy fácil de enviar un mail con datos de Sheets. Aquí les dejo el código completo
function enviarMail() {
var hoja = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var mail = hoja.getRange(2,1).getValue();
var asunto = hoja.getRange(2,2).getValue();
var mensaje = hoja.getRange(2,3).getValue();
GmailApp.sendEmail(mail, asunto, mensaje);
}
Recuerda que lo único que cambia cuando lo haces como un archivo independiente de Sheets es la primera línea. Este es el código para un archivo de Scripts independiente
function enviarMail() {
var hoja = SpreadsheetApp.openById("1YmMXc3CRj-7uEBM06zRXyoVFKpB7nN0I9xMxIX4uVEI").getSheetByName("Hoja 1");
var mail = hoja.getRange(2,1).getValue();
var asunto = hoja.getRange(2,2).getValue();
var mensaje = hoja.getRange(2,3).getValue();
GmailApp.sendEmail(mail, asunto, mensaje);
}
Reemplazando el código 1Ym… por el código de tu archivo
Suscríbete para acceder al curso «Descubriendo el poder de Google Sheets» y empezar tu camino a la maestría de Sheets, Forms y Apps Script
Enviar un correo a cualquiera de nuestros contactos
Ahora vamos a llevarlo un paso más allá y volverlo más práctico, incluyendo un menú especial, para que podamos seleccionar cualquiera de nuestros contactos y enviar un correo a ese contacto.
Para esto vamos a crear un nuevo archivo y un nuevo código.
Para lo que queremos hacer, necesitamos:
- Una base de contactos donde una columna sea el correo electrónico, y el resto son variables que vamos a usar para construir nuestro email
- Una plantilla que contenga las variables
- Un menú especial con la opción de enviar mail
- El código que envíe el mail
Vamos uno por uno:
Base de contactos
Vamos a cambiar un poco nuestro Sheets, porque no es tan realista. Es mas común una base como la que ven abajo, donde tenemos campos como:
- Correo electrónico
- (Opcional) Variables para poder personalizar nuestro correo. Ejemplo de estas variables pueden ser:
- Nombre
- Apellido
- Edad
- Producto Comprado
- Dirección
Para nuestro ejemplo, esta es la base:

Plantilla
La plantilla podría hacerse de distintas maneras, entre otras:
- Directamente en el código
- En una celda de Sheets
- En un documento de texto de Google Docs
- En un html que se edita en el editor de Google Apps Script
Para esta ocasión lo vamos a hacer desde una celda de nuestro Sheets.
En nuestro ejemplo creamos una pestaña llamada «Plantilla» y en la celda A3, depositaremos nuestra plantilla

Importante ver los nombres de las variables que vamos a modificar desde nuestro código, con los datos del contacto en cuestión.
Fíjate que pongo los nombres de las variables entre doble corchetes. Esto lo hago para que no haya posibilidad de que se confundan las variables con alguna parte del texto del correo.
Menú
Vamos ahora a crear un menú personalizado para poder enviar nuestro mail con una opción fácil de acceder.
Para esto vamos a crear una nueva función llamada «crearMenu» desde la cual vamos a crear un menú llamado Acciones y después vamos a crear una opción «Enviar mail a contacto actual» y por último ejecutamos la función «enviarMailActual», la cual no hemos creado aun
function onOpen() {
crearMenu();
}
function crearMenu(){
const miMenu = SpreadsheetApp.getUi().createMenu("Acciones");
miMenu.addItem("Enviar Mail a contacto actual 📧", "enviarMailActual").addToUi()
}
Aquí pueden ver todo acerca de crear menus personalizados
El código lo vamos a dividir en cuatro partes:
- Variables de configuración
- Identificar la celda en la que usuario está al momento de presionar el botón
- Inserta los valores de cada variable en la plantilla.
- Si no hay correo electrónico en la fila, sale una alerta
- Si está en una fila con correo electrónico, envía el correo.
- Pone un OK en la última casilla y muestra un mensaje de éxito
Vamos uno por uno:
Variables de Configuración
Necesitamos saber:
- Como se llama la base donde están mis contactos (nombreBase).
- Cuantas filas de encabezado hay (filaEncabezado).
- En que columna está el correo (colCorreo).
- En que columna están las demás variables (colNombre, colProd, colFecha, colValor, colTipo).
- En que columna vamos a poner la confirmación de que el correo se envió (colConfirmación).
- Cuál va a ser el texto del asunto, si no es variable (asunto).
- El texto de mensaje de alerta cuando no hay un correo electrónico.
- El texto de mensaje de confirmación cuando haya un envío exitoso.
// Variables de configuracion
const nombreBase = "BD"
const filaEncabezado = 1
const colCorreo = 1;
const colNombre = 2;
const colProd = 3;
const colFecha = 4;
const colValor = 5;
const colTipo = 6;
const colConfirmacion = 7;
const asunto = "Confirmacion compra curso en JuanSGuzman";
const mensajeAlerta = "No hay un correo válido. El mail no pudo ser enviado";
const mensajeExito = "Su correo fue enviado exitosamente";
Todo lo anterior será personalizado para tu proyecto específico
Identificar la celda
Lo primero que vamos a hacer es identificar la celda donde el usuario está ubicado, y vamos a guardar la fila correspondiente a esa celda. La idea es que el usuario pueda ubicarse en cualquier columna de la fila donde está el contacto al que quiere enviar el correo.
const archivo = SpreadsheetApp.getActiveSpreadsheet();
var activa = hoja.getActiveCell();
var filaActiva = activa.getRow();
Guardar las variables
Ya teniendo la fila, podemos pasar a guardar las variables correspondientes. En nuestro caso son el correo, el nombre, el producto, la fecha, el valor, y el tipo
Esto se hace con el método .getRange(), siempre con nuestra filaActiva y con la columna correspondiente, que ya definimos al definir las variables
var correo = hoja.getRange(filaActiva,colCorreo).getValue();
var nombre = hoja.getRange(filaActiva,colNombre).getValue();
var prod = hoja.getRange(filaActiva,colProd).getValue();
var fecha = hoja.getRange(filaActiva,colFecha).getValue();
var valor = hoja.getRange(filaActiva,colValor).getValue();
var tipo = hoja.getRange(filaActiva,colTipo).getValue();
Reemplazar los valores de las variables en la plantilla
Ahora vamos a usar esas variables que acabamos de sacar de la fila, y las vamos a reemplazar en nuestra plantilla del mensaje
var mensaje = plantilla
.replace("{{correo}}",correo)
.replace("{{nombre}}",nombre)
.replace("{{producto}}",prod)
.replace("{{fecha}}",fecha)
.replace("{{valor}}",valor)
.replace("{{tipo}}",tipo);
Nota: Si tienes más de una vez alguna de las variables en la plantilla, debes volver a poner el replace para esa variable
Vamos a poner un condicional, para que si no hay valor en la celda del correo electrónico muestra un mensaje de error. Esto lo hacemos con el método Spreadsheet.getUi().alert()
if(correo==""){
SpreadsheetApp.getUi().alert(mensajeAlerta)
}
De lo contrario, va a enviar el correo con el método sendEmail que ya vimos al comienzo de este artículo.
Después de enviarlo vamos a usar el método setValue para poner en la columna de confirmación que el correo se envió correctamente.
Por último vamos a generar una alerta de que el mensaje se envió correctamente
else{
GmailApp.sendEmail(correo, asunto, mensaje);
hoja.getRange(filaActiva,colConfirmacion).setValue("OK");
SpreadsheetApp.getUi().alert(mensajeExito)
}
Si quieres entrar a profundidad en todas las opciones de envío de correo con Google Apps Script, en la academia encuentras un Curso Completo Básico de Envío de correos
Código completo para envío a la fila actual
function enviarMailActual(){
// Variables de configuracion
const nombreBase = "BD"
const filaEncabezado = 1
const colCorreo = 1;
const colNombre = 2;
const colProd = 3;
const colFecha = 4;
const colValor = 5;
const colTipo = 6;
const colConfirmacion = 7;
const asunto = "Confirmacion compra curso en JuanSGuzman";
const mensajeAlerta = "No hay un correo válido. El mail no pudo ser enviado";
const mensajeExito = "Su correo fue enviado exitosamente";
const archivo = SpreadsheetApp.getActiveSpreadsheet();
var hoja = archivo.getActiveSheet();
var plantilla = archivo.getSheetByName("Plantilla").getRange(3, 1).getValue()
if(hoja.getName()==nombreBase){
var activa = hoja.getActiveCell();
var filaActiva = activa.getRow();
if(filaActiva>filaEncabezado){
var correo = hoja.getRange(filaActiva,colCorreo).getValue();
var nombre = hoja.getRange(filaActiva,colNombre).getValue();
var prod = hoja.getRange(filaActiva,colProd).getValue();
var fecha = hoja.getRange(filaActiva,colFecha).getValue();
var valor = hoja.getRange(filaActiva,colValor).getValue();
var tipo = hoja.getRange(filaActiva,colTipo).getValue();
var mensaje = plantilla.replace("{{correo}}",correo)
.replace("{{nombre}}",nombre)
.replace("{{producto}}",prod)
.replace("{{fecha}}",fecha)
.replace("{{valor}}",valor)
.replace("{{tipo}}",tipo)
Logger.log(correo)
if(correo==""){
SpreadsheetApp.getUi().alert(mensajeAlerta)
}else{
GmailApp.sendEmail(correo, asunto, mensaje);
hoja.getRange(filaActiva,colConfirmacion).setValue("OK");
SpreadsheetApp.getUi().alert(mensajeExito)
}
}
}
}
Conclusión y próximos pasos
Como ves, no es tan difícil hacerlo. A veces pensamos que necesitamos un complemento para extender nuestro Google Sheets, pero con un poco de práctica podemos hacer cosas como estas y mucho más complejas.
Los siguientes pasos serian enviar varios mails al tiempo, o enviar mails a través de una plantilla HTML un poco más elaborada.
Y si tienes más sugerencias o preguntas quedo muy pendiente
Suscríbete para acceder al curso «Descubriendo el poder de Google Sheets» y empezar tu camino a la maestría de Sheets, Forms y Apps Script
Deja una respuesta