En este tutorial vamos a mejorar y limpiar un código de Google Apps Script para enviar correos desde Google Sheets. La idea es preparar nuestra base para luego poder hacer envíos masivos, enviar correos con archivos adjuntos, crear PDFs y mucho más. Además, agregaremos validaciones para que el script solo funcione en la hoja y celda correcta, y para que nos avise si intentamos enviar un correo sin estar sobre un contacto válido. También veremos cómo asignar la función a un botón para facilitar el envío individual y cómo registrar la fecha del último correo enviado. Así, vamos paso a paso para tener un sistema más robusto, limpio y flexible que luego podremos expandir con plantillas HTML y otras funcionalidades.
¿Qué hace nuestro código actual?
El código que tenemos hasta ahora permite enviar un correo electrónico desde Google Sheets cuando nos posicionamos sobre una fila con un contacto válido y ejecutamos la función. Si la fila no tiene correo, nos muestra un mensaje de error. Sin embargo, el menú para activar el envío está disponible en todas las hojas, lo que puede causar confusión o errores si estamos en una hoja que no corresponde. Además, no hay avisos claros cuando no estamos sobre un contacto válido o cuando nos ubicamos sobre el encabezado o una celda vacía.
Limitar la ejecución a una hoja específica
Para evitar que el código se ejecute en hojas incorrectas, vamos a agregar una validación que verifique el nombre de la hoja activa. Solo dejaremos que el script corra si estamos en la hoja llamada, por ejemplo, «Base». Si no, mostraremos un mensaje que diga que deben estar en la hoja correcta para enviar el correo.
function enviarme() {
var hoja = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var nombreHoja = hoja.getName();
if (nombreHoja != "Base") {
SpreadsheetApp.getUi().alert("Debe estar en la pestaña Base para enviar correos.");
return;
}
// Aquí continúa el resto del código para enviar el mail
}
Validar que la fila activa sea un contacto válido
Además de la hoja, debemos asegurarnos de que la fila activa esté entre los datos válidos, es decir, que no sea la fila del encabezado ni una fila vacía. Para esto, verificamos que la fila activa sea mayor a la fila del encabezado y menor o igual a la última fila con datos. Si no cumple, mostramos un aviso para que el usuario se posicione en un contacto.
var filaActiva = hoja.getActiveCell().getRow();
var filaEncabezado = 1; // Suponiendo encabezado en la fila 1
var ultimaFila = hoja.getLastRow();
if (filaActiva <= filaEncabezado || filaActiva > ultimaFila) {
SpreadsheetApp.getUi().alert("Debe estar situado sobre uno de sus contactos para enviar el correo.");
return;
}
Enviar el correo solo si hay una dirección válida
Luego, leemos el correo electrónico de la columna correspondiente (por ejemplo, columna C) y verificamos que no esté vacío ni sea inválido. Si no hay correo, mostramos un mensaje de error. Si hay correo, procedemos a enviar el mail y mostrar confirmación.
var correo = hoja.getRange(filaActiva; 3).getValue(); // Columna C
if (!correo || correo == "") {
SpreadsheetApp.getUi().alert("No hay un correo válido en esta fila.");
return;
}
// Código para enviar correo
MailApp.sendEmail(correo; "Asunto del correo"; "Cuerpo del correo");
SpreadsheetApp.getUi().alert("Correo enviado exitosamente.");
Asignar la función a un botón para facilitar el envío
En lugar de usar el menú para ejecutar la función, podemos crear un botón en la hoja para enviar el correo con un solo clic. Para esto:
- Vamos a Dibujar > Insertar dibujo.
- Creamos un cuadro con el texto Enviar mail individual.
- Insertamos el dibujo en la hoja.
- Hacemos clic en los tres puntos del dibujo y seleccionamos Asignar secuencia de comandos.
- Escribimos el nombre de la función sin paréntesis, por ejemplo
enviarme.
De esta forma, al hacer clic en el botón, se ejecutará la función y enviará el correo solo si estamos en la hoja y fila correctas.
Registrar la fecha del último envío
Para llevar un control, podemos agregar una columna donde se registre la fecha y hora en la que se envió el último correo a cada contacto. Para esto, después de enviar el correo, ponemos la fecha actual en la celda correspondiente, por ejemplo en la columna D (al lado del correo).
var fechaEnvio = new Date();
hoja.getRange(filaActiva; 4).setValue(fechaEnvio); // Columna D para fecha envío
Crear una hoja de configuración para el correo
Para hacer nuestro código más flexible, creamos una hoja llamada Configuración donde definiremos el nombre del correo y el asunto. Así, no tendremos que modificar el código cada vez que queramos cambiar estos valores.
var hojaConfig = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Configuración");
var nombreCorreo = hojaConfig.getRange("A1").getValue();
var asuntoCorreo = hojaConfig.getRange("B1").getValue();
Luego usamos estas variables en el envío del correo para personalizarlo:
MailApp.sendEmail(correo; asuntoCorreo; "Hola " + nombre + ", muchas gracias por su compra.");
¿Qué sigue? Envíos masivos y correos HTML
Con esta base limpia y mejorada, estamos listos para dar el siguiente paso: crear correos con plantillas HTML para que sean más atractivos y personalizados, incluir imágenes, enlaces y colores, y también hacer envíos masivos. Todo esto lo veremos en los próximos videos y tutoriales para que puedas automatizar tus comunicaciones desde Google Sheets de manera profesional.
Conclusión
En resumen, hemos limpiado y mejorado nuestro código para enviar correos desde Google Sheets, agregando:
- Validación para que solo funcione en la hoja correcta.
- Validación para que solo envíe correo si estamos sobre una fila válida con email.
- Mensajes de alerta claros para evitar errores.
- Asignación de la función a un botón para facilitar el envío.
- Registro de la fecha del último correo enviado.
- Creación de una hoja de configuración para el nombre y asunto del correo.
Con estos pasos tienes una base sólida para automatizar tus envíos desde Google Sheets y prepararte para funcionalidades más avanzadas.
Si quieres aprender a usar Google Forms y Google Sheets desde cero, te invito a tomar un curso gratis de 2 horas.