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

En este artículo, veremos cómo enviar un correo electrónico desde nuestra cuenta de Gmail usando Google Sheets con la ayuda de Google Apps Script (GAS).

¿Por qué enviar un correo desde Sheets?

La primera pregunta que nos podríamos hacer es: ¿Para qué enviar un correo desde Google Sheets si puedo hacerlo desde Gmail o Outlook?

Estas son algunas situaciones en las que resulta más eficiente enviar un correo desde Sheets:

  • Cuando queremos enviar el mismo correo a muchas personas al mismo tiempo.
  • Cuando necesitamos personalizar el correo con variables como el nombre, tema, producto, etc.
  • Cuando queremos programar un correo repetitivo para diferentes horas.
  • Cuando deseamos enviar un correo automático cada vez que ocurra algo específico o se cumpla una condición (ej.: marcar una casilla, presionar un botón, recibir un formulario).

Para todo esto, necesitamos usar Google Apps Script.

Enviar un correo automático desde Google Apps Script

Lo primero es enviar un correo sencillo directamente desde Google Apps Script. Aquí los pasos:

1. Crear un archivo de Apps Script

Asigna un título, como «Enviar mail».

Ve a Google Drive.

Haz clic en el botón «+».

Selecciona «Más» y luego «Google Apps Script».

2. Crear la función para enviar el correo

Ahora, cambiemos el nombre de nuestra función a algo significativo, como enviarMail.
Para enviar un correo, usamos el servicio GmailApp. También se puede usar MailApp, pero ambos funcionan igual para este caso.

GmailApp.sendEmail(recipient, subject, body)

Donde:

  • recipient: correo de destino.
  • subject: asunto.
  • body: cuerpo del mensaje.
GmailApp.sendEmail("guzman.sheets@gmail.com", "Mi Primer correo desde GAS", "Es demasiado fácil!");

Guarda y ejecuta el script. La primera vez que lo ejecutes, te pedirá autorizar la app para enviar correos. Sigue estos pasos:

  1. Haz clic en Revisar permisos.
  2. Selecciona tu cuenta de Google.
  3. Aparecerá un mensaje que dice «Esta app no está verificada».
    • Haz clic en Configuración avanzada.
    • Luego, selecciona el proyecto creado.
  4. Haz clic en Permitir.

3. Verificar el correo enviado

Revisa tu bandeja de entrada o la carpeta «Enviados» para confirmar que el correo fue enviado correctamente.

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 tomar datos de Google Sheets para construir un correo.

1. Convertir el texto en variables

Primero, convierte las cadenas de texto usadas en el ejemplo anterior 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);
}

2. Conectar con Google Sheets

Ahora, conecta el script con Google Sheets y asigna los valores desde celdas específicas:

  1. Crea un nuevo archivo en Google Sheets.
  2. En la hoja, asigna una columna para el correo, otra para el asunto y una más para el mensaje.

Actualiza tu código para leer datos de las celdas:

function enviarMail() { var hoja = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var mail = hoja.getRange(‘A2’).getValue(); var asunto = hoja.getRange(‘B2’).getValue(); var mensaje = hoja.getRange(‘C2’).getValue(); GmailApp.sendEmail(mail, asunto, mensaje); }

3. Probar y autorizar el script

Ejecuta el script nuevamente. Esta vez, te pedirá autorización para acceder a Google Sheets. Sigue los pasos mencionados anteriormente.

Variaciones al código

Variación 1: Para conectarnos a nuestra hoja de Sheets usamos la siguiente línea:

var hoja = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Hoja 1");

Variación 2: Si trabajan desde el proyecto independiente de GAS, pueden conectarse a un Sheets con esta variación.

var hoja = SpreadsheetApp.openById("1YmMXc3CRj-7uEBM06zRXyoVFKpB7nN0I9xMxIX4uVEI").getSheetByName("Hoja 1");

El ID lo obtienen del navegador donde tienen su archivo de Sheets

Variación 3: Fila + columna. 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.

Enviar correos personalizados a contactos

Vamos a llevar esto un paso más allá:
Enviar un correo a cualquiera de nuestros contactos desde una base de datos en Google Sheets.

1. Crear una base de contactos y plantilla

  • Base de contactos: En una hoja de cálculo, define columnas como correo electrónico, nombre, producto, etc.
  • Plantilla: En otra hoja o celda, escribe un mensaje con variables marcadas entre dobles corchetes, por ejemplo:

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.

2. Crear un menú personalizado

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

Conclusión y próximos pasos

Enviar correos desde Google Sheets con Apps Script no es tan complicado como parece. Este ejemplo te permite comenzar a automatizar tus envíos. Los siguientes pasos pueden incluir el envío masivo o el uso de plantillas HTML para personalizar aún más los correos.

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

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

  1. gustavo suyo ramirez

    Hola Juan he echo un script para enviar correo con htmlbody todo muy bien el problema es que en el CC , al elegir un valor de una lista despegable, el campo textarea CC se autocompleta con más de 50 correos y me sale error. Hay alguna limitancia o una solución

  2. Hola, ya encontre el video para enviar correos con la casilla de verificacion, pero necesito saber como hago si esa casilla de verificacion pertenece a otra hoja de calculo de google sheets, porque cuando en la otra hoja de calculo verifican la casilla en la hoja de calculo donde tengo mi scripp no se envia el correo, solo lo permite si esta en la misma hoja y lo necesito tomando la informacion desde otro archivo.

    podrias ayudarme?

  3. Hola Juan, muy buen video.
    me di cuenta que me funciona con «Mailapp» no con»Gmailapp»…

    podrias ayudarme, necesito enviar correos si se cumple una condicion: cuando chequeemos una casilla de verificación, o presionemos un botón, o recibamos un formulario , como dijiste al inicio de este articulo, pero en este articulo no muestras estas condiciones…

    en donde lo podria encontrar?
    muchas gracias

  4. Hola Juan. Esoy seguiendo tus videos de youtube . Explicas de una manera que haces ver las cosas tan sencillas.
    Pero con el proctico de mailMerge , no puedo ejecutarlo

    function mailMerge(){
    //Configuracion
    const nombreDatos = «BD»
    const nombreConfig = «Configuracion»
    // Conecta con hojas
    var libro = SpreadsheetApp.getActiveSpreadsheet();
    var hoja = libro.getSheetByName(nombreDatos);
    var config = libro.getSheetByName(nombreConfig);
    var contactos = hoja.getRange(2, 1, hoja.getLastRow()-1, 8).getValues();

    var asunto = config.getRange(«B2»).getValue();

    contactos.forEach(function(fila){

    var mensaje = crearMensaje(fila);
    GmailApp.sendEmail(fila[0],asunto,mensaje);
    })
    }
    function crearMensaje(){
    var plantilla = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(«Plantilla»).getRange(«A3»).getValue();

    var mensaje = plantilla.replace(«{{nombre}}»,datos[1])
    .replace(«{{producto}}»,datos[2])
    .replace(«{{fecha}}»,datos[3])
    .replace(«{{valor}}»,datos[4])
    .replace(«{{tipo}}»,datos[5])

    return mensaje
    }
    Me arroja los siguientes mensajes,
    16:05:46 Error
    ReferenceError: archivo is not defined
    crearMensaje @ Código.gs:47
    (anónimo) @ Código.gs:28
    mailMerge @ Código.gs:26

    He empezado de 0 tres 0 cuatro veces.

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

  6. 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())
    }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

JuanSGuzman
Resumen de privacidad

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