⚡ Google Apps Script
Automatiza Google Workspace y usa Google Sheets como base de datos con JavaScript en la nube — completamente gratis con tu cuenta Google.
📖 Teoría
Google Apps Script (GAS) es una plataforma de scripting basada en JavaScript que corre directamente en los servidores de Google. Permite automatizar y extender las aplicaciones de Google Workspace como Gmail, Google Sheets, Drive, Calendar, Forms y Docs.
- Sin instalación: el editor se abre directamente desde el navegador (Extensiones → Apps Script).
- JavaScript en la nube: usa la misma sintaxis de JavaScript (ES5/ES6), sin TypeScript obligatorio.
- Se ejecuta en servidores de Google: no depende del dispositivo del usuario.
- Acceso completo a Google Workspace: Sheets, Gmail, Drive, Calendar, Forms, Docs, Slides.
- Completamente gratuito con cualquier cuenta Google (personal o institucional).
- Puede publicarse como Web App: convierte tu script en una API REST o una página web.
💡 ¿Cómo abrirlo? Abre cualquier Google Sheet → menú Extensiones → Apps Script. El editor se abre en una nueva pestaña con el código ligado a ese archivo.
| Característica | Google Apps Script | Office Scripts | VBA (Excel) |
|---|---|---|---|
| Lenguaje | JavaScript (ES6+) | TypeScript | Visual Basic |
| Plataforma | Google Workspace (web) | Excel 365 (web/escritorio) | Excel Windows/Mac |
| Integración | Sheets, Gmail, Drive, Forms, Calendar | Excel + Power Automate | Solo Office local |
| Gratuito | ✅ Gratis con Google | ❌ Requiere M365 de pago | ✅ Incluido en Office |
| Ejecución | Nube (servidores Google) | Nube (servidores Microsoft) | Local (tu PC) |
| Web App / API | ✅ doGet / doPost | ❌ No | ❌ No |
| Dificultad | Media (JS) | Media-Alta (TypeScript) | Media (VB) |
| Triggers automáticos | ✅ Múltiples tipos | ✅ Power Automate | ✅ Limitados (eventos) |
💡 GAS es la mejor opción si ya usas Google Workspace y quieres automatizar sin pagar licencias adicionales.
Google Sheets puede funcionar como una base de datos ligera cuando se combina con Google Apps Script. Es ideal para proyectos pequeños y medianos que no necesitan la potencia de MySQL o PostgreSQL.
✅ Ventajas (Pros)
- Completamente gratuito
- Colaborativo — varios usuarios en tiempo real
- Sin servidor — no necesitas hosting
- Interfaz visual — cualquiera puede ver los datos
- API REST nativa con GAS (doGet/doPost)
- Historial de versiones automático
- Integración con Google Forms para captura de datos
⚠️ Limitaciones (Cons)
- Límite de 10 millones de celdas por archivo
- Sin transacciones reales (no hay rollback)
- Sin índices avanzados — búsquedas lentas en tablas grandes
- No ideal para más de 100 000 filas
- Cuotas de ejecución diaria de GAS (6 min por ejecución)
- No hay JOIN como en SQL
- Sin control de concurrencia avanzado
| Objeto / Método | Qué hace | Ejemplo de uso |
|---|---|---|
SpreadsheetApp | Punto de entrada para Google Sheets | SpreadsheetApp.getActiveSpreadsheet() |
getSheetByName() | Obtiene una hoja por nombre | .getSheetByName("Datos") |
getDataRange() | Obtiene el rango con datos de la hoja | sheet.getDataRange() |
getValue() | Lee el valor de una celda | range.getValue() |
getValues() | Lee un rango como array 2D | range.getValues() |
setValue() | Escribe un valor en una celda | range.setValue("Hola") |
setValues() | Escribe un array 2D en un rango | range.setValues(datos) |
appendRow() | Agrega una fila al final de la hoja | sheet.appendRow([col1, col2]) |
DriveApp | Gestiona archivos en Google Drive | DriveApp.createFile() |
MailApp | Envía correos desde Gmail | MailApp.sendEmail(to, subj, body) |
UrlFetchApp | Hace peticiones HTTP (APIs externas) | UrlFetchApp.fetch(url) |
Logger.log() | Imprime en el log de depuración | Logger.log("mensaje") |
Los triggers (disparadores) permiten ejecutar scripts automáticamente sin intervención humana. Son una de las características más poderosas de GAS.
- onFormSubmit: se ejecuta cada vez que alguien envía un Google Form vinculado. Ideal para guardar respuestas, enviar confirmaciones por correo o procesar datos.
- onEdit: se dispara cuando alguien edita manualmente una celda. Útil para validar datos, calcular totales o registrar cambios.
- onOpen: se ejecuta cuando se abre el documento. Sirve para agregar menús personalizados.
- Triggers por tiempo (time-based): se ejecutan a una hora fija (cada hora, cada día, cada semana). Perfectos para reportes automáticos o respaldos.
- doGet / doPost (Web App): permiten que el script funcione como una API REST.
doGetresponde peticiones GET ydoPostrecibe datos de formularios o aplicaciones externas.
💻 Galería de Scripts
Ejemplos listos para copiar y pegar en el editor de Google Apps Script (Extensiones → Apps Script). Haz clic en cada pestaña para ver el código.
Escribe el texto "¡Hola desde Google Apps Script!" en la celda A1 de la hoja activa y muestra un mensaje en el log.
function myFunction() { var sheet = SpreadsheetApp.getActiveSheet(); sheet.getRange("A1").setValue("¡Hola desde Google Apps Script!"); Logger.log("Script ejecutado correctamente."); }
💡 Ejecuta con el botón ▶ del editor. Verifica el resultado en la celda A1 de tu hoja.
Lee todos los datos de la hoja llamada "Datos" e imprime cada fila en el log de depuración.
function leerDatos() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Datos"); var datos = sheet.getDataRange().getValues(); datos.forEach(function(fila, i) { Logger.log("Fila " + (i+1) + ": " + fila.join(", ")); }); }
💡 getValues() devuelve un array bidimensional: datos[fila][columna]. El log se ve en Ver → Registros de ejecución.
Agrega un nuevo cliente al final de la hoja "Clientes" con fecha, nombre, correo, ciudad y estado.
function agregarRegistro() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Clientes"); var nuevoCliente = [new Date(), "Juan Pérez", "juan@email.com", "Medellín", "Activo"]; sheet.appendRow(nuevoCliente); SpreadsheetApp.getUi().alert("¡Cliente agregado correctamente!"); }
💡 appendRow() siempre agrega al final, nunca sobreescribe datos existentes. El array debe tener un elemento por cada columna.
Envía un correo electrónico automático usando MailApp desde la cuenta Google vinculada al script.
function enviarCorreo() { var destinatario = "profe@escuela.edu.co"; var asunto = "Reporte automático"; var cuerpo = "Hola, este correo fue enviado automáticamente desde Google Apps Script."; MailApp.sendEmail(destinatario, asunto, cuerpo); Logger.log("Correo enviado a: " + destinatario); }
💡 La cuenta gratuita de Google permite enviar hasta 100 correos por día. Para más destinatarios usa un bucle con forEach.
Función que busca un cliente por nombre en la hoja "Clientes" y devuelve su fila y datos. Patrón clave para usar Sheets como BD.
function buscarCliente(nombre) { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Clientes"); var datos = sheet.getDataRange().getValues(); for (var i = 1; i < datos.length; i++) { // i=1 para saltar encabezados if (datos[i][1] === nombre) { return { fila: i + 1, datos: datos[i] }; } } return null; // No encontrado }
💡 datos[i][0] es la columna A, datos[i][1] es la columna B, etc. El índice i=1 salta la fila de encabezados.
📚 Diccionario
.getSheetByName("Clientes").array[fila][columna].console.log() en el navegador.fetch() en el navegador.doGet(e) maneja peticiones GET y doPost(e) maneja peticiones POST. Convierte el script en una API REST.🎬 Videos en Español
📌 Curso Google Apps Script desde 0 — Introducción
📌 Curso Google Apps Script — El objeto SpreadsheetApp
📌 Google Sheets + Apps Script — Crear Formulario con Botones
📌 Google Sheets y Apps Script — Pasos iniciales
🎯 Cuestionario
10 preguntas aleatorias del banco de 50. Calificación de 0 a 100.
Tu calificación: