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

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
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)
}
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
Hola Juan. Muchas gracias por tu aporte, está buenísimo.
Por favor, si me podrías ayudarme con la sgte modificación al script del ejemplo de “function enviarMailActual”. Será posible enviar los correos a todos los contactos que aparecen en la base?, sin la necesidad de pararse en la fila de cada uno de ellos para poder enviarlos (uno a uno)
Saludos,
Javier.
PD: Por favor, si me podrías responder al mail. Muchas gracias.
Claro que si!
Aquí te dejo el video
https://youtu.be/aQJulEXT7rQ
Saludos!
Hola Juan
Es posible que se pueda hacer un código para envio por whatsapp felicitando a una persona de una lista que cumpla años x dia de forma automática?
Sabiendo el nombre, la fecha de nacimiento y teniendo el número de teléfono.
Hola!
Tengo un video donde muestro como hacerlo, pero no es 100% automatizado
No se si te sirva
Saludos!
Hola Juan! muchas gracias por tus videos y clases! me han servido muchísimo.
Te comento que este en específico me ayudó a diseñar una ficha de trabajo, donde puse una casilla para comentarios y que estos me puedan llegar directamente al mail.
A mi me funcionó perfecto, pero al parecer necesito que las personas que vayan a escribir, o usar la ficha, tengan que tener el código y appscript descargado para que en sus casos funcione.
¿Hay alguna forma de automatizarlo sin necesidad de que el resto tenga que ingresar las mismas funciones o código?
De nuevo muchas gracias!
saludos,
Lo tienes con un activador? Si es asi, no habría necesidad
Saludos!
Buenas noches! Ante todo quisiera agradecer la voluntad y buena enseñanza que impartes. Muy claros los videos!
Tengo el siguiente problema:
Genero un formulario con datos y envia 2 correos: uno con el aviso de la la creacion y el correo con los datos.
El correo de aviso de creacion permite editar el formulario pero cuando lo edito y cierro el formulario me envia el aviso de modificacion pero el script da como “error TypeError: Cannot read property ‘0’ of undefined at notificarOnFormSubmit(correos:3:27)” a pesar de que no modifique el correo donde debiar enviar!
Podras ayudarme?
Muchas gracias
Pudiste solucionar?
Saludos!
Hola Juan! una pregunta, es posible enviar un email automático cada vez que se agregue una fila con datos?
por ejemplo si tengo un formulario en wordpress y esos datos van a una hoja de google sheet, es posible enviarle un email automático al suscriptor inmediatamente después de que lleguen los datos a la hoja de google sheet con esos datos?
Hola Paolo
Si se podría, hay que hacer un par de cambios.
Ya lo anoto para pronto hacer un video y artículo. Espero que en un par de semanas tengas la respuesta
Un gran saludo!
Hola Juan,
Muchas gracias por todos los conocimientos y el tiempo que compartes. No solo eres un tipo generoso sino también muy muy trabajador e ingenioso.
Discúlpame porque seguro que ya has respondido en algún sitio a lo que te voy a preguntar: Cómo puedo mandar el correo desde G. Sheets usando una Lista de Distribución?.
Muchas Gracias por tu ayuda.
Hola Jose
Mil gracias por tus palabras!
Te dejo aquí dos videos que te pueden dar luces!
https://youtu.be/D9ak2IYcEf8
https://youtu.be/aQJulEXT7rQ
Un gran saludo!
Hola, estoy enviando un mail en donde el asunto lleva una acento, esta es la palabra que incluye el asunto “Conclusión”, al ejecutar el script no manda ningún error simplemente no llega el correo al destinatario, si le quito el acento a la palabra “Conclusion” ejecuto el script y llega el correo al destinatario, sabes que sucede?
Hola Ignacio
Intenta poner esto en el asunto
“Conclusión”
Me cuentas
Saludos!
Un gran saludo!
Hola Juan, me ahorraste muchas horas de vida con estos trucos! Te quería hacer una consulta: como hago para que esos correos no partan de mi mail personal de la empresa sino de una casilla genérica de la que yo soy delegada? Te aclaro que la empresa está hosteada con Gmail
Puse a esa casilla genérica como propietaria del sheets, sin embargo no puedo acceder al drive desde ella. Y si accedo desde mi usuario, el correo se envía a mi nombre y empiezo a recibir respuestas que no debería..
Es posible??? Espero haberme explicado bien
Muchas gracias!!
Hola!
Asumiendo que ya tienes tu casilla configurada para enviar correos desde esta en gmail, solo debes hacer esto
GmailApp.sendMail(destinatario,asunto,mensaje,{from:casilla})
Saludos!
Buenas, buenísimo el material. Una consulta rápida:
¿Y si en lugar de enviar con Gmail quiero que lo mande con un correo de dominio propio (empresarial, que utiliza outlook… pero el dominio es por ejemplo @empresa.com)?
Saludo!
Hola Fernando
Tu correo corporativo debe estar “hosteado” o usar el servicio de Gmail
Si es asi, entonces los códigos funcionarian y podrías enviar correos desde ese correo
Otra opción es que tengas tu gmail personal y le “añadas” un correo adicional de hotmail o un corporativo y con eso hacemos como una especie de trampa y se puedan enviar desde otros correos adicionales
Esta bueno para un video
Muchas gracias!
Un gran saludo!
Hola @jsguzmanb igual esa era mi duda, yo quiero mandar correos masivos ya lo consegui pero el detalle es que no quiero que salga mi dirección de gmail quisiera que saliera con un correo de outlook por ejemplo que es con el correo que se maneja la institución , tendras un video de apoyo por favor.
Hola Miguel
Para eso necesitas un alias
Aquí te dejo el video
https://youtu.be/9ebNJcR9k9c
Saludos!
Hola Juan,
Una duda, ¿se puede enviar una sola hoja de google sheets y que sea en fotmato csv o xlsx?
Gracias
Hola Juan. Primero felicitarte por la calidad de contenido que brindas. Quisiera saber si es posible enviar un correo cada vez que se agregue una fila. En mi caso todos los correos (reportes) se envían a una sola persona. Por favor si podrías apoyarme.
Hola, vi tu canal y esta buenisimo, favor me podrias indicar si en este proceso se pueden incluir en copia otros mails?
gracias!
Hola, espero te encuentres bien, mi duda es, puedo enviar email desde Sheet’s pero con un adjunto…?, Tengo la Macro con GmailApp.sendEmail(recipient, subject, body), como lo muestras en este tutorial, pero poder agregar un adjunto y que cuando dispare la macro se lance el email con el adjunto indicado.
Hola Cesar
Mil gracias por tu pregunta
Me inspiraste a escribir este artículo
https://juansguzman.com/enviar-un-mail-con-archivos-adjuntos-desde-google-sheets/
Ojalá te sirva!
Un gran saludo!
Hola, quisiera armar un script para que envíe como adjunto un documento que tengo en mi drive. En una columna inserto el link del archivo y quisiera que el script lo convierta en adjunto. Son muchas filas y cada una con un link distinto, puede hacerse?
Hola Fernando
Mil gracias por tu pregunta
Me inspiraste a escribir este artículo
https://juansguzman.com/enviar-un-mail-con-archivos-adjuntos-desde-google-sheets/
Ojalá te sirva!
Un gran saludo!
Hola, tengo un pdf en el drive y quiero que al enviar un mail, lo envíe como adjunto, no como link a la url. Es posible esto?
Hola Fernando
Aquí te dejo un artículo que te puede servir
https://juansguzman.com/enviar-un-mail-con-archivos-adjuntos-desde-google-sheets/
Ojalá te sirva!
Un gran saludo!
Buenas, tengo una consulta como puedo hacer para utilizar este tipo de programación para crear diferentes plantillas y pueda llamarlas por medio del asunto del correo así por defecto jale la planilla al correo y luego solamente colocar el correo para darle enviar, y como se puede modificar fácilmente el scritp desde el correo
Hola Tania
En 2 semanas sale ese tutorial en el canal
Ojalá te sirva!
hola! tengo un problema con al hacer envió de una celda con fecha y hora me manda un horario diferente a mi región la región que me corresponde es GTM -05 y me manda GTM -04 ¿hay alguna forma de solucionar esto?
Hola!
La triste verdad es que no he encontrado la mejor manera de hacerlo
Una opción es asegurarte que tu región este bien (a veces cambio la región a cualquiera y despues vuelvo a poner la mia para que se “resetee”)
Si esa no te funciona, puedes sumar o restar 1 de la hora para que te de la hora deseada
Saludos!
Hola Juan, estoy confeccionando un formulario para llevar las incidencias de comportamiento de un instituto.
Todos los datos relativos al alumno, como nombre, curso, email tutor, email padres, lo tengo en una Google Sheets y se van mostrando en los menús desplegables del formulario.
He intentado usar el complemento Email Notifications pero no sé cómo decirle que al enviar el formulario busque en la hoja de cálculo el email de los padres y del tutor del curso, para comunicar la incidencia.
Se podría hacer con un script parecido al que muestras, pero no sé cómo decirle que busque al alumno y el email de los padres dentro de la tabla.
Basta con que me orientes un poco con los comandos a usar.
Gracias
Hola Antonio
Muy pronto sale un video (1 semana) donde te explico a detalle como enviar correos desde Forms
A este tendríamos que añadirle el tema de buscar el mail
Esto se hace con un método indexOf
Me vas contando
Un gran saludo!
Gracias. Estaré atento al vídeo.
Iré probando mientras
Hola! Muchas gracias por tu contenido. Tengo una duda ¿hay alguna forma de “enmascarar” el correo electrónico de donde se envía? Es decir, en lugar de que diga “MiCorreo@gmail.com” dijera algo como “NoName@gmail.com”.
Muchas gracias y continúa con estos materiales que están de 10/10 y 5 estrellas
Hola Jorge
Desafortunadamente no se puede
Lo que si podríamos hacer es usar replyTo para que cuando respondan respondan a otro mail
Un gran saludo!
¿Cómo podría utilizar una cuanta de envío distinta? He probado a cambiar la predeterminada pero sigue enviado con la principal.
Hola!
Una opción es hacer un código que envíe automáticamente, o con una casilla de verificación
Esto lo activaríamos con un activador de edición
Cómo cada usuario tendría que “activar” su activador, esto haría que se envíe desde el correo de cada usuario
Ojala no haya sido enredado
Un gran saludo!
Buenas tardes,
Tengo un formulario que lo digilencian varias personas de un area, lo estoy utilizando para recopilar datos para el envio de correo, los datos del formulario se guardan en una hoja de sheets, pero cuando se envían por correo el dominio sale es de quien creó la hoja y no de quien está generando el formulario de respuestas.
Como se puede cambiar el remitente del correo?
Hola
Esto no se podría ya que necesitaría tener el permiso de esa persona para enviar correos a su nombre.
Si todos son editores del formulario, en teoría se podría
Tendría que investigar más
Saludos!
¡Hola! JsGuzman
Excelente tu contenido
Estoy siguiendo el Paso a Paso exactamente pero me salio este error:
Error
Exception: Gmail operation not allowed. : Mail service not enabled
EnviarEmailAsesora @ Código.gs:2
Me podrías ayudar?
Hola!
Estas de tu gmail personal? o de uno corporativo?
Intentaste tanto con GmailApp como con MailApp?
Saludos!
Juan, primero agradecerte por el contenido tan interesante… Trabajo en un hotel y quisiera saber si es posible que cuando el recepcionista llene una hoja que le he dejado para reportar novedades y en una celda pongan por ej Mantenimiento, Tecnología, A&B, Servicios Generales… se envíe un correo a esa área especifica indicándole la novedad diligenciada en google Sheet… muchas gracias y quedo muy atento
Hola Julian,
Claro que se podría.
Tendríamos que tener una hoja de configuración con los correos correspondientes
Voy a preparar un video del tema
Saludos!
Buenas tardes.
Es posible automatizar envios en función del valor de una celda. Por ejemplo quiero enviar un email, cuando el valor alcance el valor de 1. ¿Es posible?
Gracias
Hola Inaki
Claro que si
Aquí te dejo el video
https://youtu.be/zefkA3J0XB4
Saludos!
Hola:
Visto los videos he conseguido enviar correo pero con la URL, si no quisiera que se viese en el correo la direccion del enlace como tendría que hacer?
Hola Javier
Te refieres a un adjunto?
O a algo como esto?
Saludos!
Hola quisiera saber como puedo enviar varios correos a diferentes destinatarios por columna con el mismo asunto y adjuntando una imagen en cada correo extraida de google sheets??
Hola Karina
Aquí te dejo un par de videos de envío de emails que te pueden servir
Envío de múltiples correos – https://youtu.be/aQJulEXT7rQ
Envío de correos HTML – https://youtu.be/QccQGWxNCWA
Saludos!
Hola:
He conseguido guardar en PDF, pero no consigo que lo que guarde me lo envíe por correo, alguna ayuda?
Hola Javier, ya viste la serie de artículos de crear y enviar PDFs?
El tercer video habla de enviarlos
https://youtu.be/qpg1-FuwcX4
Un gran saludo!
Hola juan . Como va. Admiro mucho tu sabidora. Yo quisiera que una hoja de cálculo Google sheets.
me mande automáticamente cuando se modifica una celda. el tema es que arme un planilla de reparaciones.
Y quiero cada vez que se carga un dato. esta pueda dar aviso. de que hay cosas pendientes.
El problema es que las filas se van llenando, por lo tanto, no me funciona con una celda especifica. Tendría que ser una columna En mi caso seria LA columna C.
He logrado copiando y practicando con lo que vos explicaste pero no lo estoy logrando.
Como 2da opción y creo que también puede servir .
He probado crear un botón
Aun que no seria una mala opción, crear un botón.
Lo hice mediante un tutorial tuyo. Pero no lo ejecuta.
Me aparece la leyenda “No se encuentra la función de secuencia de comandos
function enviarMail() {
var ss = SpreadsheetApp.getActiveSpreadsheet()
var s=ss.getActiveSheet()
var sheetName = ‘Hoja 1’
var cellName = ‘A1’
if (ss.getName() === sheetName) {
if (ss.getValue().length === cellName) {
var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“Mantenimiento BB”).getRange(“R10:W14”);
var message = emailRange.getValues();
var subject = ‘ALERTA Problemas ‘;
MailApp.sendEmail(“mar……..@gmail.com”, subject, message);
}
}
}
Por favor agradecería mucho tu ayuda
saludos
Hola!
Mil gracias por escribir
En el boton no pongas el parentesis
Solo “enviarMail”
Cuentame si te funciona
Saludos!
hola juan!
primero que nada agradecer toda tu información en linea.
tengo un error que me vuelve loco, me arroja invalid email, reviso reitaradas veces el codigo y el correo descrito esta ok.
para corroborar copio y pego el correo en Gmail y me deja enviar.
Favor tu ayuda .
Hola!
Y estas trayendo el correo de una celda? O lo digitas directamente en el código?
Saludos!
Hola, Juan! En caso que quisiera mandar un grupo de filas, es posible? ya que vi tus videos y el contenido de este post y no encontré la manera.
Quiero enviar 1 email con 15 filas, la alternativa que encuentro con este post es 15 emails con 1 fila.
Serías tan amable de apoyarme?
Hola Daniel
Creo que no te entiendo
A que te refieres con un email con 15 filas? a 15 destinatarios diferentes?
Saludos!
Hola Juan, muchas gracias por tu contenido, soy bastante nuevo en todo esto, la verdad es que es muy útil.
Quería saber si existe la posibilidad de guardar la fecha en la que se envía cada mail.
Muchas gracias!
Hola Ezequiel
Claro que si
Ya voy a mejorar el artículo, pero por ahora te dejo esta serie de videos donde vamos viendo todas las opciones adicionales
https://www.youtube.com/watch?v=lPt5cAhnlFs&list=PLvrIQ0wr2BTIH7mydNK2lU6I_WgiRAnNP
Saludos!
Hola buenos dias JsGuzman
Como es posible agregar en el campo de “mensaje” 2 celdas por ejemplo ocupo mandar el monto que saldra el dia de hoy por lo cual tengo la siguiente formula:
=SUMIF(N4:N,”***”,H4:H)
que me arroja el monto $ 1000 y quiero sea parte del mensaje, pero ademas en otra celda tengo el concepto de ese monto : “cantidad estimada para hoy”
Quiero que en Email mande el monto arrojado por la formula (celda P2) y tambien se agrege el mensaje de la celda P3
He intentado con esto pero no me ha funcionado.
function CorreoWIP() {
var hoja = SpreadsheetApp.getActive().getActiveSheet()
var email = hoja.getRange(‘Q4’).getValue();
var asunto = hoja.getRange(‘O2’).getValue();
var mensaje = hoja.getRange(‘P2’).getValue();
var mensaje = hoja.getRange(‘P3’).getValue();
GmailApp.sendEmail(email,asunto,mensaje);
}
Espero puedas revisarlo y ayudarme con esto, gracias
Hola!
Hay varias maneras de hacer esto
No te va a funcionar tu codigo porque estas usando una sola variable.
Una opción es concatenar. Quedaría así:
var mensaje = hoja.getRange(‘P2’).getValue() + ‘ ‘ + hoja.getRange(‘P3’).getValue();
Saludos!
Hola Juan!
Gracias por tu post!
Es posible mandar cadenas de emails desde una cuenta que no sea de google?
Muchas gracias!
un abrazo
Hola!
desafortunadamente, solo desde tu cuenta gmail o gsuite
Saludos!
Hola Juan, me fascina tu contenido y admiro tu conocimiento, me gustaría solicitar información sobre un video de mail merge 1 ya que no encuentro este video en youtube ni en esta plataforma.
Adicionalmente no he podido usar una formula que es “.forEach” ya que no me la reconoce como una funcion
Hola Danilo
Mil gracias por tus palabras!
Aquí te dejo el video de mail merge
https://youtu.be/aQJulEXT7rQ
Cuando forEach no te funciona es porque algo pasa con el arreglo. Tiene que ser un arreglo de elementos
Un gran saludo!
Hola
Soy totalmente novato en el tema, por eso consulto como tal:
Cómo podría activar el script cuando mi stock sea por ejemplo 100 y esta sea la cifra que aparece en una celda? (tengo una hoja supersencilla pero que automáticamente reduce el número de la celda anterior con la función “=A101-1”)
Muchas gracias
He probado una cosa muy sencilla:
function enviarMail() {
var hoja = SpreadsheetApp.openById(“1-eTN0BgwUQAwjeXfoT-9AlxnvD-4Fntj4avLM82PVnE”).getSheetByName(“Hoja 1”);
if(d2=29){
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);
}
}
(he puesto un IF en donde creí que podría funcionar, o sea que si la celda D2=29 entonces enviar email, pero no funciona)
Hola!
En una semana sale un video donde explico eso
Tienes el concepto bien del condicional, pero no puedes poner directamente d1=29.
El valor de la celda D1 lo tienes que traer de algun lado con la función getRange.
Por otro lado cuando haces un If en codigo a diferencia de Sheets debes poner doble (o triple) igual
Espero que te sirva el video que sale el 29
Saludos!
Muchas gracias por responder. Esperaré al vídeo porque, sinceramente, no entiendo cómo hacer ese getRange. Seguramente será sencillo pero mi nivel de hojas de cálculo es -2
Gracias de nuevo y un saludo
Lo que sí vi por ahí y es completamente lógico, es que hay que decirle que solo envíe un email. De lo contrario corres el riesgo de que cada vez que se refresque la hoja te envíe un email, incluso 1 por segundo. Esa fórmula ya parece aún más compleja. Ese vídeo será una buena lección para mí.
Perdona mi impaciencia y posiblemente mi falta de conocimiento de tu página, pero no sé si pudiste hacer ese vídeo o no lo encuentro.
Gracias!
estoy empanao… ya lo veo en tu canal YT.
Muchas gracias!
Mil disculpas la demora en la respuesta
Que bueno que lo hayas encontrado
Saludos!
Muy buena explicación!!! te felicito
Mil gracias Diego!
HOLA A TODOS.
QUIERO CONSULTAR COMO PUEDO COLOCAR EN EL CUERPO DEL CORREO
UNA IMAGEN PROVENIENTE DE UN RANGO DE CELDAS POR EJEMPLO GRAFICOS TABLAS PERO QUE VALLAN COMO IMAGEN.
SLDS.
Hola Luis
Muy buena tu consulta
Esta complejo. Pensaría que generando un pdf como “imprimiendo” una hoja.
El código es un poco largo, pero lo voy a tener en cuenta para un artículo próximo
Un gran saludo!
Hola! muchas gracias por la ayuda!
cómo se puede hacer para que al hacer click en una casilla de desencadene el envío del email?
saludos!
Hola!
Esto lo hariamos con la función onEdit() o con un activador
Aqui te dejo un video de onEdit
https://youtu.be/Qqz5UpX0HnU
Y aquí uno de activadores
https://youtu.be/lrQQrOA_uKw
Ojalá te sirva, aunque voy a hacer un video muy pronto de ese caso específico.
Un gran saludo!
Hola Juan,
Gracias por el aporte.
Una consulta, deseo agregar una tabla que tengo en Sheets al correo en Gmail, es posible?
Hola Ricardo
Claro que se puede!
Para esto tienes que usar HTML
Te dejo un video donde explico esto.
https://youtu.be/QccQGWxNCWA
Me cuentas si te sirve.
Saludos!
Hola Juan, como puedo hacer para que se peita y repita el procesos con más filas, es decir si son varios correos.
Gracias
Hola Richard
Mil gracias por el comentario
No tengo aun el artículo, pero te tengo este video que espero te pueda guiar.
https://youtu.be/aQJulEXT7rQ
Un gran saludo!
Hola muy buena explicación, una consulta como sería el código para programar el envió de un email a una fecha y hora predeterminada? Saludos
Hola!
Aunque tambien lo puedes hacer con codigo, hay una forma más fácil y es con activadores.
Aqui te dejo el video.
https://www.youtube.com/watch?v=lrQQrOA_uKw
Saludos!
Hola buenas tardes, muchas gracias por el aporte me servirá bastante. En ese mismo código es posible colocar la función con copia para a cada una de las personas que enviaras un correo.
Gracias de antemano. Saludos.
Hola Julio
Claro que si
En el campo de destinatario, simplemente separa con comas los múltiples destinatarios.
En un par de semanas sale un video en el canal donde lo explico más a detalle.
Saludos!
Hola Juan, queria saber si con este codigo o una linea mas puede generar un adjunto que sea la misma hoja de donde esta saliendo la información y esta en PDF. He intentado pero no lo logro. Me podrias ayudar.
Saludos
HL
Hola Hernan, espero estes muy bien. Si se puede. No es tan sencillo como una hoja, ya que toca hacer unas funciones para que cree el pdf a partir de las hojas.
No lo he hecho yo aun, pero esta en mis planes para futuros videos.
Para que no tengas que esperar tanto te muestro un código que encontré en la siguiente página
https://xfanatical.com/blog/print-google-sheet-as-pdf-using-apps-script/
Nota: Solo te pegue las funciones que aplicarian para lo que quieres hacer, porque el codigo de la pagina hace muchas mas cosas.
Ojalá te sirve.
Me cuentas!
function exportCurrentSheetAsPDF() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
var currentSheet = SpreadsheetApp.getActiveSheet()
var blob = _getAsBlob(spreadsheet.getUrl(), currentSheet)
_exportBlob(blob, currentSheet.getName())
}
function _getAsBlob(url, sheet, range) {
var rangeParam = ”
var sheetParam = ”
if (range) {
rangeParam =
‘&r1=’ + (range.getRow() – 1)
+ ‘&r2=’ + range.getLastRow()
+ ‘&c1=’ + (range.getColumn() – 1)
+ ‘&c2=’ + range.getLastColumn()
}
if (sheet) {
sheetParam = ‘&gid=’ + sheet.getSheetId()
}
var exportUrl = url.replace(/\/edit.*$/, ”)
+ ‘/export?exportFormat=pdf&format=pdf’
+ ‘&size=LETTER’
+ ‘&portrait=true’
+ ‘&fitw=true’
+ ‘&top_margin=0.75’
+ ‘&bottom_margin=0.75’
+ ‘&left_margin=0.7’
+ ‘&right_margin=0.7’
+ ‘&sheetnames=false&printtitle=false’
+ ‘&pagenum=false’
+ ‘&gridlines=true’
+ ‘&fzr=FALSE’
+ sheetParam
+ rangeParam
Logger.log(‘exportUrl=’ + exportUrl)
var response = UrlFetchApp.fetch(exportUrl, {
headers: {
Authorization: ‘Bearer ‘ + ScriptApp.getOAuthToken(),
},
})
return response.getBlob()
}
Me cuentas.
Saludos!
Muchas gracias Juan!, espero tu familia y tu se encuentren bien.
Mira tambien tengo este codigo:
function enviarCorreo() {
var file = DriveApp.getFileById(‘ID SHEET’);
MailApp.sendEmail(‘CORREO’, ‘ASUNTO’, ‘CONTENIDO MAIL’, {
name: ”,
attachments: [file.getAs(MimeType.PDF).setName(“NOMBRE DEL PDF” + “.pdf”)]
});
}
Ahora en este codigo sabes si podria poner “var” para que el asunto del correo y el contenido vengan de una celda en especifico del sheet.
Trate de unificar tu codigo inicial del video con este, pero creo que son diferentes funciones.
Gracias por tu ayuda
Saludos
HL
Hola Juan, super bien explicado el video, gracias :).
Una duda si lo que necesito es que google sheets mande un correo cada que se vaya a cumplir una fecha por ejemplo mi celda indica una fecha de 30-Jun-2021, que envié el correo desde por ejemplo una semana antes. Leí por ahí en alguna comentario que para eso recomiendas activadores o que video me recomiendas?
Muchas gracias
Hola Irene
Aquì te dejo un video con algo similar
https://youtu.be/D9ak2IYcEf8
Saludos!
Saludos!