Análisis de datos

ARRAY_CONSTRAIN + ARRAYFORMULA en Google Sheets

ModelMonkey11 de julio de 20268 min de lectura

Sintaxis: =ARRAY_CONSTRAIN(array_o_rango, num_filas, num_cols)

Eso es toda la función. El poder viene de lo que pones adentro.

Por qué el output sin límite de ARRAYFORMULA es un riesgo en tu modelo

ARRAYFORMULA devuelve tantas filas como tenga la fuente de datos. Cuando esa fuente es una pestaña de transacciones brutas con 4,200 filas este trimestre y 3,800 el anterior, el tamaño del output fluctúa. Cualquier fórmula más abajo que referencie un rango fijo, digamos =SUM(Resumen!B2:B9) o un rango con nombre anclado a 8 filas, se rompe en el momento en que tu array se desborda más allá del límite esperado.

En un modelo de tres estados financieros, esto importa. Tu pestaña de FCFF referencia el bloque de gastos operativos de la pestaña de P&L. Si ese bloque es un ARRAYFORMULA que crece sin restricción cada vez que se actualiza la fuente, tu estado de flujo de caja cuadra un mes y silenciosamente deja de cuadrar el siguiente.

ARRAY_CONSTRAIN es el guardarriel. Envuelve el array con ella y el output se mantiene exactamente del tamaño que especificaste, sin importar lo que haga la data subyacente.

Uso básico: limitar un resultado de FILTER

Supón que estás armando el resumen ejecutivo para la junta directiva y necesitas mostrar los 5 centros de costo con mayor gasto en Q2 2026, extraídos de una pestaña de P&L en bruto:

=ARRAY_CONSTRAIN(
  SORT(
    FILTER('P&L'!B:D, 'P&L'!A:A="Q2 2026"),
    3, FALSE
  ),
  5, 3
)

Esto filtra las filas de Q2, las ordena de mayor a menor por la tercera columna (gasto), y pasa el resultado a ARRAY_CONSTRAIN, que devuelve exactamente 5 filas y 3 columnas. Si Q2 tiene 47 centros de costo, obtienes 5. Si por alguna razón tiene 3 (una escisión a mitad de año, lo que sea), obtienes 3. ARRAY_CONSTRAIN nunca rellena con ceros ni arroja un error cuando la fuente es más pequeña que el límite especificado. Simplemente devuelve lo que hay.

Ese último comportamiento vale la pena conocer. INDEX con un número de fila fuera de rango devuelve #REF!. ARRAY_CONSTRAIN con num_filas mayor que el array simplemente devuelve el array completo, lo que la hace más segura para inputs dinámicos.

Combinación con ARRAYFORMULA para columnas calculadas

El patrón más común en modelos financieros es usar ARRAYFORMULA para derivar una columna calculada y luego restringirla a las filas exactas que tu modelo espera.

Aquí hay un cálculo de margen de contribución por SKU, limitado a 12 filas para un bloque de resumen fijo:

=ARRAY_CONSTRAIN(
  ARRAYFORMULA(
    SUMIFS('Ingresos'!D:D, 'Ingresos'!B:B, 'Maestro SKU'!A2:A, 'Ingresos'!C:C, Supuestos!$B$3)
    - SUMIFS('COGS'!D:D, 'COGS'!B:B, 'Maestro SKU'!A2:A, 'COGS'!C:C, Supuestos!$B$3)
  ),
  12, 1
)

Esto calcula el margen de contribución por SKU para el período definido en Supuestos!$B$3 (por ejemplo, "Q2 2026") y restringe el output a 12 filas. Si el Maestro de SKUs tiene 18 SKUs activos, igual obtienes 12, que coincide con el bloque de 12 filas al que hace referencia la pestaña de Análisis de Retornos. Los otros 6 SKUs existen en la fuente pero no tocan el bloque del modelo.

Sin ARRAY_CONSTRAIN, agregar 2 SKUs nuevos al Maestro a mitad de trimestre empujaría el output del array a la fila 14, directamente sobre lo que sea que esté ahí.

La pregunta de rendimiento

ARRAY_CONSTRAIN en sí es computacionalmente barata: es un recorte posterior sobre un array que ya fue evaluado, no un paso de cálculo adicional. Según la referencia oficial de funciones de Google Workspace (sección "Google Sheets function list", actualizada en julio de 2026 en support.google.com/docs), ARRAY_CONSTRAIN está clasificada como función no volátil, lo que significa que no recalcula en cada cambio de la hoja como sí lo hacen NOW() u OFFSET(). La parte costosa es lo que pones adentro.

Dicho esto, envolver un ARRAYFORMULA grande que llama a SUMIFS sobre 50,000 filas en ARRAY_CONSTRAIN no hace el SUMIFS más rápido. Solo limita cuánto del resultado se renderiza. Si el tiempo de recálculo es tu cuello de botella, la solución está en la fórmula interna, no en la restricción.

Para flujos de trabajo típicos de FP&A, entre 5,000 y 15,000 filas de transacciones y de 8 a 15 pestañas vinculadas, la combinación corre en menos de 3 segundos en recálculo. Modelos que superan las 200,000 filas comienzan a mostrar tiempos de recálculo de 8 a 12 segundos independientemente de si ARRAY_CONSTRAIN está involucrada.

ARRAY_CONSTRAIN vs. INDEX para recortar arrays

Ambas pueden limitar las filas de un array. La diferencia está en el comportamiento en el límite.

EscenarioARRAY_CONSTRAININDEX
La fuente tiene más filas que el límiteDevuelve las primeras N filasDevuelve las primeras N filas
La fuente tiene menos filas que el límiteDevuelve todas las filas (sin error)Devuelve #REF!
La fuente está vacíaDevuelve vacíoDevuelve #REF!
Complejidad de sintaxisMenorMayor

Para fuentes dinámicas donde el conteo de filas puede caer por debajo del límite esperado, como modelos de runway donde los supuestos de headcount cambian o catálogos de SKUs donde productos se dan de baja, ARRAY_CONSTRAIN es más segura. INDEX es mejor cuando específicamente necesitas verificar que deben existir N filas, porque un #REF! va a exponer el hueco en los datos en lugar de ocultarlo silenciosamente.

Equivalente en Excel

ARRAY_CONSTRAIN no existe en Excel. El equivalente introducido con los arrays dinámicos de Microsoft 365 (disponible desde la versión 2206 del canal mensual empresarial, documentado en support.microsoft.com bajo "TAKE function") es TAKE():

=TAKE(SORT(FILTER(Ingresos[Monto], Ingresos[Período]="Q2 2026"), 1, -1), 5)

TAKE acepta valores negativos para extraer desde el final de un array, algo que ARRAY_CONSTRAIN no puede hacer sin preprocesamiento con SORT. Si tu modelo vive tanto en Sheets como en Excel, este es uno de los casos límite más importantes para documentar: las funciones son similares pero no intercambiables, y la versión de Sheets antecede a la de Excel por varios años.

Dónde aparece esto en la práctica

Los casos de mayor valor que he visto:

Resúmenes para la junta directiva. Un bloque fijo de 10 filas de "Top Clientes por Ingreso" que siempre se mantiene en 10 filas aunque los datos del CRM tengan 340 clientes. El bloque es referenciado por la plantilla de la presentación y no puede cambiar de tamaño.

Tablas de sensibilidad. Un ARRAYFORMULA que calcula la TIR (IRR) en 8 escenarios de apalancamiento, restringido a 8x1. Las etiquetas de escenario están fijas en la columna A; el bloque de fórmulas debe coincidir exactamente.

Vistas de períodos acumulados. Un flujo de caja de 13 semanas que siempre muestra exactamente 13 columnas sin importar cuántas semanas de cifras reales existen en la pestaña de origen.

En cada caso, ARRAY_CONSTRAIN hace exactamente una sola cosa: lograr que una fórmula dinámica produzca un output de tamaño predecible. Esa predictibilidad es lo que permite que el resto del modelo la referencie de forma segura. Si mantienes modelos de reporte donde la lógica de restricción cambia cada trimestre (distintos cortes de top-N, diferentes filtros de período), ModelMonkey puede reescribir los argumentos internos de FILTER y SORT directamente desde Google Sheets sin tocar el wrapper de ARRAY_CONSTRAIN, lo que es más rápido que editar fórmulas anidadas a mano.

Preguntas frecuentes sobre ARRAY_CONSTRAIN y ARRAYFORMULA

¿ARRAY_CONSTRAIN funciona sin ARRAYFORMULA? Sí. Puedes pasarle cualquier rango o array, incluyendo resultados de FILTER, SORT, UNIQUE o un rango simple como A1:D100. ARRAYFORMULA es solo uno de los posibles inputs.

¿Qué pasa si num_filas o num_cols es mayor que el array de entrada? ARRAY_CONSTRAIN devuelve el array completo sin error. A diferencia de INDEX, no genera #REF! cuando el límite supera el tamaño real de la fuente.

¿Puedo usar ARRAY_CONSTRAIN para limitar columnas solamente, sin tocar las filas? Sí. Establece num_filas en un número mayor o igual al total de filas del array (o usa ROWS(tu_array) como argumento) y define solo el límite de columnas que necesitas.

¿ARRAY_CONSTRAIN es compatible con las funciones de IA de Google Sheets como AI_SUMMARIZE o GEMINI? En principio sí, siempre que esas funciones devuelvan un array. En la práctica, las funciones de IA de Sheets suelen retornar un valor por celda, por lo que el caso de uso más común sigue siendo con ARRAYFORMULA, FILTER, SORT y SUMIFS.

¿Por qué mi ARRAY_CONSTRAIN devuelve celdas vacías al final del rango? Eso ocurre cuando la fuente tiene menos filas que el límite especificado, pero la fórmula interna (por ejemplo, un ARRAYFORMULA con SUMIFS) rellena el resto con ceros o cadenas vacías. El problema está en el array interno, no en ARRAY_CONSTRAIN. Agrega una condición IF dentro del ARRAYFORMULA para suprimir los valores vacíos antes de restringir.