⚡ Office Scripts en Excel
El JavaScript/TypeScript que moderniza la automatización de Excel — multiplataforma, seguro y compatible con Power Automate.
🔀 De VBA a JavaScript: tabla de equivalencias rápidas
Si ya sabes macros VBA, esta tabla es tu puente directo a Office Scripts: mismo problema, sintaxis distinta. Consúltala mientras recorres el simulador de abajo.
| En VBA | En Office Scripts (TypeScript) | Nota |
|---|---|---|
Sub Nombre() ... End Sub | function main(workbook: ExcelScript.Workbook) {...} | Un Office Script solo tiene UNA función de entrada: main(). |
Dim x As Integer | let x: number | TypeScript no distingue Integer/Long/Double: todo es number. |
Range("A1").Value | range.getValue() / setValue() | No hay propiedades directas: todo son métodos get/set. |
Cells(fila, columna) — 1-indexado | getCell(fila-1, columna-1) — 0-indexado | ¡Ojo! En Office Scripts filas y columnas empiezan en 0. |
Worksheets("Hoja1") | workbook.getWorksheet("Hoja1") | Mismo concepto, distinto nombre de método. |
MsgBox "texto" | console.log("texto") | No hay ventana emergente: el mensaje sale en el panel de registro. |
InputBox("pregunta") | Parámetro extra en main(workbook, dato: string) | Excel pide el dato en un panel al ejecutar el script a mano. |
For i = 1 To 10 ... Next i | for (let i = 1; i <= 10; i++) {...} | Misma idea, sintaxis de llaves. |
Do While cond ... Loop | while (cond) {...} | Igual de directo. |
If...Then...ElseIf...Else...End If | if (...) {...} else if (...) {...} else {...} | Sin palabras "Then"/"End If": todo con llaves. |
On Error GoTo Etiqueta | try {...} catch (error) {...} | Bloques try/catch en vez de saltar a una etiqueta. |
RGB(255,0,0) | "#FF0000" | Los colores son strings hexadecimal, no una función. |
.Font.Bold = True | .getFormat().getFont().setBold(true) | Se encadenan métodos get en vez de "With". |
WorksheetFunction.CountIf(...) | workbook.getFunctions().countIf(...) | Mismo concepto: usar fórmulas de hoja desde el código. |
& (concatenar texto) | + o `${variable}` | Los template strings (comillas invertidas) son más cómodos. |
.xlsm (archivo especial) | Cualquier .xlsx normal | El script se guarda aparte en OneDrive, no dentro del Excel. |
📌 Regla de oro: en VBA casi todo es una propiedad (.Value, .Bold); en Office Scripts casi todo es un método (.getValue(), .setBold()). Si dudas, prueba get/set + el nombre en inglés de la propiedad de VBA.
📖 Teoría
Los Office Scripts son scripts de automatización para Excel basados en TypeScript (un lenguaje derivado de JavaScript). Fueron lanzados por Microsoft en 2020 como la evolución moderna de las macros VBA para el entorno de Microsoft 365.
- Disponibles en Excel para la web y Microsoft 365 (Windows y Mac).
- Se crean y editan desde la pestaña Automatizar → Editor de código.
- Se guardan automáticamente en OneDrive junto con el libro.
- Se pueden ejecutar desde Power Automate sin abrir Excel.
- Son más seguros que VBA: están en un entorno aislado (sandboxed).
💡 Puedes grabar un Office Script sin escribir código: Automatizar → Grabar acciones, igual que grabas una macro. Excel incluso puede grabar la macro VBA y el Office Script AL MISMO TIEMPO con la misma grabadora — ideal para comparar ambos códigos lado a lado (ver video de la sección Ejercicios).
🏛️ Macros VBA (clásicas)
- Lenguaje: VBA (Visual Basic for Applications)
- Solo en Excel de escritorio Windows
- Se guarda dentro del archivo .xlsm
- Acceso al sistema de archivos y COM (Outlook, carpetas...)
- No se integra con Power Automate
- Propiedades directas:
.Value,.Bold
⚡ Office Scripts (moderno)
- Lenguaje: TypeScript (JavaScript con tipos)
- Windows, Mac y Excel para la web
- Se guarda en OneDrive, fácil de compartir
- Sandboxed: SIN acceso a archivos locales ni Outlook directo
- Se integra con Power Automate
- Métodos get/set:
.getValue(),.setBold()
💡 VBA sigue siendo útil para automatizaciones de escritorio que necesitan tocar archivos locales o programas como Outlook. Office Scripts es la opción para la nube, el trabajo colaborativo y los flujos con Power Automate.
Todo Office Script comienza con la función main(), que recibe el libro de Excel como parámetro:
function main(workbook: ExcelScript.Workbook) { // Tu código aquí let sheet = workbook.getActiveWorksheet(); let range = sheet.getRange("A1"); range.setValue("¡Hola desde Office Scripts!"); }
- workbook — representa el libro de Excel completo (equivale a ThisWorkbook/Application en VBA).
- getActiveWorksheet() — obtiene la hoja activa (equivale a ActiveSheet).
- getRange("A1") — selecciona una celda o rango (equivale a Range("A1")).
- setValue() — escribe un valor en la celda (equivale a .Value = ...).
- Se pueden declarar funciones auxiliares además de main(), igual que Subs adicionales en un módulo VBA.
| Objeto | Qué representa | Cómo se obtiene | Equivalente VBA |
|---|---|---|---|
| ExcelScript.Workbook | El libro completo de Excel | Parámetro de main() | ThisWorkbook |
| ExcelScript.Worksheet | Una hoja del libro | workbook.getActiveWorksheet() | Worksheets("...") |
| ExcelScript.Range | Un rango de celdas | sheet.getRange("A1:B10") | Range("A1:B10") |
| ExcelScript.Table | Una tabla estructurada | workbook.getTable("Nombre") | ListObjects("Nombre") |
| ExcelScript.Chart | Un gráfico del libro | sheet.getChart("Nombre") | ChartObjects("Nombre") |
| ExcelScript.PivotTable | Una tabla dinámica | workbook.addPivotTable(...) | PivotTables("Nombre") |
La gran ventaja de Office Scripts sobre VBA es que se puede ejecutar sin abrir Excel mediante Power Automate:
- Disparadores: Ejecutar el script a una hora fija, cuando llega un correo, cuando se crea un archivo, etc.
- Pasar parámetros: El flujo puede enviar datos al script (nombre, fecha, valores) como argumentos de la función main().
- Recibir resultados: El script puede devolver datos al flujo con
returnpara usarlos en pasos siguientes (por ejemplo, enviarlos en un correo). - Caso de uso típico: Cada mañana a las 7 a.m., Power Automate ejecuta un script que actualiza un informe en Excel y envía el resultado por correo.
💡 Para usar Office Scripts en Power Automate necesitas una licencia de Microsoft 365 para empresas o educación (Microsoft 365 Personal/Familiar no lo incluye).
Como corre en un entorno "sandboxed" (aislado), un Office Script NO puede hacer varias cosas que VBA sí hace directamente. Esto no es un defecto: es la razón por la que es más seguro. La solución real casi siempre es Power Automate:
| Lo que hacía VBA | Por qué Office Scripts no puede solo | Cómo se resuelve |
|---|---|---|
| Mostrar un cuadro emergente (MsgBox) | No hay ventanas de diálogo en el sandbox | console.log() en el panel de registro |
| Pedir un dato al usuario (InputBox) | Ídem | Parámetros extra en main() + panel de Excel o Power Automate |
| Exportar a PDF | Sin API de exportación | Acción "Convertir archivo" / "Exportar hoja de cálculo" de Power Automate |
| Abrir otros libros / recorrer una carpeta | Un script solo ve SU libro, nunca otros archivos | "Enumerar archivos" en Power Automate + llamar al script por cada uno |
| Enviar correo con Outlook (CreateObject) | Sin acceso COM a otros programas | return del script + acción "Enviar un correo electrónico" de Power Automate |
| Guardar una copia del archivo (SaveCopyAs) | Sin acceso al sistema de archivos | Historial de versiones de OneDrive, o "Copiar archivo" en Power Automate |
| Evento Workbook_Open | No hay eventos "al abrir el libro" nativos | Flujo de Power Automate disparado "cuando se modifica un archivo" |
💡 Verás cada uno de estos casos marcado con ⚠️ en el simulador de abajo, con el código exacto de cómo se resuelve.
💻 Simulador de Office Scripts
40 ejemplos, uno por cada macro VBA equivalente: del "Hola Mundo" a casos reales de oficina (consolidar hojas, duplicados, tabla dinámica, Power Automate...). Cada uno muestra primero qué celdas llenar para que funcione, y luego el código. Selecciona uno para verlo.
📚 Diccionario
Office Scripts: Scripts de automatización para Excel basados en TypeScript, disponibles en Microsoft 365 y Excel para la web.
TypeScript: Superset de JavaScript que agrega tipado estático. Es el lenguaje en el que se escriben los Office Scripts.
ExcelScript.Workbook: Objeto raíz que representa el libro de Excel completo. Es el parámetro de la función main().
ExcelScript.Worksheet: Objeto que representa una hoja del libro. Se obtiene con workbook.getActiveWorksheet() o getWorksheet("nombre").
ExcelScript.Range: Objeto que representa un rango de celdas. Se obtiene con sheet.getRange("A1:B10").
getValue() / getValues(): Leen el valor de una celda (getValue) o de un rango completo como matriz 2D (getValues).
setValue() / setValues(): Escriben un valor en una celda o una matriz 2D en un rango de una sola vez (más eficiente que un bucle).
getCell(fila, columna): Accede a una celda por posición numérica, igual que Cells() en VBA — pero empezando en 0, no en 1.
main(): La función de entrada obligatoria de todo Office Script. Excel la llama automáticamente al ejecutar el script.
console.log(): Imprime mensajes en el panel de registro del Editor de código. Es el reemplazo de MsgBox — sin ventana emergente.
Parámetros de script: Argumentos extra en main() además de workbook. Excel los pide en un panel al ejecutar a mano — es el reemplazo de InputBox.
try / catch: Bloque de manejo de errores de JavaScript. Reemplaza a On Error GoTo de VBA.
findOrNullObject(): Busca un valor sin lanzar error si no lo encuentra; se revisa con .isNullObject, en vez de comparar contra Nothing como en VBA.
Power Automate: Herramienta de Microsoft para crear flujos de trabajo automatizados que puede ejecutar Office Scripts sin abrir Excel — y hacer lo que el script solo no puede (enviar correos, exportar PDF, recorrer carpetas).
Sandboxed: Entorno aislado y seguro. Los Office Scripts no pueden acceder a archivos del sistema, otros programas ni recursos externos no autorizados.
Grabador de acciones: Herramienta que registra las acciones del usuario en Excel y las convierte automáticamente en código TypeScript.
getFormat(): Método que devuelve el objeto de formato de un rango, desde el cual se puede cambiar fuente, color de fondo, alineación, protección, etc.
getActiveWorksheet(): Devuelve la hoja que el usuario tiene activa en ese momento en el libro de Excel.
getWorksheets(): Devuelve un array con todas las hojas del libro. Permite iterar sobre ellas con un bucle for...of.
addWorksheet(): Agrega una nueva hoja al libro. Ejemplo: workbook.addWorksheet("Reporte").
getFunctions(): Da acceso a las fórmulas de hoja de cálculo (SUMAR.SI, CONTAR.SI, PROMEDIO...) desde el código. Equivale a WorksheetFunction en VBA.
getUsedRange(): Devuelve el rango realmente usado de una hoja. Equivale a detectar la última celda con End(xlUp)/End(xlToRight) en VBA.
ExcelScript.RangeCopyType: Enumeración usada en copyFrom() para elegir qué copiar (todo, solo valores, solo formatos...). Reemplaza PasteSpecial.
ExcelScript.Table: Objeto que representa una tabla estructurada. Se crea con workbook.addTable() y permite filtrar por columna con getFilter().
return (en main): Devuelve un valor al terminar el script. Es la forma en que Power Automate recibe datos de vuelta desde Excel.
🎬 Videos de Apoyo
Scripts para Office en Excel — nueva forma de automatizar
Office Scripts — ¡Aprende a usarlas! Diferencias con Macros
Automatiza Excel con Office Scripts y Power Automate
Cómo usar Office Scripts en Excel con Power Automate
🏋️ Ejercicios prácticos
A diferencia de VBA, un Office Script no necesita un archivo especial para practicar: se pega directo en el Editor de código (pestaña Automatizar) de cualquier libro. Estos 9 talleres son el espejo, adaptado a Office Scripts, de los talleres 8.1 a 8.9 de la app de Macros VBA — mismo número de talleres, mismo orden, con las diferencias reales entre los dos mundos (por ejemplo, Office Scripts no tiene UserForm ni necesita .xlsm).
Taller 8.1 — Qué es un Office Script y cómo activar la pestaña Automatizar
Qué hay que hacer:
- Mira el video completo antes de tocar nada.
- En Excel para la web abre este archivo y ve a la pestaña Automatizar. Si no aparece, pídele a tu administrador de Microsoft 365 que habilite los scripts.
- Pulsa "Nuevo script" para abrir el Editor de código.
- Escribe un script mínimo que solo haga
console.log("Hola Office Scripts")y ejecútalo con el botón Ejecutar. - Revisa el panel de registro debajo del botón Ejecutar: ahí aparece el mensaje, NO en una ventana emergente como el
MsgBoxde VBA. - Ahora usa "Grabar acciones": pon en negrita los encabezados de la hoja "Datos", detén la grabación y abre el código generado para leerlo.
Taller 8.2 — Grabadora de acciones con una base de datos real
Qué hay que hacer:
- Mira el video completo antes de empezar a grabar nada.
- En la hoja "Instrucciones" del archivo revisa los 6 pasos de orden y formato; aplícalos sobre la hoja "Resultado" mientras grabas con Automatizar > Grabar acciones.
- Detén la grabación y abre el código generado en el Editor.
- Compara tu código contra la "Tabla de equivalencias rápidas" del inicio de esta página: identifica
getRange(),setValue()ygetFormat(). - Modifica el script para aplicar además: fila de totales, formato de moneda, columna de descuento del 10%, formato condicional para AÑO mayor a 2018, bordes y una columna de índice.
- Borra el formato de la hoja (Inicio > Borrar > Borrar formatos) y vuelve a ejecutar tu script: debe repetir todo con un clic.
💡 Bono: compara la MISMA acción grabada en VBA y en Office Script
Excel puede grabar la misma acción como macro VBA y como Office Script al mismo tiempo — video: Excel ya graba Macros VBA y Scripts de TypeScript a la vez.
VBA grabado
Range("B2").Select
Selection.Value = "Total"
Selection.Font.Bold = TrueOffice Script grabado
let selectedSheet = workbook.getActiveWorksheet();
selectedSheet.getRange("B2").select();
selectedSheet.getRange("B2").setValue("Total");
selectedSheet.getRange("B2").getFormat()
.getFont().setBold(true);Taller 8.3 — Sistema de registros con validación y orden de datos
Qué hay que hacer (sin video: aplica lo aprendido en el simulador):
- Revisa en el simulador los ejemplos sobre el bucle
for, elifyrange.setValues()antes de empezar. - En la hoja "Formulario" del archivo define las celdas de entrada: Nombre, Fecha, Categoría, Valor.
- Escribe un Office Script que valide que ningún campo esté vacío antes de registrar el dato (usa
ify muestra el aviso conconsole.log, ya que no existeMsgBox). - Escribe la parte del script que agrega el registro a la primera fila vacía de la hoja "Tabla".
- Agrega la lógica que ordena automáticamente los registros por Fecha después de guardar (usa
getSort().apply()). - Prueba el script con al menos 5 registros distintos y confirma que quedan bien ordenados.
Taller 8.4 — Script para guardar información en una base de datos
Qué hay que hacer (sin video: aplica lo aprendido en el simulador):
- Apóyate en el ejemplo del simulador sobre
workbook.getWorksheet()ygetRange().getUsedRange(). - Identifica la hoja "Formulario" (donde se digitan los datos) y la hoja "Base de Datos" (donde deben quedar guardados los registros).
- Escribe el script que busca la primera fila vacía de "Base de Datos" (pista:
getUsedRange().getRowCount()). - Escribe la función que copia los datos del Formulario a esa fila vacía.
- Agrega la parte del script que limpia las celdas del Formulario después de guardar, lista para el siguiente registro.
- Prueba guardando al menos 5 registros seguidos y confirma que ninguno se sobrescribe.
Taller 8.5 — Sistema de inventario: entradas, salidas y control de stock
Qué hay que hacer:
- Mira el video completo (es conocimiento general de Excel; usa como referencia extra el ejemplo del simulador sobre bucles
forrecorriendo un rango). - Ya tienes las 3 tablas: "Inventario" (stock actual), "Entradas" y "Salidas" de mercancía.
- Escribe el script que registra una entrada y suma la cantidad al stock del producto correspondiente en "Inventario".
- Escribe el script que registra una salida, resta del stock y avisa con
console.logsi no hay suficiente cantidad disponible. - Agrega la parte que actualiza automáticamente la columna de stock en "Inventario" después de cada movimiento.
- Prueba con al menos 5 entradas y 5 salidas y verifica que el stock final sea correcto.
Taller 8.6 — Cómo debe quedar una base de datos relacional en Excel
Qué hay que hacer:
- Mira el video completo (es conocimiento general de bases de datos en Excel, aplica igual con macros VBA u Office Scripts).
- Compara la hoja "Base mal estructurada" contra "Base bien estructurada": un encabezado por columna, sin celdas combinadas, un dato por celda.
- En "Base bien estructurada" escribe un registro completo por fila (nada de datos repartidos en varias filas para un mismo registro).
- Convierte el rango en Tabla de Excel (Insertar > Tabla) para que crezca sola al agregar registros.
- Escribe un Office Script que recorra la tabla y valide con
console.logsi alguna fila tiene una celda vacía en las columnas obligatorias.
Taller 8.7 — Pedir datos al usuario: parámetros de un Office Script
Qué hay que hacer:
- Mira el video completo antes de empezar.
- Un Office Script NO puede abrir una ventana propia como un UserForm de VBA; en su lugar recibe datos por parámetros de la función
main(). - Escribe un script con la firma
function main(workbook: ExcelScript.Workbook, nombre: string, valor: number)que escriba esos 2 parámetros en la hoja "Datos". - Ejecútalo manualmente desde el Editor de código: al pulsar Ejecutar, Excel te pedirá llenar cada parámetro en un panel lateral — lo más parecido a un formulario que existe en Office Scripts.
- Prueba ejecutándolo 3 veces con datos distintos y revisa que cada fila quede bien guardada.
Taller 8.8 — Conectar tu script con Power Automate como si fuera un formulario
Qué hay que hacer:
- Mira el video completo antes de empezar.
- Este taller conecta el script del 8.7 con un flujo de Power Automate para que el "formulario" real lo ponga Power Automate (con Microsoft Forms o un correo), no Excel.
- Crea un flujo nuevo en Power Automate con el conector "Excel Online (Business)" y la acción "Ejecutar script".
- En "Ejecutar script" elige este libro y el script del Taller 8.7; llena los parámetros (nombre, valor) con los campos que vengan de un formulario de Microsoft Forms o de un correo.
- Prueba el flujo enviando el formulario y verifica que la fila aparezca en la hoja "Base de Datos" sin abrir Excel.
- Agrega una validación en el script: si el campo Nombre llega vacío, que no guarde el registro y lo registre con
console.logen su lugar.
Extra — Consolidado mensual con los datos de práctica del Taller 8.9
Qué hay que hacer (sin video: usa el Taller 8.9 descargable de abajo):
- Descarga el Taller 8.9 en la sección de abajo — trae la hoja "Datos_Práctica" con 10 productos.
- Escribe un Office Script que recorra la hoja y escriba "Caro" o "Económico" en una columna nueva según si el precio supera $6.000.
- Agrega otra columna que marque "Aprobado" o "Reprobado" según la nota del estudiante (ver el ejemplo #5 del simulador para la lógica del If).
- Al final, usa
workbook.getFunctions()para escribir el promedio de precios en una celda aparte (ver ejemplo #39). - Compara tu resultado contra la hoja "Soluciones" del taller descargado.
💡 Este ejercicio junta 4 conceptos ya vistos en el simulador (recorrer filas, condicional, formato y funciones de hoja) — es el más parecido a un caso real de oficina.
📥 Taller 8.9 — Descarga el Taller Final
Archivo Excel (.xlsx normal — un Office Script NO necesita formato especial como .xlsm) con instrucciones, 10 ejercicios, referencia rápida y datos de práctica. Mismos ejercicios que el taller de Macros VBA, adaptados a Office Scripts.
📝 Cuestionario de Evaluación
10 preguntas aleatorias del banco de 50. Calificación de 0 a 100.
Tu calificación: