Cómo enviar un correo automático de Gmail desde Google Sheets

Enviar un email desde Google Sheets y Google Apps Script
— by

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í:

  1. Entramos en nuestro Google Drive
  2. Damos clic en el botón de «+»
  3. Escogemos «más»
  4. 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í:

  1. Entramos en nuestro Google Drive
  2. Damos clic en el botón de «+»
  3. 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:

  1. Vamos al menú de «Herramientas»
  2. Escogemos la opción «<> Editor de Secuencia de Comandos»
  3. En la nueva ventana que nos aparece, damos un título a nuestro proyecto.
  4. 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:

  1. 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
  2. Una plantilla que contenga las variables
  3. Un menú especial con la opción de enviar mail
  4. 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:

  1. Correo electrónico
  2. (Opcional) Variables para poder personalizar nuestro correo. Ejemplo de estas variables pueden ser:
    1. Nombre
    2. Apellido
    3. Edad
    4. Producto Comprado
    5. Dirección

Para nuestro ejemplo, esta es la base:

Plantilla

La plantilla podría hacerse de distintas maneras, entre otras:

  1. Directamente en el código
  2. En una celda de Sheets
  3. En un documento de texto de Google Docs
  4. 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:

  1. Variables de configuración
  2. Identificar la celda en la que usuario está al momento de presionar el botón
  3. Inserta los valores de cada variable en la plantilla.
  4. Si no hay correo electrónico en la fila, sale una alerta
  5. Si está en una fila con correo electrónico, envía el correo.
  6. 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

Boletín

Nuestras últimas noticias en tu correo electrónico

Respuestas

  1. Avatar de Pablo
    Pablo

    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

    1. Avatar de jsguzmanb
      jsguzmanb

      Pudiste solucionar?
      Saludos!

  2. Avatar de Paolo
    Paolo

    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?

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  3. Avatar de José VS
    José VS

    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.

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  4. Avatar de Ignacio Alvarez
    Ignacio Alvarez

    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?

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Ignacio

      Intenta poner esto en el asunto

      «Conclusi&‌oacute;n»

      Me cuentas

      Saludos!

      Un gran saludo!

  5. Avatar de Antonella
    Antonella

    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!!

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  6. Avatar de Fernando
    Fernando

    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!

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

      1. Avatar de miguel
        miguel

        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.

        1. Avatar de jsguzmanb
          jsguzmanb

          Hola Miguel

          Para eso necesitas un alias

          Aquí te dejo el video

          https://youtu.be/9ebNJcR9k9c

          Saludos!

  7. Avatar de Jenn
    Jenn

    Hola Juan,
    Una duda, ¿se puede enviar una sola hoja de google sheets y que sea en fotmato csv o xlsx?

    Gracias

  8. Avatar de Gina Alegre
    Gina Alegre

    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.

  9. Avatar de Abraham
    Abraham

    Hola, vi tu canal y esta buenisimo, favor me podrias indicar si en este proceso se pueden incluir en copia otros mails?

    gracias!

  10. Avatar de cesar
    cesar

    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.

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  11. Avatar de Fernando
    Fernando

    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?

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  12. Avatar de Fernando
    Fernando

    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?

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  13. Avatar de Tania
    Tania

    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

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Tania

      En 2 semanas sale ese tutorial en el canal

      Ojalá te sirva!

  14. Avatar de Carlos
    Carlos

    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?

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  15. Avatar de Antonio
    Antonio

    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

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

      1. Avatar de Antonio
        Antonio

        Gracias. Estaré atento al vídeo.
        Iré probando mientras

  16. Avatar de Jorge
    Jorge

    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

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  17. Avatar de Ruben
    Ruben

    ¿Cómo podría utilizar una cuanta de envío distinta? He probado a cambiar la predeterminada pero sigue enviado con la principal.

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  18. Avatar de Nancy González
    Nancy González

    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?

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  19. Avatar de Jose Fernando Martinez

    ¡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?

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Estas de tu gmail personal? o de uno corporativo?

      Intentaste tanto con GmailApp como con MailApp?

      Saludos!

  20. Avatar de Julian Martinez
    Julian Martinez

    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

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  21. Avatar de Inaki
    Inaki

    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

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Inaki

      Claro que si

      Aquí te dejo el video

      https://youtu.be/zefkA3J0XB4

      Saludos!

  22. Avatar de Javier
    Javier

    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?

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Javier

      Te refieres a un adjunto?

      O a algo como esto?

      Saludos!

  23. Avatar de Karina
    Karina

    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??

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  24. Avatar de Javier
    Javier

    Hola:
    He conseguido guardar en PDF, pero no consigo que lo que guarde me lo envíe por correo, alguna ayuda?

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  25. Avatar de Marcos
    Marcos

    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

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Mil gracias por escribir

      En el boton no pongas el parentesis

      Solo «enviarMail»

      Cuentame si te funciona

      Saludos!

  26. Avatar de Nicolad Aravena
    Nicolad Aravena

    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 .

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Y estas trayendo el correo de una celda? O lo digitas directamente en el código?

      Saludos!

  27. Avatar de Daniel
    Daniel

    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?

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Daniel

      Creo que no te entiendo

      A que te refieres con un email con 15 filas? a 15 destinatarios diferentes?

      Saludos!

  28. Avatar de Ezequiel
    Ezequiel

    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!

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  29. Avatar de Beto Gloria
    Beto Gloria

    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

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  30. Avatar de pablo
    pablo

    Hola Juan!
    Gracias por tu post!
    Es posible mandar cadenas de emails desde una cuenta que no sea de google?
    Muchas gracias!
    un abrazo

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      desafortunadamente, solo desde tu cuenta gmail o gsuite

      Saludos!

  31. Avatar de Danilo Pira
    Danilo Pira

    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

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  32. Avatar de Aritz
    Aritz

    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

    1. Avatar de Aritz
      Aritz

      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)

    2. Avatar de jsguzmanb
      jsguzmanb

      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!

      1. Avatar de Aritz
        Aritz

        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

        1. Avatar de Aritz
          Aritz

          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í.

      2. Avatar de Aritz
        Aritz

        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!

        1. Avatar de Aritz
          Aritz

          estoy empanao… ya lo veo en tu canal YT.
          Muchas gracias!

          1. Avatar de jsguzmanb
            jsguzmanb

            Mil disculpas la demora en la respuesta

            Que bueno que lo hayas encontrado

            Saludos!

  33. Avatar de diego

    Muy buena explicación!!! te felicito

    1. Avatar de jsguzmanb
      jsguzmanb

      Mil gracias Diego!

  34. Avatar de LUIS
    LUIS

    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.

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  35. Avatar de Marce
    Marce

    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!

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  36. Avatar de Ricardo Velásquez
    Ricardo Velásquez

    Hola Juan,

    Gracias por el aporte.

    Una consulta, deseo agregar una tabla que tengo en Sheets al correo en Gmail, es posible?

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  37. Avatar de Richard Anderson Medina Valencia
    Richard Anderson Medina Valencia

    Hola Juan, como puedo hacer para que se peita y repita el procesos con más filas, es decir si son varios correos.
    Gracias

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  38. Avatar de Amaru
    Amaru

    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

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  39. Avatar de Julio
    Julio

    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.

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

  40. Avatar de Hernán López
    Hernán López

    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

    1. Avatar de jsguzmanb
      jsguzmanb

      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!

      1. Avatar de Hernán López
        Hernán López

        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

    2. Avatar de Irene
      Irene

      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

      1. Avatar de jsguzmanb
        jsguzmanb

        Hola Irene

        Aquì te dejo un video con algo similar

        https://youtu.be/D9ak2IYcEf8

        Saludos!

        Saludos!

Deja una respuesta

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.

Pin It on Pinterest

Share This