Cómo crear un menú personalizado en Google Sheets para enviar correos por fila

En este tutorial vamos a aprender a crear un menú personalizado en Google Sheets para enviar correos electrónicos de manera individual desde cualquier fila de nuestra base de datos. La idea es que, al seleccionar una fila, podamos enviar un correo con una plantilla que tome datos específicos de esa fila, y que además tenga validaciones básicas, como verificar que el correo exista antes de enviar. Esto es súper útil para emprendedores o empleados que quieren automatizar el envío de mensajes sin complicarse con copiar y pegar o abrir otras aplicaciones.

1. Crear el menú personalizado en Google Sheets

Primero, vamos a crear un menú que aparezca en la barra superior de Google Sheets cuando abramos el archivo. Este menú tendrá un ítem llamado “Enviar mail a contacto actual” con un emoji para hacerlo más visual. Para esto usamos la función onOpen, que se ejecuta automáticamente al abrir el archivo.

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  const miMenu = ui.createMenu('Acciones');
  miMenu.addItem('✉️ Enviar mail a contacto actual', 'enviarMailActual');
  miMenu.addToUi();
}

Este código crea el menú “Acciones” y le añade un ítem que llama a la función enviarMailActual, que vamos a crear a continuación.

2. Obtener la fila activa y validar la hoja

Para enviar el correo correcto, necesitamos saber en qué fila estamos ubicados. Además, queremos que este menú funcione sólo en una hoja específica llamada “bd” (base de datos). Así evitamos errores si estamos en otra hoja.

function enviarMailActual() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const hoja = ss.getActiveSheet();
  const nombreHojaPermitida = 'bd';

  // Validar que estemos en la hoja correcta
  if (hoja.getName() !== nombreHojaPermitida) {
    SpreadsheetApp.getUi().alert('Por favor, usa este menú sólo en la hoja "bd".');
    return;
  }

  const celdaActiva = hoja.getActiveCell();
  const filaActiva = celdaActiva.getRow();

  // No permitir enviar desde la fila 1 (encabezado)
  if (filaActiva === 1) {
    SpreadsheetApp.getUi().alert('No puedes enviar correo desde la fila de encabezado.');
    return;
  }

  // Aquí sigue el código para obtener datos y enviar correo...
}

Con esto nos aseguramos que el usuario no intente enviar correos desde filas no válidas o desde hojas equivocadas.

3. Obtener los datos de la fila seleccionada

Ahora vamos a capturar los datos que necesitamos para el correo, como el correo electrónico, nombre, producto, valor, fecha y tipo. Estos datos los tomamos de columnas específicas de la fila activa. Por ejemplo, el correo está en la columna 1, el nombre en la columna 2, y así sucesivamente.

const correo = hoja.getRange(filaActiva; 1).getValue();
const nombre = hoja.getRange(filaActiva; 2).getValue();
const producto = hoja.getRange(filaActiva; 3).getValue();
const valor = hoja.getRange(filaActiva; 4).getValue();
const fecha = hoja.getRange(filaActiva; 5).getValue();
const tipo = hoja.getRange(filaActiva; 6).getValue();

Si prefieres, puedes ajustar las columnas según tu estructura de datos. Lo importante es que uses la variable filaActiva para que siempre tome la fila donde estés parado.

4. Cargar la plantilla y reemplazar variables

La plantilla que usaremos para el correo está en otra hoja llamada “plantilla”, en la celda A3 (fila 3, columna 1). Vamos a leer ese texto y reemplazar los marcadores como [[nombre]], [[producto]], etc. por los valores que acabamos de obtener.

const hojaPlantilla = ss.getSheetByName('plantilla');
const plantilla = hojaPlantilla.getRange(3; 1).getValue();

let mensaje = plantilla
  .replace('[[correo]]'; correo)
  .replace('[[nombre]]'; nombre)
  .replace('[[producto]]'; producto)
  .replace('[[valor]]'; valor)
  .replace('[[fecha]]'; fecha)
  .replace('[[tipo]]'; tipo);

Así generamos el mensaje personalizado para ese contacto.

5. Validar correo y enviar el email

Antes de enviar el correo, validamos que la variable correo no esté vacía. Si está vacía, mostramos una alerta y no enviamos el correo. Si todo está bien, enviamos el correo con un asunto fijo y el mensaje que construimos.

if (!correo) {
  SpreadsheetApp.getUi().alert('No hay correo electrónico en la fila seleccionada.');
  return;
}

const asunto = 'Confirmación de compra';
MailApp.sendEmail(correo; asunto; mensaje);

hoja.getRange(filaActiva; 7).setValue('OK'); // Marca OK en columna 7
SpreadsheetApp.getUi().alert('Correo enviado correctamente.');

En este ejemplo, la columna 7 es donde dejamos la confirmación de envío con un “OK”. Puedes cambiarla según tu hoja.

Conclusión

En resumen, creamos un menú personalizado que aparece al abrir nuestro Google Sheets, que nos permite enviar un correo electrónico a la persona de la fila donde estemos parados. El sistema valida que estemos en la hoja correcta, que no estemos en el encabezado, y que exista un correo para enviar. Además, usa una plantilla con marcadores que se reemplazan por datos dinámicos de cada fila, y marca la confirmación en la hoja para llevar control. Esto simplifica mucho el envío manual y evita errores comunes.

Como próximos pasos, puedes mejorar el menú agregando más opciones, personalizar la plantilla con HTML para correos más bonitos, o incluso automatizar envíos masivos con un botón diferente.

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

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.