Así es cómo puedes enviar un correo electrónico desde una Hoja de Cálculo con secuencias de comandos de Google Apps Script.
Google Apps Script es una poderosa herramienta que puede utilizar para automatizar las herramientas de productividad de Google, como Hojas de cálculo (Google Sheets) y Documentos (Docs). La capacidad de enviar correos electrónicos automáticamente lo convierte en una herramienta extra poderosa.
Por cualquier razón que usted tenga para enviar varios correos, este truco le ayudará ha realizarlo con poco esfuerzo, así nunca tendrá que enviar manualmente los datos de nuevo. ¡Vamos a hacer que Google Script realice todo el trabajo por usted!
1. Configurar la hoja de cálculo para enviar correo
El primer paso para que Google Script envíe correos a través de las Hojas de cálculo es configurar correctamente una hoja que contenga todos los nombres, direcciones de correo electrónico y mensajes a todas las personas a las que desea que el script envíe un correo electrónico.
Bien, una vez en las Hojas de Cálculo, vamos a crear nueva hoja llamada Enviar-Emails (no olvides el nombre porque lo usaremos en el script), y deseará crear un encabezado. Cada fila de esta hoja de cálculo representará un correo electrónico individual que se enviará. Usted puede ver mi configuración en la siguiente imagen:
La información estática es sólo texto que he escrito en la celda. Esto no cambiará con el tiempo. Sin embargo, para los datos que desea cambiar, puede insertar funciones llamándolas desde cualquier otra hoja de la Hoja de Cálculo.
Una vez que haya terminado de crear la hoja, y todos los correos electrónicos individuales están listos, es hora de escribir el script.
2. Escribir la secuencia de comandos automatizada
Para escribir el script, necesitas usar el editor de script. Encontrará el editor de secuencias de comandos en el menú Herramientas seleccionando Editor de secuencias de comandos.
El editor de secuencias de comandos se verá como a continuación. Usted puede colocarle cualquier nombre a su función.
Ahora bastará con copiar y pegar el siguiente script en el área de la secuencia de comandos.
function enviarMultiEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName("Enviar-Emails"));
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getRange("B3:E6");
var data = dataRange.getValues();
for (i in data) {
var rowData = data;
var emailAddress = rowData;
var destinatario = rowData;
var mensaje1 = rowData;
var parametro1 = rowData;
var mensaje = 'Estimado ' + destinatario + ',\n\n' + mensaje1 + ' ' + parametro1;
var asunto = 'Mensajes Pendientes';
MailApp.sendEmail(emailAddress, asunto, mensaje);
}
}
Este script puede parecer algo complicado, pero en realidad no lo es. Vamos a examinarlo para que sepas exactamente lo que está haciendo cada línea.
3. Examinando el Script
Para que esta función funcione (😅) correctamente, debe asegurarse de que la hoja en la que se almacena toda la información de correo electrónico es en realidad la hoja activa. De lo contrario todo lo que viene después no funcionará. Para eso son estas dos líneas:
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName("Enviar-Emails"));
A continuación, necesitamos extraer todos los datos de esa hoja. El método sheet.GetRange() extraerá información de cualquier rango de celdas que proporcione dentro de las comillas. El método dataRange.getValues() extrae los valores y los almacena en una matriz bidimensional llamada data.
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getRange("B3:E6");
var data = dataRange.getValues();
Ahora que tenemos todos los datos almacenados en una matriz, podemos realizar un bucle utilizando for. Cada elemento de la matriz es una fila que contiene una matriz unidimensional de elementos de columna. Puede hacer referencia a cada columna utilizando un número.
var rowData = data;
var emailAddress = rowData;
var destinatario = rowData;
var mensaje1 = rowData;
var parametro1 = rowData;
Como se puede ver arriba, he extraído los elementos de columna en una matriz unidimensional llamada rowData. Luego hago referencia a la segunda columna (para obtener la dirección de correo electrónico), es decir a rowData , el segundo elemento de la matriz (el primer elemento de una matriz es siempre cero ).
El siguiente paso en esta función es reunir todos los segmentos de los mensajes que componen el cuerpo del correo electrónico. Lo bueno de esto es que puedes darle un formato bastante bueno al contenido usando el carácter \n , que es un salto de línea. A continuación, se muestra la concatenación del cuerpo del correo electrónico:
var message = 'Estimado ' + destinatario + ',\n\n' + mensaje1 + ' ' + parametro1;
El carácter + es un comando de concatenación. Usted pone el texto estático real dentro de comillas simples. Por lo tanto, este mensaje se reúne colocando la palabra “Estimado” delante de la variable “destinatario” (tenga en cuenta que “Estimado” lleva un espacio).
Recuerde que usted puede tener o usar tantas “columnas” o partes del mensaje como desee (en mi caso solo tengo Mensaje1 y Parámetro1). Finalmente, el método sendEmail(). Usted también puede añadir el asunto.
3. Cómo desencadenar su secuencia de comandos
De vuelta en la ventana del Editor de secuencias de comandos, agregue una nueva función “onOpen” y es la siguiente:
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: 'Send Emails', functionName: 'enviarMultiEmails'}
];
spreadsheet.addMenu('Enviar Emails', menuItems);
Sólo asegúrese de escribir el nombre exacto de su función en comillas simples para el parámetro functionName. Esto cargará un elemento de menú personalizado en la hoja cada vez que se abre la Hoja de Cálculo.
Ahora, ejecute la función onOpen(). Cuando le aparezca un mensaje de autorización simplemente dele a continuar y permita todo lo que Google le solicite.
Entonces, cada vez que abra su hoja de cálculo para revisar todos sus datos, todo lo que tiene que hacer es hacer clic en el elemento del menú que le llamamos “Enviar Emails” (Send Emails). Esto ejecutará su nueva función y enviará todos esos correos electrónicos para usted. Un trabajo que solía llevar varias horas ahora sólo requiere un solo clic!
4. Vídeo: Enviar emails con Hoja de Cálculo y Google Script
Este es sólo un ejemplo de las muchas formas en que puede utilizar Google Script para automatizar todo tipo de cosas que le ahorran tiempo. Así que ampliaremos más trucos. Si te gustado el artículo dale a ¡Compartir! 😉
72 comentarios
Hola.
Muchas gracias por el aporte genio!
Solo una pregunta, ¿Sabes es posible integrar alguna imagen dentro del correo?
Te agradezco.
Hola Aldair!
Claro que sí, puede revisar este enlace para más información.
Cualquier duda me cuentas, Saludos!
marca error en la siguente parte del codigo “ss.setActiveSheet(ss.getSheetByName(“Enviar-Emails”));”
Hola Salvador,
¿puede ver todo código? o qué error muestra?
Excelente, muchas gracias, nos podrías regalar el código para anexar archivos.
Alexis, infinitamente agradecido de tu post. Llevaba años tratando de hacer esto. Tengo mis finanzas personales en Google Spreadsheets y quería que me avisara a mi correo cada vez que una cuenta por pagar estuviera próxima a vencer.
Muchas gracias por la magnifica información. Cómo podríamos adjuntar un archivo?
Gracias
Hola @Iñaki gracias por comentar.
Estaré haciendo una guía con varios trucos, entre ellos adjuntar un archivo. Si gusta puede consultar attachments en Class MailApp y Class DriveApp para llamar el archivo desde Google Drive.
Saludos!
Excelente aporte.
Consulta; necesito enviar un correo que si se cumple una condición en una celda especifica (ésto ya lo tengo resuelto), se envíe un mail con un mensaje (tmb resuelto) y pegue en el mail un rango de celdas de la planilla, en mi caso es I1:O9 . Me podrás ayudar?
Muy buen aporte pero me gustaría saber si la variable de rango puede en función de la última celda con datos y no un rango fijo y como debe de ser me puedes apoyar.
Saludos.
Muchas gracias por tu aporte, bastante útil. Sabes si genera alguna limitación para envío de correos? Al parecer, después de 100 correos enviados, no me deja seguir por “límite diario”. Si es así, cómo se podría resolver?
Quedo agradecido por tus comentarios
Saludos
Hola,
Me marca error en la linea 3, archivo”Codigo” (ss.setActiveSheet(ss.getSheetByName(“Enviar-Emails”));
function enviarMultiEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName(“Enviar-Emails”));
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getRant(“A2:C2”);
var data = dataRange.getValues();
for (i in data) {
var rowData = data[i];
var emailAddress = rowData[1];
var destinatario = rowData[0];
var mensaje1 = rowData[2];
var parametro1 = rowData[3];
var mensaje = ‘Estimado ‘ + destinatario + ‘,\n\n’ + mensaje1 + ‘ ‘ + parametro1;
var asunto = ‘Prueba 1’;
MailApp.sendEmail(emailAddress, asunto, mensaje);
}
}
function onOpen() {
var spreadsheet = SpreadsheetApp();
var menuItems = [
{name: ‘send Emails’, funtionName: ‘enviarMultiEmails’}
];
spreadsheet.addMenu(‘Enviar Emails’, menuItems);
}
retira el -Emails de esa linea (ss.setActiveSheet(ss.getSheetByName(“Enviar-Emails”));
tengo problemas con esta linea MailApp.sendEmail(emailAddress, asunto, mensaje);
aparece un mensaje que dice el correo electrónico no es valido: Email (linea 15, archivo “código”)
tengo el mismo problema…
debe usar doble comillas en vez de una sola comilla
Hola, lo primero agradecerte el esfuerzo.
Estoy copiando tal cual tu codigo y funciona correctamente, pero resulta que en parametro1, tengo mas filas, seria posible añadir mas filas en el mismo codigo?
Gracias!
Hola que tal!
Sí, es posoible. Simplemente cambia el “sheet.getRange”…
Hola, maquina!
Gracias por tu rapida respuesta!
Ahora no se que paso, pero he vuelto a copiar y hacer exactamente lo mismo que tu indicas y me sale fallo, aunque el email si se envia: “No se ha podido realizar el envío por correo electrónico: no hay destinatario. (línea 15, archivo “Código”)Cerrar”
Alguna sugerencia?
un saludo
Hola Dan,
Tal vez me expliqué mal. Es posible pero con las filas llenas. Si para un Nombre quieres indicarle varios parámetros es mejor crear otra columnada, llamada “parámetro 2” por ejemplo…
*Las filas deben estar completas o al menos la sección del correo electrónico (por eso sale el error)
Te adjunto foto, para que me comprendas mejor. Deseo poder enviar el email con todos los datos de la columna parametro1 a un o varios emails. habia conseguido hacer espacio con el comando /n que dijiste arriba. pero se me borro y ahora no lo consigo.
https://ibb.co/mDtSL4S aqui esta un screenshot de mi google sheet. y aca abajo te pongo el codigo que he copiado de ti.
function enviarMultiEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName(“Enviar-Emails”));
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getRange(“B3:E16”);
var data = dataRange.getValues();
for (i in data) {
var rowData = data[i];
var emailAddress = rowData[1];
var destinatario = rowData[0];
var mensaje1 = rowData[2];
var parametro1 = rowData[3];
var mensaje = ‘Estimado ‘ + destinatario + ‘,\n\n’ + mensaje1 + ‘ ‘ + parametro1;
var asunto = ‘Mensajes Pendientes’;
MailApp.sendEmail(emailAddress, asunto, mensaje);
}
}
function onOpen() {
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: ‘Send Emails’, functionName: ‘enviarMultiEmails’}
];
spreadsheet.addMenu(‘Enviar Emails’, menuItems);
}
(y me continua dando fallo “No se ha podido realizar el envío por correo electrónico: no hay destinatario. (línea 15, archivo “Código”)” aunque los emails si llegan.
Muchas gracias
Mi sugerencia:
Nombre – Email – Mensaje – Par 1 – Par 2
Dani – correo@gmail.com – MiMensaje – No hace falta – Diclofenaco – etc…
Muchisimas gracias por tu ayuda. Lo he podido solucionar!
No se si es la mejor opcion o no pero funciona!
Gracias otra ves!!
function enviarMultiEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName(“Enviar-Emails”));
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getRange(“B3:X5”);
var data = dataRange.getValues();
for (i in data) {
var rowData = data[i];
var emailAddress = rowData[1];
var destinatario = rowData[0];
var mensaje1 = rowData[2];
var parametro1 = rowData[3];
var parametro2 = rowData[4];
var parametro3 = rowData[5];
var parametro4 = rowData[6];
var parametro5 = rowData[7];
var parametro6 = rowData[8];
var parametro7 = rowData[9];
var parametro8 = rowData[10];
var parametro9 = rowData[11];
var parametro10 = rowData[12];
var parametro11 = rowData[13];
var parametro12 = rowData[14];
var parametro13 = rowData[15];
var parametro14 = rowData[16];
var parametro15 = rowData[17];
var parametro16 = rowData[18];
var parametro17 = rowData[19];
var parametro18 = rowData[20];
var parametro19 = rowData[21];
var parametro20 = rowData[22];
var mensaje = ‘Estimado ‘ + destinatario + ‘,\n\n’ + mensaje1 + ‘,\n\n’ + parametro2 + ‘,\n\n’ + parametro3 + ‘,\n\n’ + parametro4 + ‘,\n\n’ + parametro5 + ‘,\n\n’ + parametro6 + ‘,\n\n’ + parametro7 + ‘,\n\n’ + parametro8 + ‘,\n\n’ + parametro9 + ‘,\n\n’ + parametro10 + ‘,\n\n’ + parametro11 + ‘,\n\n’ + parametro12 + ‘,\n\n’ + parametro13 + ‘,\n\n’ + parametro14 + ‘,\n\n’ + parametro15 + ‘,\n\n’ + parametro16 + ‘,\n\n’ + parametro17 + ‘,\n\n’ + parametro18 + ‘,\n\n’ + parametro19 + ‘,\n\n’ + parametro20;
var asunto = ‘CONTROL STOCK’;
MailApp.sendEmail(emailAddress, asunto, mensaje);
}
}
function onOpen() {
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: ‘Send Emails’, functionName: ‘enviarMultiEmails’}
];
spreadsheet.addMenu(‘Enviar Emails’, menuItems);
}
PD: lo unico que hay veces que en parametro 10 o 17, no tengo valor en la tabla y me lo pone con una ,. No se si existe codigo para ignorar parametros vacios.
Un saludo!!!
Hola Dan muy bueno. No tienes valor en todas esas columnas o solo en algunas?
buenas! tengo una duda
yo tengo una hoja con una tabla del listado de clientes con los pedidos que realizan, cuando apreto el boton creado “Send Mails” necesito que se envie el contenido de ese listado tal como esta al mail.
lo trate de hacer de esta manera y lo que me llega es un listado de datos uno a continuacion del otro sin ningun tipo de orden. yo lo que necesito es que mantenga el estilo de tabla, el ancho de columnas, el orden, el alto de filas, etc.
me explico?
aca dejo lo que tengo
function myFunctionMail() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName(“Enviar”));
var sheet = SpreadsheetApp.getActiveSheet();
var emailAddress = “contactomamacha@gmail.com”;
var mensaje1 = sheet.getRange(“A1:J100”).GetValues();
var mensaje = ‘Estimade Mamacha adjunto planilla del reparto del día de la fecha ‘ + ‘,\n\n’ + mensaje1;
var asunto = ‘Reparto de Hoy’;
MailApp.sendEmail(emailAddress, asunto, mensaje);
}
Hola Felipe, lo que quieres enviar son Tablas (con líneas) o sólo el estilo?
Hola Alexis! Primero que nada, muchas gracias por el tutorial. Tengo el siguiente error al ejecutar el botón “Enviar email” desde Google Sheets:
“Invalid email:Email”
Le doy en detalles, pero no me dice nada. Te envío el código:
function enviarMultiEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName(“Prueba”));
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getRange(“A54:D57”);
var data = dataRange.getValues();
for (i in data) {
var rowData = data[i];
var emailAddress = rowData[1];
var destinatario = rowData[0];
var mensaje1 = rowData[2];
var parametro1 = rowData[3];
var mensaje = ‘Estimado ‘ + destinatario + ‘,\n\n’ + mensaje1 + ‘ ‘ + parametro1;
var asunto = ‘Mensajes Pendientes’;
MailApp.sendEmail(emailAddress, asunto, mensaje);
}
}
function onOpen(){
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: ‘Send Emails’, functionName: ‘enviarMultiEmails’}
];
spreadsheet.addMenu(‘Enviar Emails’, menuItems);
}
Otra cosa, para automatizar más el asunto, tengo unos datos que validan si la información es correcta o no, entonces, me gustaría que si la información no es correcta en automático me envíe un correo para hacérmelo saber, existe alguna manera de poner este script dentro de una función IF en Google Sheets? Gracias de antemano, saludos.
Hola Miguel!
– Me puedes enviar la captura de tus tablas en Sheet?
– Que quieres validar en el asunto?
Buen día.
Muchas gracias por tu código.
El código funciona correctamente, quisiera consultarte si es posible que la toma del rango de las filas sea dinámico, es decir, tome la información de las celdas que solamente contengan información, ya que posteriores envíos pueden ser más o me nos filas?
Hola Alexis, una consulta sobre el script
MailApp.sendEmail(Email, asunto, mensaje); me sale con este error: “No se pudo enviar el correo electrónico: sin destinatario (línea 14, archivo “Código”)Ignorar”, pero igual envía el correo. Agradeceré me indiques cómo puedo solucinarlo
Hola, me puedes indicar tu código completo? Escríbeme a la fanpage o WhatsApp/Telegram
Hola, tengo una consulta que hacerte pero tu WhatsApp esta errado. Puedes compartirme lo corregido o decirme como mas puedo contactarte?
Hola Daniel!
Lamento la tardía respuesta. Tienes Telegram?
Hola Alexis, una consulta sobre el script
MailApp.sendEmail(Email, asunto, mensaje); me sale con este error: “No se pudo enviar el correo electrónico: sin destinatario (línea 14, archivo “Código”)Ignorar”, pero igual envía el correo. Agradeceré me indiques cómo puedo solucinarlo
Hola, me puedes indicar tu código completo? Escríbeme a la fanpage
Hola! yo puse en :
var dataRange = sheet.getRange(“B3:E6”);
“A2:H ” es decir que me tome toda la hoja, así si voy poniendo mas mail me los envía y no tengo que entrar al script a cambiar ese rango, pero me sale un error que dice: “no se puedo enviar los mail por que no hay destinatario” el mail comprobé que se envía y deduzco que sale ese error por que como te dije pongo de rango toda la hoja y hay celdas vacías que no tienen destinatario,la pregunta es como puedo hacer para que no me salga ese error.
Buenas noches Alexis, mil gracias por el tutorial, lo quiero utilizar para el envío de correos para el cumplimiento de compromisos comerciales, pero la columna de correos no me esta funcionando, ya que hay campos de correo en blanco debido a que solo se envía la información a determinados funcionarios. A si que necesitaría saber como me puede recorrer la columna de correos y que no haga nada con los campos en blanco, pero si envíe los que tienen el correo asignado, creo que seria con un If dentro del for validando la celda de cada correo, pero no se como seria la instrucción.
En este momento funciona si la columna de correos tiene correo, pero si encuentra una celda de correo en blanco, y si la primera celda no tiene correo no envía ninguno.
código
function enviarCorreosListaDesplegable() {
var correos = SpreadsheetApp.getActiveSpreadsheet();
correos.setActiveSheet(correos.getSheetByName(‘Compromisos’));
var hoja = SpreadsheetApp.getActiveSheet();
var rangoDatos = hoja.getRange(“B2:I4”);
var datos = rangoDatos.getValues();
for (i in datos) {
var filaDatos = datos[i];
var tema = filaDatos[0];
var compromiso = filaDatos[2];
var fechaLimite = filaDatos[4];
var destinatario = filaDatos[6];
var correo = filaDatos[7];
var mensaje = ‘Estimado ‘ + destinatario + ‘,\n\n’ + ‘Este es su compromiso: ‘ + compromiso + ‘.\n\n’ + ‘La facha de cumplimiento es: ‘ + fechaLimite;
var asunto = ‘Compromisos Adquiridos’;
MailApp.sendEmail(correo, asunto, mensaje);
}
}
function onOpen() {
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: ‘Send Emails’, functionName: ‘enviarCorreosListaDesplegable’}
];
spreadsheet.addMenu(‘Enviar Correos’, menuItems);
}
Hola Alexis
Necesito enviar el correo solo a la fila que se modifique, o sea si en la primera fila se modifica el parámetro 1 solo se le envía el correo a este.
Como lo hago?
Saludos
Hola Que tal,
Me puedes orientar, ya genere el codigo no me marca ningun error pero no me aparece el boton de enviar emails,
Hola Josue,
Claro, necesitaré ver tu código…
Solicito de su ayuda con el siguiente código ya que en el Asuntó debo traer el nombre y no he podido hacerlo
var nombre;
var correo;
var jefe;
var asunto = “Acompañamiento proceso de pensión”;(nombre);
var htx= hc.getSheetByName(‘Hoja 1’).getDataRange().getValues();
//Obtiene el estilo que va a tener el correo (CSS)
var style = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“Estilo CSS”).getRange(“A1”).getValue();
var nombre = htx[11][4]; //captura el nombre del funcionario para el correo
var correo = htx[14][5]; //captura el Correo del Jefe para el correo
Hola Daniel!
Necesitaré ver las celdas de dónde tomas los datos…
Muy BUenas tardes saben si en el evento onOpen hay retriccion para este codigo, de antemano muchas gracias.
Hola!
Me está dando el siguiente error y no entiendo porqué:
TypeError: No se puede llamar al método “addMenu” de null. (línea 24, archivo “Código”)
Este es mi código:
function enviarMultiEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName(“EnviarEmails”));
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getRange(“B3:E4”);
var data = dataRange.getValues();
for (i in data) {
var rowData = data[i];
var emailAddress = rowData[1];
var destinatario = rowData[0];
var mensaje1 = rowData[2];
var parametro1 = rowData[3];
var mensaje = ‘Estimado ‘ + destinatario + ‘,\n\n’ + mensaje1;
var asunto = ‘Invitación’;
MailApp.sendEmail(emailAddress, asunto, mensaje);
}
}
function onOpen(){
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: ‘Send Emails’, functionName: ‘enviarMultiEmails’}
];
spreadsheet.addMenu(‘EnviarEmails’, menuItems);
}
Hola Jorge,
Necesitaré ver la pantalla de las celdas que has seleccionado. Al parecer hay una celda vacía…
muchas gracias, es excelente!!!!!!
Genial Fer!
Un saludo 🙂
Hola Alexis,
Gracias por el codigo de programacion, tengo dos preguntas hay alguna forma de darle formato al mensaje es decir que se escriba una parte del mensaje con Negritas y si dentro del mensaje se envia una fecha tambien darle formato a esta fecha
Hola Luciana!
Sí es posible. Puedes usar etiquetas HTML para ello puedes consultar este manual de referencia.
Un saludo 🙂
Hola Alexis, estoy tratando de implementar el script pero da al ejecutar desde el menú el siguiente error: :Argumento no valido:” y en detalle no da detalle.
el script es el siguiente:, gracias por la ayuda si se puede.
function enviarMultiEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName(“Enviar-Emails”));
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getRange(“B3:E6”);
var data = dataRange.getValues();
for (i in data) {
var rowData = data[i];
var emailAddress = rowData[2];
var destinatario = rowData[0];
var mensaje1 = rowData[2];
var parametro1 = rowData[3];
var mensaje = ‘Estimado ‘ + destinatario + ‘,\n\n’ + mensaje1 + ‘ ‘ + parametro1;
var asunto = ‘Mensajes Pendientes’;
MailApp.sendEmail(emailAddress, asunto, mensaje);
}
}
function onOpen() {
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: ‘Send Emails’, functionName: ‘enviarMultiEmails’}
];
spreadsheet.addMenu(‘Enviar Emails’, menuItems);
}
Hola Roberto!
Envíame una pantalla de tus celdas para ver los detalles de celda
Donde dice “var emailAddress = rowData[2];”
es “var emailAddress = rowData[1];”
pero da el mismo error
Hola Alexis gracias por tu respuesta rápida, yo también estoy urgido por lograr esto por lo que estoy tomando nuevos caminos, ahora logré enviar los mails lo q no estoy logrando es que me envíe mas de una columna, se q es algo básico pero no lo sé, te agradecería la ayuda.
el script
function sendEmails() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 1; // First row of data to process
var numRows = 5; // Number of rows to process
// Fetch the range of cells A2:B3
var dataRange = sheet.getRange(startRow, 1, numRows, 8)
// Fetch values for each row in the Range.
var data = dataRange.getValues();
for (i in data) {
var row = data[i];
var emailAddress = row[0]; // First column
var message = row[2,3]; // Column B, Column C, Column D, Column E, Column F, Column G
var subject = “Prueba ro”;
MailApp.sendEmail(emailAddress, subject, message);
}
}
function onOpen() {
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [
{name: ‘Send Emails’, functionName: ‘sendEmails’}
];
spreadsheet.addMenu(‘Enviar Emails’, menuItems);
}
———————————————————————————–
SOLO ME ENVIA LA COLUNA 3 y no la 2 y la 3
LAS CELDAS DE LA HOJA CONTIENEN ALGO BIEN SENCILLO POR AHORA, ALGO ASI
EL MAIL EN LA A1………EL DATO 1, 2, 3, 4 ETC EN COLUMNAS DE LA MISMA LINEA
EL MAIL EN LA A2………EL DATO 1, 2, 3, 4 ETC EN COLUMNAS DE LA MISMA LINEA
ETC.
SOBRE LA DEFINICION DE CANTIDAD DE LINEAS LLEGAN TODAS BIEN AL MAIL PERO SOLO LLEGA UN DATO DE CADA UNA.
Hola Roberto!
Tu matriz es de 5×8?
Quiero ver en pantalla las celdas. Puedes enviarme una captura para ayudarte..
Hola! Espero que estés muy bien! Si yo deseo enviar varios registros (filas) para que llegue consolidado en un solo correo se puede? O solo puede ser individual?
Gracias
Hola Angie,
Claro, es posible con condicionales o bucles. Todo está en recoger los datos de cada fila. Puedes explorar un poco más en este artículo.
Saludos!
Hola, estoy haciendo el ejercicio tal cual como tu lo hiciste pero presento fallas en la línea tres
function enviarMultiEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName(“Enviar-Emails”));
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getRange(“B3:E6”);
var data = dataRange.getValues();
for (i in data) {
var rowData = data[i];
var emailAddress = rowData[1];
var destinatario = rowData[0];
var mensaje1 = rowData[2];
var parametro1 = rowData[3];
var mensaje = ‘Estimado ‘ + destinatario + ‘,\n\n’ + mensaje1 + ‘ ‘ + parametro1;
var asunto = ‘Mensajes Pendientes’;
MailApp.sendEmail(emailAddress, asunto, mensaje);
}
}
Hola Andrés, tu hoja está llamada como “Enviar-Emails”? Intenta copiar las comillas manualmente …
Hay alguna forma de programar esta el scrip mande el email automáticamente cuando haya contenido en una celda, es decir, esté siempre activo, y cuando aparezca información en una celda, mandé el email.
Hola Ismael!
Automáticamente no creo, pero sí puedes obtener el valor de una celda y enviarlo, Ejemplo aquí.
Primero que todo quisiera agradecerte por que tu código me funciona de maravilla, ahora solo quisiera saber si a este se le puede adicionar una condición con if-else
En donde que si el valor de la celda a1>0 ejecute el código y de lo contrario no.
¿Cómo quedaría este mismo código adicionándole esa condición?
Gracias.
Hola Camilo!
Primero, definirías la celda a verificar, ejemplo
var celda1 = ("C2");
Luego la ejecución se daría dentro del if…
if (celda1 == "0" ) {
---
}
Hola, al copiar el código de tu ejemplo, cuando guardo el código me da el siguiente error:
SyntaxError: Invalid or unexpected token (línia 12, fila “Codi.gs”), la línea 12 és la var mensaje….
function enviarMultiEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName(“Enviar-Emails”));
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getRange(“a75:c75”);
var data = dataRange.getValues();
for (i in data) {
var rowData = data[i];
var emailAddress = rowData[2];
var destinatario = rowData[1];
var mensaje1 = rowData[0];
var mensaje = ‘Estimado ‘ + destinatario + ‘,\n\n’ + mensaje1;
var asunto = ‘Mensajes Pendientes’;
MailApp.sendEmail(emailAddress, asunto, mensaje);
}
}
function onOpen() {
var spreadsheet = SpreadsheetApp.getActive();
var menuItems = [{name: ‘Send Emails’, functionName: ‘enviarMultiEmails’}];
spreadsheet.addMenu(‘Enviar Emails’, menuItems);
}
Puedes ayudarme?
Gracias
Hola!
Cambia las comillas simples, escríbelas manualmente.
Hola Alexis,
Siempre voy a estar muy agradecido con tigo por que este código me ha servido mucho para mis bases de datos. Quisiera saber cómo generar un activador en donde si el valor de una o varias celdas cambia, se active tu código. Te agradecería la respuesta, sé que google scripts nos ofrece activadores pero estos solo se “activan” con periodicidad de tiempo
Hola Andrés
Desafortunadamente se activan cada cierto tiempo. Para comprobar una celda modificada/editada tal vez te sirva onEdit(e).
Intentaré hacer algo parecido y en caso lo resuelva te comento. Por lo pronto sólo te podría recomendar ser apoyado en esta comunidad: Sheets Community
Saludos!
Muchísimas gracias,
Estaré muy atento.
Muchísimas gracias!! Muy buen post 🙂
Un saludo
Hola, Alexis.
Agradecido por la info, me consto pero lo hice funcionar.
Tengo esta situacion, solo me deja mandar una sola vez el mail luego me dice que fueron demasiados mails para esa cuenta. Luego cambie las cuentas y me dice que Exception: Servicio solicitado demasiadas veces para un mismo día: email
La idea era que me avise cuando hay un dato nuevo en una tabla y que me pudiera enviar un mail a mi cuenta.
Gracias
Hola Dario,
Puede que tu script esté haciendo muchos reenvíos con algún activador. Puedes enviarme tu código y configuración para echarle un vistazo: contacto@adictec.com
Hola, muchas gracias por tremendo video
Solo me pregunto si habría manera de automatizar dicha secuencia para que se enviara entre ciertas fechas