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

Enviar un email desde Google Sheets y Google Apps Script

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

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

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)
}

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

119 comentarios en “Cómo enviar un correo automático de Gmail desde Google Sheets”

  1. Que tal juan

    voy empezando en google sheets, me gustaria saber si hay forma de automatizar el envio de un correo en automatico sin necesidad de hacerlo manual, que envie un correo con un rango de celdas en especifico tomando en cuenta el valor de otra celda <=20 y que mande un recordatorio dia a dia, de antemano muchas gracias

  2. Hola Juan, soy nuevo en esto…
    necesito enviar correo a través de google sheets pero en lotes a un dolo correo, me explico tengo una BD con varias ordenes y una fecha de vencimiento, necesito enviar las ordenes vencida a un solo correo, este es mi codigo pero así me envia un correo por cada orden y normalmente son mas de 3000 ordenes te puedes imaginar la cantidda de correos, ante todo mucha gracias
    function EnviarCorreosAPartirDeCambioEnUnaFormula() {
    const libro = SpreadsheetApp.getActiveSpreadsheet()
    const hoja1 = libro.getActiveSheet();

    for (var fila = 1; fila <= hoja1.getLastRow(); fila++){
    const Destinatario = hoja1.getRange(2,9).getValue()
    const estado = hoja1.getRange(fila,7).getValue()
    if (estado == "VENCIDO") GmailApp.sendEmail(Destinatario, "Orden Vencida", orden= hoja1.getRange(fila,1).getValues())
    }
    }

  3. Excelente aporte.
    Una duda, como podria hacer que una vez que se llena un formulario este le cree un codigo QR a ese registro y luego se lo envie al correo que rgistro esa persona en el forms?

    Muchas gracias
    Saludos

  4. Hola Juan,

    Muchas gracias por la información que aportas, me gustaria saber si es posible si le pongo una condicion en una casilla por ejemplo si es “NO” que mande un mail automaticamente a un contacto o varios contactos.

    gracias

  5. Hola buenas noches, me pareció muy interesante, pero si lo que quiero es que se envié un correo solamente bajo un condicional, es decir supongamos que tenemos una columna con datos los cuales están en un valor entre 15 y 20 y deseo que solo se envié el coreo cuando el valor esta por encima de 20 o por debajo de 15, es posible? me puede ayudar

    Gracias

  6. hola Juan, gracias por el contenido.

    Es posible que se pueda aplicar negritas en las palabras que queramos resaltar dentro del codigo para enviar correo electrónico a partir de una casilla? asi mismo es posible que el texto en el correo se vea como cuando se redacta directamente y no sobre filas

    Asi ocupa el espacio con el mensaje a través de la formula.
    xxxxxxxx
    xxxxxxxx
    xxxxxxxxxx
    xxxx
    xxx

    Es posible que quedara asi:

    xxxxxxxx xx xxxxxxxxx xxxxxxx xxxxx xxxxx xxxxxxx xxxx xx xxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxx xxxxxxxxxxx xx xxxxxxxxx xxx xxxxxx xxxxx xxxx xxxxx

  7. Estimado, agradeciendo el tiempo para explicar en el envió y también lo funcional de esto, a mi me funciona de forma perfecta, que consultar si tenias problemas con los correos hacia hotmail ya que lo correos que he enviado a propietarios hotmail me dicen que les llegan como spam.
    tu sabes como solucionar ese problema

    saludos

  8. Hola Juan, gracias por la información y felicitaciones.
    Tengo una duda, tengo configurada un repositorio d respuestas de un formulario y cada 5 minutos dispara los correos, pero desde hace unos los correos se disparan a más de 5 minutos, a veces pasa 10 hasta 20 minutos y recién se disparan, sabrás porque ocurre ello?

  9. Buen día, muchas gracias por la información.
    Me gustaría saber si hay una forma de que el correo se envíe de otro remitente que no sea yo, que se indique en una celda y se pueda enviar desde ese remitente. Gracias de antemano me han ayudado mucho sus videos en mi trabajo.

    1. Hola!
      No se puede desafortunadamente
      Tu tienes que dar los permisos de tu cuenta
      La única opción es que sea otro correo tuyo que ya hayas autorizado en gmail para enviar correos en su nombre
      Saludos!

  10. Problema con exportar PDFs

    Hola Juan! Antes de nada, gracias por enseñarme tanto.
    Tengo el siguioente script, pero al enviar el email, me envía un pdf por cada pestaña mientras que lo que quiero es que me envie solo uno. Cómo podría solucionarlo? Te dejo el script:

    function emailMuchosDocs() {
    const ss = SpreadsheetApp.openByUrl(“AAAAAAAAAAAAAAAA”);
    const sheets = ss.getSheets();
    var fecha = Utilities.formatDate(new Date(), “GMT+1”, “dd/MM/yyyy”);
    const email = “AAAAAAAAAAAAAAAA”;
    const subject = ‘AAAAAAA: ‘ + fecha;
    const body = “AAAAAAAAAAAAA ” + fecha;
    const url = “AAAAAAAAAAAAAAAAAAAAAAAAAA/export?””;

    const exportOptions =
    ‘exportFormat=pdf&format=pdf’ +
    ‘&size=A4’ +
    ‘&portrait=false’ +
    ‘&fitw=true’ +
    ‘&sheetnames=true’ +
    ‘&printtitle=false’ +
    ‘&pagenumbers=false&gridlines=false’ +
    ‘&fzr=true’ +
    ‘&gid=’;

    var token = ScriptApp.getOAuthToken();
    var params = {
    method: “GET”,
    headers: { “authorization”: “Bearer ” + ScriptApp.getOAuthToken() }
    };

    const attachments = [];

    sheets.forEach((sheet) => {
    const nameFile = sheet.getName() + “.pdf”;
    const gid = sheet.getSheetId().toString();
    const response = UrlFetchApp.fetch(url + exportOptions + gid, params).getBlob();
    attachments.push({
    fileName: nameFile,
    content: response.getBytes(),
    mimeType: “application/pdf”
    });
    });

    const combinedPDFBytes = [].concat(…attachments);

    // Send the PDF files as attachments
    GmailApp.sendEmail(email, subject, body, {
    htmlBody: body,
    attachments: combinedPDFBytes
    });
    }

    Gracias de antemano por tu ayuda!

  11. Hola Juan.
    A mí me encantaría poder imprimir un pdf de una hoja y luego enviar este documento por mail.
    No tengo claro si se puede generar una rutina que englobe todo este proceso en un evento programado en el tiempo, por ejemplo todos los lunes =)

    Sería genial, pero no lo he conseguido. Lo ves posible?
    Gracias!

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

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

  14. 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,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Deja un comentario

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

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

Pin It on Pinterest

Share This