Automatización de Excel

Registro de desarrollo: lo que realmente rompe una hoja de cálculo de 120.000 filas

Una sesión de trabajo en una hoja de cálculo de 121.254 filas y 1,8 millones de celdas, y las cinco cosas separadas que tuvieron que cambiar antes de que un gran análisis entre tablas pudiera finalizar, verificar su resultado y devolver un informe formateado utilizable.

La mayoría de las funciones de las hojas de cálculo se prueban con datos que caben en una pantalla. Este registro cubre una sesión de trabajo en un libro de ventas con 121.254 filas en 15 columnas: aproximadamente 1,8 millones de celdas y una solicitud que parece normal: combine las tablas de productos, clientes, pedidos y ventas, luego marque los productos en declive, los riesgos de reabastecimiento y los clientes de bajo valor.

Nada en esa solicitud es exótico. De todos modos fracasó, varias veces, por razones que casi no tenían nada que ver con el análisis en sí. Lo que sigue es lo que realmente se rompió y lo que cambió.

Un límite de plataforma, no una consulta lenta

El primer fallo parecía un error en el sistema de trabajo duradero. La verdadera causa fue una regla en Google Apps Script: un complemento de editor no puede crear un disparador controlado por tiempo que se active más de una vez por hora.

El diseño del trabajo en segundo plano asumió un disparo de un minuto. Esa suposición se mantuvo durante el desarrollo, donde un script vinculado a un contenedor puede programarse libremente, y dejó de mantenerse en el momento en que el mismo código se ejecutó como un complemento instalado. La solicitud para instalar el activador no se degradó: se descartó, y se descargó antes, se creó el trabajo, por lo que el trabajo nunca comenzó.

Siguieron dos cambios. Instalar un disparador ahora es el mejor esfuerzo: intenta una cadencia de un minuto, vuelve a cada hora y, finalmente, no activa ningún disparador y nunca se activa. Y el primer paso de procesamiento ahora se ejecuta dentro de la misma ejecución que creó la tarea, en lugar de en una segunda llamada que tiene que buscar la tarea nuevamente.

Ese segundo detalle importó más de lo que parece. Las propiedades de Apps Script no son de lectura y escritura confiables entre ejecuciones, por lo que una tarea escrita momentos antes podría volver a aparecer como "tarea no encontrada" en la siguiente llamada.

Informar del progreso no es lo mismo que terminar

Cuando el trabajo finalmente comenzó, todavía no terminó. La herramienta ejecutó un paso y luego devolvió un estado que decía que el trabajo "continúa en segundo plano".

Esa frase era falsa. Sin un activador subhorario disponible, nada continúa en segundo plano. El asistente leyó el estado, transmitió un porcentaje al usuario y se detuvo, dejando un trabajo estacionado en 34.000 de 121.253 filas indefinidamente.

El tiempo de ejecución ahora impulsa el trabajo hasta su finalización, dentro de un presupuesto limitado, y cada llamada de estado posterior avanza el trabajo en lugar de simplemente leerlo. Si el presupuesto se agota, el texto de situación dice claramente que la tarea está inconclusa y que nada más la permitirá avanzar.

Vale la pena exponer directamente el principio: un informe de progreso no es un entregable. Un usuario solicitó una tabla, no un porcentaje.

Una solicitud solo puede ser atendida por herramientas que el modelo puede ver

Para mantener la selección de herramientas precisa, GetSheetAI divulga un subconjunto de sus herramientas por turno según la solicitud. Ese mecanismo se construyó alrededor del conjunto de herramientas Excel, y el complemento Google Sheets registra 22 herramientas que solo existen allí. Esas herramientas se estaban filtrando de cada solicitud.

El efecto fue específico y fácil de pasar por alto. Al solicitar un gráfico de barras se revelaron 6 de 44 herramientas, con la herramienta de gráfico entre las ocultas. Al solicitar ordenar un rango se revela 5 de 44, sin la herramienta de clasificación. El asistente no se negó: realmente no podía ver la herramienta que hacía el trabajo.

Sheets ahora tiene su propio mapeo de herramienta a paquete, que refleja cada contraparte Excel, y el filtro pasa por cualquier herramienta sobre la que no tiene opinión en lugar de descartarla. Ahora una prueba lee los nombres de las herramientas registradas directamente desde la fuente, por lo que agregar una herramienta sin clasificarla falla la compilación en lugar de hacerla silenciosamente inalcanzable.

La misma clase de laguna apareció en el fraseo. Una solicitud china que significa "crear una nueva hoja" no coincidía con ninguna regla, porque el patrón reconocía sólo una de las dos palabras comunes para una hoja. La herramienta de creación de hojas permaneció oculta y el asistente informó que era imposible crear una hoja de trabajo. No lo fue.

Los mensajes de error son parte del producto.

Varios fallos se redujeron a un mensaje que indicaba un problema sin indicar la salida.

Escribir en una hoja que no existe devolvió "El recurso solicitado no existe." Eso se lee como un complemento roto. Ahora dice que la hoja no existe, que la herramienta de escritura no crea hojas y que dos llamadas sí lo hacen.

Rechazar la clasificación a nivel de fila en un rango muy grande devolvió un simple rechazo. Etiquetar un resultado agregado funciona en cualquier tamaño, por lo que el mensaje ahora nombra esa ruta: primero grupo, luego aplica reglas de clasificación al resultado agrupado.

Una protección contra sobrescritura no devolvió nada más que blocked: true, que se lee como falla. Ahora explica que el objetivo ya contiene datos y cómo proceder.

Ninguno de estos es cosmético. En cada caso, el mensaje anterior finalizó una tarea que aún se podía completar.

Las expresiones deterministas necesitaban más aritmética

Para derivar un año-mes como 201707 a partir de una clave de fecha entera como 20170702 se requiere floor(x / 100) o un módulo. Ninguno de los dos existió. Dos intentos fallaron y se abandonó la columna derivada.

La capa de expresión ahora incluye floor, round, abs y mod, y el error de función no admitida enumera el conjunto completo y proporciona esa expresión exacta, en lugar de solo nombrar lo que se rechazó.

Dónde está

En el mismo libro de trabajo, la ruta duradera ahora se completa: las 121,253 filas procesadas, agrupadas, escritas y formateadas, con cada fragmento de resultado verificado. En Excel, la misma solicitud produjo una clasificación de los 397 productos (132 sin ventas recientes, 101 marcados por riesgo de reabastecimiento, 99 en descenso, 65 normales) calculada con SUMIFS nativo en comparación con la tabla de origen en lugar de mover los datos a cualquier lugar.

Los valores operativos que vale la pena conocer:

  • umbral de enrutamiento duradero: más de 100.000 celdas;
  • fragmentación de fuente: lecturas limitadas, verificadas por fragmento en reescritura;
  • cobertura de regresión: 826 pruebas en todo el tiempo de ejecución compartido;
  • ejecución en segundo plano en los complementos de Google Sheets: cada hora en el mejor de los casos, por lo que la barra lateral genera trabajos largos mientras está abierta.

Ese último punto es un límite real más que temporal. Un complemento instalado no puede programar el trabajo con más frecuencia, por lo que un trabajo grande avanza mientras la barra lateral está abierta. Los puntos de control duraderos significan que al cerrarlo no se pierde ningún trabajo completado, pero la descripción honesta es que el trabajo es impulsado, no programado.

La lección más amplia de esta sesión no fue sobre la escala. Cada una de estas fallas se debió a que el sistema sabía algo que el usuario no podía ver: una regla de la plataforma, una herramienta oculta, una ruta admitida que no se menciona en ninguna parte del error. El tamaño era lo que los hacía visibles a todos a la vez.