Hola a todos! hoy veremos cómo mejorar tu productividad usando Google Script, en este caso usaremos Google Sheets y Gmail para automatizar algunas tareas.
La idea es que en base a una Google Sheet que contiene un listado de personas/clientes/amigos y sus emails podamos enviar un correo a cada uno usando un script que automáticamente recorre la lista, genera el correo, le adjunta un archivo y realiza el envío a través de Gmail.
Tabla de Contenidos
Caso real a solucionar
Este artículo surge de una consulta que me llegó a través de un comentario en este otro artículo; el problema es que Jesús (nuestro lector) administra un condominio con 64 apartamentos y mensualmente genera un resumen de los gastos en distintos archivos Excel (uno por apto). Luego, adjunta el archivo a un mail el cual es enviado manualmente uno a uno… una tarea titánica y tediosa que le consume bastante tiempo todos los meses.
Es fácil darse cuenta que este problema es bastante común y puede presentarse de distintas formas, imaginen por ejemplo si estuvieran armando una fiesta y quisieran enviar por mail la invitación a todos los participantes. Entonces, las situaciones pueden ser muy variadas pero la solución es única e independiente sólo hay que seguir los pasos que vamos a ver a continuación y lograremos automatizar el flujo de trabajo completo aprovechando todo el poder de Google App Scripts.
En resumen, lo que queremos lograr es:
[star_list]
- enviar mails mensuales de forma automática (esto a lo aprendimos cuando vimos cómo automatizar envíos de emails).
- obtener los destinatarios de una hoja de cálculo que contiene sus datos (email, nombre, etc.).
- personalizar los correos y adjuntar un documento específico a cada uno.
[/star_list]
Ahora sí, sin más vueltas vamos a la solución.
Mejorar tu productividad en 3 pasos
Preparando una Google Sheet – PASO 1
Para los que no saben, una Google Sheet (hoja de cálculo) es ni más ni menos que un archivo Excel pero de Google Drive. Aclarado esto, lo primero que vamos a hacer es crear una nueva Sheet que tendrá el listado con las personas a quienes queremos enviar el mail; deberá tener el siguiente formato:
[bd_table]
Nombre propietario | Mensaje | Adjunto | Enviado | |
Pedro Pérez | pp@mail.com | Mensaje para Pedro | archivo1 | |
María Gómez | mg@mail.com | Mensaje para María | archivo2 |
[/bd_table]
Desde esta Sheet vamos a tomar los datos para generar automáticamente los e-mails y enviarlos con los archivos adjuntos correspondientes, expliquemos algunas de las columnas de la hoja de cálculo.
Las tres primeras columnas son bastante básicas, el nombre, el email y un mensaje que usaremos en cada correo generado.
En la columna «Adjunto» escribiremos el nombre del archivo a adjuntar, la idea es que sea un nombre único por destinatario y puede ser cualquier tipo de archivo que tengamos en nuestro Google Drive; aclarar que basta con poner el nombre del archivo (sin incluir la extensión del archivo).
La columna «Enviado» sirve como control, como es un proceso que puede demorar, iremos marcando a quien se le ha enviado el correo, así en caso de que el proceso se interrumpa podemos retomarlo sin tener que re procesar toda la lista.
Creando el script en nuestra hoja de cálculo – PASO 2
El siguiente paso es crear el script que generará y enviará los correos, en este caso el script estará contenido en la propia hoja de cálculo que acabamos de crear y para eso vamos a ir al menu «Herramientas» -> «Editor de Secuencias de comando» (ver imagen).
Seguidamente tendrán acceso al editor de scripts, donde insertarán el siguiente código que luego explicaremos.
// constante para saber si el email fue enviado.
var EMAIL_SENT = "ENVIADO";
function enviosMensuales() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2; // primer fila para procesar (salteamos el cabezal)
var numRows = 2; // filas totales para procesar
// Obtengo el rango de celdas a preocescar A2:E3
var dataRange = sheet.getRange(startRow, 1, numRows, 5);
// Obtengo los valores de las filas
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var nombrePropietario = row[0]; // primera columna
var emailDireccion = row[1]; // segunda columna
var mensaje = row[2]; // tercera columna
var nombreAdjunto = row[3]; // cuarta columna
var colEnviado = row[4]; // quinta columna
if (colEnviado != EMAIL_SENT) { // previene de enviar duplicados
var asunto = "Recibo mensual";
mensaje = "SR. " + nombrePropietario + ": " + mensaje;
var adjunto = DriveApp.getFilesByName(nombreAdjunto);
MailApp.sendEmail(emailDireccion, asunto, mensaje,
{name: 'Procesador mensual',
attachments:[adjunto.next()]
}
);
sheet.getRange(startRow + i, 5).setValue(EMAIL_SENT);
// actualizo
SpreadsheetApp.flush();
}
}
}
Lo que hacemos en el script es implementar una función que hace lo siguiente:
- obtiene el rango de datos a procesar (fijate en la linea 7 que salteamos el cabezal).
- procesa linea por linea obteniendo los datos de cada persona.
- verifica si ya se le ha enviado el mail a esa persona.
- si no fue enviado, genera un correo, obtiene el archivo especificado y lo adjunta al correo.
- finalmente, envía el correo y escribe en la columna "Enviado" para saber que esa linea ya fue procesada.
Configurando eventos - PASO 3
Sólo nos falta automatizar la tarea mensualmente, es decir que, debemos configurar un "Activador" para que cierto día del mes automáticamente se ejecute nuestro script y envíe los correos.
Para eso debemos ir a la barra de herramientas y presionamos el botón de "Activadores del proyecto".
Luego creamos un nuevo "Activador" y configuramos el evento con los siguientes valores:
- Tipo de disparador: Basado en el tiempo
- Temporizador mensual.
- Día: 5 (es un ejemplo)
- Hora: entre 1pm y 2pm. (es un ejemplo)
Con estos valores estamos diciendo que nuestro script debe ejecutarse el día 5 de cada mes entre la 1pm y las 2pm. Es claro que los valores los ajustan a su gusto 😉
Resumen
Con esta solución, lo único que debe hacer Jesús es generar los archivos de gastos y subirlos a Google Drive antes de la fecha de ejecución que hayamos configurado.
Algunos detalles sobre esta solución que se pueden mejorar:
- podemos quitar la columna ENVIADO así no tenemos que borrarla todos los meses, pero nos quedaríamos sin control de envíos.
- otra opción es autogenerar nuevas columnas para cada mes procesado.
- obtener el rango de registros automáticamente.
- administrar los nombres de los archivos automáticamente según el mes (ej.: archivoPropietario-noviembre); de esta forma estandarizamos los nombres y no debemos preocuparnos por borrar los archivos viejos.
Resultados obtenidos
[yes_list]
- Con todo lo que hemos visto puedes mejorar tu productividad delegando las tareas repetitivas en herramientas como Gmail, Google Sheets y Google App Script que están al alcance de todos y de forma gratuita.
- Además, hemos logrado automatizar todo el flujo de trabajo que realizábamos manualmente, reduciendo al mínimo el trabajo repetitivo.
- También, hemos reducido la cantidad de horas de trabajo y por lo tanto aumentamos y mejoramos nuestra productividad.
- Finalmente, hemos reducido la posibilidad de cometer errores durante el proceso de trabajo mediante el uso de herramientas automatizables.
[/yes_list]
Bueno eso es todo... espero que el artículo le sea útil a Jesús y a todos los lectores. Si te gustó, me encantaría que lo compartieras en tus redes sociales. Y si tienes más consultas o sugerencias puedes dejarlas en la sección de comentarios del post.
¿En qué otras situaciones se podría usar esta solución o una similar? ¿Te parece que esta solución puede mejorar tu productividad? ¿De qué manera?
Más info: Developers Apps Script
Hola Juan, te quiero consultar lo siguiente:tengo que enviar un mail diario a una lista de contactos, este mail en el asunto puede tener un numero correlativo o bien la fecha del dia, y un archivo adjunto que es un .mp3 que los tengo numerados; se podrá hacer automáticamente?….gracias!!
Saludos!
Hola Andres, en este artículo se muestra casi todo lo que precisas para hacerlo:
1- enviar mail diario a una lista de contactos -> está cubierto.
2- adjuntar un archivo -> está cubierto.
3- asunto del mail con número o fecha -> esto lo puedes hacer desde la planilla directamente (create una nueva columna) o programando en el script como se muestra en este artículo.
saludos, Juan.
Hola Juan
Muy buen script. Muy util. 😉
a) Como lo harias para enviar un email a varias direcciones?
Es decir al alumno con CC a su padre o profesor (estos datos en 2 nuevas columnas)
Gracias
Fran
Hola Fran, el método sendMail quedaría algo así:
te recomiendo que veas la Referencia a la API por más opciones.
saludos.
Muchas gracias y muy interesante me ayudo mucho
Tengo una duda, he buscado y no logro encontrar, como puedo hacer que en Google Sheet, al momento de abrirlo se vaya generando en una celda un consecutivo numerico sin la necesidad de utilizar un formulario, directamente de la hoja de calculo, esto lo hice pero en VB, pero no logro hacerlo en apps script
*****Ejemplo de VB****
Sub Incrementar()
Range(«F5»).Select
ActiveCell.FormulaR1C1 = Range(«F5»).Value + 1
End Sub
Jesús, te lo contesto en un nuevo articulo así queda bien explicado y disponible para todos los fans de google apps script 😉
Hola buenas noches quisiera saber como podria crear un script que me ayude hacer un contador de mensajes entre cierto grupo de personas que me cuente por decir un ejemplo un grupo de cuatro personas se han estado enviado correos entre ellos durante una semana y quisiera por medio de un script hacer un contador que me lleve cuantos mensajes se han enviado todos por semana, le agradezco una respuesta.
Hola me gustaria saber si se puede crear uno en el que tu le pongas tu Facebook y te cheque los likes, comentarios, campartidos que al igual te ponga el post y el link y que eso lo haga cada semana
Buenas tardes
Como puedo adjuntar un archivo desde formulario de drive
Saludos
Hola Juan
Muchas gracias por tu articulo me ha sido de gran ayuda, tengo un problema, he programado el activador y no ha funcionado, tengo que ejecutar de forma manual este es el script que pegue de acuerdo a tus indicaciones, me puedes ayudar por favor?
// constante para saber si el email fue enviado.
var EMAIL_SENT = "ENVIADO";
function enviosDiarios() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2; // primer fila para procesar (salteamos el cabezal)
var numRows = 4; // filas totales para procesar
// Obtengo el rango de celdas a preocescar A2:E3
var dataRange = sheet.getRange(startRow, 1, numRows, 5);
// Obtengo los valores de las filas
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var nombrePropietario = row[0]; // primera columna
var emailDireccion = row[1]; // segunda columna
var mensaje = row[2]; // tercera columna
var nombreAdjunto = row[3]; // cuarta columna
var colEnviado = row[4]; // quinta columna
if (colEnviado != EMAIL_SENT) { // previene de enviar duplicados
var asunto = "PROYECTO SEGUIMIENTO POST VENTA";
mensaje = "Sr.(ita) " + nombrePropietario + ": " + mensaje;
var adjunto = DriveApp.getFilesByName(nombreAdjunto);
MailApp.sendEmail(emailDireccion, asunto, mensaje,
{name: 'SEGUIMIENTO POST VENTA',
attachments:[adjunto.next()],
bbc: 'xxxxx@xxxxxxx.com.' ,
}
);
sheet.getRange(startRow + i, 5).setValue(EMAIL_SENT);
// actualizo
SpreadsheetApp.flush();
}
}
}
Buenos días.
tengo una pregunta, si tengo una lista desplegable y depende de la persona que seleccione envie un correo como lo puedo hacer.
actualmente tengo un codigo pero me pone problemas el if/else
function myFunction()
{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(«Mejoras y Proyectos»);
var emailSubject = («Asignación de Req Nuevo»);
var emailAddress = («sebastian.baena@arus.com.co»);
var emailText = sheet.getRange(‘M152’).getValue();
if(sheet.getRange (‘M152’) == («DANIELA BETANCUR.»))
{
if (sheet.getActiveCell(‘M152’) == («ANAYIBE NARANJO.»))
{
var emailAddress = («sebastian.baena@arus.com.co»);
var emailText = sheet.getRange(‘M152’).getValue();
GmailApp.sendEmail(«sebastian.baena@arus.com.co»,»Asignación de Req Nuevo»,»Daniela Betancur, Se le ha asignado un nuevo requerimiento por favor validar en la Bitácora»);
} else
{
var emailAddress = («sebastian.baena@arus.com.co»);
var emailText = sheet.getRange(‘M152’).getValue();
GmailApp.sendEmail(«sebastian.baena@arus.com.co»,»Asignación de Req Nuevo»,»Anayibe Naranjo, Se le ha asignado un nuevo requerimiento por favor validar en la Bitácora»);;
}
}
}
Hola. Necesito que de un correo de gmail que me llegue lo lea Y llene una hoja de cálculo igual de google
Hola buen día.
Es posible generar desde una hoja de cálculo( Google ). Otras hojas de cálculo.
Por ejemplo columna B1,C1,D1 tengo que seleccionar un datos, cuando cumplo con la regla que e seleccionado un dato de cada una de las celdas en la celda A1 me genera un nombre o un consecutivo.
Necesito crear una hoja de cálculo con el mismo nombre.
Cuando cumplo con la regla me da un error de que no tengo permisos.
Pero si ejecutó directo el script me generar un archivo pero no me toma ningún nombre.
No es problema del script creo que sería problema de la hoja de cálculo al ejecutar el script.
A alguien le a pasado algo similar?.