M
Power Users · Avanzado

NotebookLM
con archivos gigantes

Arquitectura de Espejo Automatizado con Google Apps Script para procesar Big Data sin límites

🔗 notebooklm.google.com ↗ Google Acceso gratuito disponible
500KLímite palabras NLM
3Capas arquitectura
1hSync automático
0Intervención manual
En esta lección: El problema La arquitectura El script Paso a paso Variantes avanzadas Casos por sector
⚠️
El obstáculo
¿Por qué NotebookLM falla con archivos grandes?

NotebookLM tiene un límite de procesamiento: archivos con más de 500,000 palabras o Sheets con demasiadas filas simplemente no cargan, se bloquean o producen análisis incompletos.

Esto es un problema real para empresas con reportes de millones de transacciones, inventarios de miles de productos, logs de sistemas, o bases de datos de clientes. Y para autores con archivos de investigación masivos — notas de años, bibliografías enormes, transcripciones de entrevistas.

La solución incorrecta es intentar subir el archivo completo y esperar que funcione. La solución correcta es no subir el archivo grande nunca.

🚫
Error común: Dividir el archivo en partes y subirlas por separado. NotebookLM analizará cada parte de forma aislada y perderás las relaciones cruzadas entre datos. No es la solución — es otro problema.
Herramienta de Diagnóstico

Calculadora de Carga para NotebookLM

PALABRAS ESTIMADAS 0
CAPACIDAD UTILIZADA (MAX 500K)
0%
LISTO PARA PROCESAR
🏗️
La solución
Arquitectura de Espejo Automatizado

La solución es crear un sistema de tres capas donde NotebookLM nunca ve el archivo grande. Solo ve un archivo pequeño, limpio y actualizado automáticamente que contiene exactamente lo que necesita para responder bien.

1
Capa de Datos — Tu archivo original
Google Sheets · Excel · Base de datos
El archivo gigante con millones de filas. Ventas, inventario, logs, transacciones. NotebookLM nunca lo toca. Tú lo sigues usando exactamente igual que antes.
↓ Google Apps Script filtra, resume y sincroniza ↓
2
Capa de Procesamiento — El script automático
Google Apps Script · Trigger cada hora
Un script que se ejecuta solo, extrae las filas más recientes o los datos más relevantes, los resume estadísticamente y los escribe en un archivo pequeño. Sin intervención manual.
↓ Solo el resumen llega a NotebookLM ↓
3
Capa de Inteligencia — NotebookLM
Google Sheets pequeño · Siempre actualizado
NotebookLM conectado al archivo de contexto limpio. Analiza, responde preguntas, genera podcasts y mapas mentales. Como un analista senior que solo lee el resumen ejecutivo, no los detalles de cada transacción.
💡
La analogía correcta: No le das a tu gerente 50,000 facturas para que las lea. Le das un resumen de ventas por categoría y región. El script hace exactamente eso — convierte a NotebookLM en un analista de negocios, no en un lector de filas.

Pipeline de Datos XAI

📊
BIG DATA (ORIGEN)
📜
APPS SCRIPT (FILTRO)
🧠
NOTEBOOKLM (IA)

Como un ingeniero, no buscamos que la IA lea más, sino que lea mejor. Filtramos el ruido para potenciar la señal.

⚙️
El código
El script de sincronización automática

Este script va en tu archivo grande (Google Sheets) y se ejecuta automáticamente cada hora. Lee las hojas que tú definas, extrae las últimas 500 filas de cada una, y las escribe en el archivo pequeño que NotebookLM tiene conectado.

JavaScript — Google Apps Script sincronizador_notebooklm.gs
// ═══════════════════════════════════════════════════════════
// SINCRONIZADOR PARA NOTEBOOKLM — por Yoniliman Galvis
// Arquitectura de Espejo Automatizado
// ═══════════════════════════════════════════════════════════

// ── CONFIGURACIÓN (solo edita esta sección) ──────────────
var CONFIG = {
  // ID del Google Sheet PEQUEÑO donde NotebookLM se conecta
  // Lo encuentras en la URL: docs.google.com/spreadsheets/d/ESTE_ID/edit
  idDestino: "PEGA_AQUI_EL_ID_DEL_ARCHIVO_PEQUEÑO",

  // Hojas del archivo GRANDE que quieres sincronizar
  hojasAProcesar: ["Ventas", "Inventario", "Logs"],

  // Máximo de filas recientes por hoja (500 es seguro para NotebookLM)
  maxFilasPorHoja: 500,

  // ¿Incluir resumen estadístico? (recomendado para datos numéricos)
  incluirResumen: true
};
// ─────────────────────────────────────────────────────────

function sincronizarParaNotebookLM() {
  var ssOrigen  = SpreadsheetApp.getActiveSpreadsheet();
  var ssDestino = SpreadsheetApp.openById(CONFIG.idDestino);
  var hojaDestino = ssDestino.getSheets()[0];
  var datosFinales = [];
  var fechaSync = new Date().toLocaleString("es-CO");

  // Encabezado con metadata de sincronización
  datosFinales.push([
    "=== CONTEXTO PARA NOTEBOOKLM ===",
    "Sincronizado: " + fechaSync,
    "Archivo: " + ssOrigen.getName()
  ]);

  CONFIG.hojasAProcesar.forEach(function(nombreHoja) {
    var hoja = ssOrigen.getSheetByName(nombreHoja);
    if (!hoja) {
      console.log("Hoja no encontrada: " + nombreHoja);
      return;
    }

    var ultimaFila  = hoja.getLastRow();
    var ultimaCol   = hoja.getLastColumn();
    if (ultimaFila < 2) return; // Hoja vacía

    var numFilas = Math.min(ultimaFila - 1, CONFIG.maxFilasPorHoja);
    var filaInicio = ultimaFila - numFilas + 1;

    // Encabezados de la hoja
    var encabezados = hoja.getRange(1, 1, 1, ultimaCol).getValues()[0];

    // Datos recientes
    var datos = hoja.getRange(filaInicio, 1, numFilas, ultimaCol).getValues();

    // Separador de sección
    datosFinales.push(["--- HOJA: " + nombreHoja + " | Filas: " + numFilas + " de " + (ultimaFila - 1) + " ---"]);
    datosFinales.push(encabezados);
    datosFinales = datosFinales.concat(datos);

    // Resumen estadístico (suma y promedio de columnas numéricas)
    if (CONFIG.incluirResumen) {
      var resumen = ["RESUMEN " + nombreHoja + ":"];
      encabezados.forEach(function(col, i) {
        var vals = datos.map(function(r) {
          return parseFloat(r[i]);
        }).filter(function(v) { return !isNaN(v); });
        if (vals.length > 0) {
          var suma = vals.reduce(function(a, b) { return a + b; }, 0);
          var prom = (suma / vals.length).toFixed(2);
          resumen.push(col + ": suma=" + suma.toFixed(2) + " | promedio=" + prom);
        }
      });
      datosFinales.push(resumen);
    }
  });

  // Escritura segura (evita error si datosFinales está vacío)
  hojaDestino.clear();
  if (datosFinales.length > 0 && datosFinales[0].length > 0) {
    var maxCols = datosFinales.reduce(function(max, row) {
      return Math.max(max, row.length);
    }, 0);
    // Normaliza todas las filas al mismo ancho
    var datosNorm = datosFinales.map(function(row) {
      while (row.length < maxCols) row.push("");
      return row;
    });
    hojaDestino.getRange(1, 1, datosNorm.length, maxCols).setValues(datosNorm);
  }

  console.log("✓ Sincronización completada: " + fechaSync);
}

// ── CREAR EL DISPARADOR AUTOMÁTICO ────────────────────────
// Ejecuta esta función UNA SOLA VEZ desde el menú Run
// Después el trigger se activa solo cada hora
function crearTriggerHorario() {
  // Elimina triggers existentes para evitar duplicados
  ScriptApp.getProjectTriggers().forEach(function(t) {
    ScriptApp.deleteTrigger(t);
  });
  // Crea el nuevo trigger
  ScriptApp.newTrigger('sincronizarParaNotebookLM')
    .timeBased()
    .everyHours(1)
    .create();
  console.log("✓ Trigger creado: sincronización cada hora");
}

// ── VARIANTE: RESUMEN ESTADÍSTICO PURO ────────────────────
// Úsala cuando los datos son demasiados incluso filtrados
// Envía solo totales y promedios — ideal para gerencia
function sincronizarSoloResumen() {
  var ssOrigen  = SpreadsheetApp.getActiveSpreadsheet();
  var ssDestino = SpreadsheetApp.openById(CONFIG.idDestino);
  var hojaDestino = ssDestino.getSheets()[0];
  var datosFinales = [["Hoja", "Métrica", "Valor", "Período"]];
  var fecha = new Date().toLocaleDateString("es-CO");

  CONFIG.hojasAProcesar.forEach(function(nombreHoja) {
    var hoja = ssOrigen.getSheetByName(nombreHoja);
    if (!hoja) return;
    var datos = hoja.getDataRange().getValues();
    var encabezados = datos[0];
    encabezados.forEach(function(col, i) {
      var vals = datos.slice(1).map(function(r) {
        return parseFloat(r[i]);
      }).filter(function(v) { return !isNaN(v); });
      if (vals.length > 0) {
        var suma = vals.reduce(function(a, b) { return a + b; }, 0);
        datosFinales.push([nombreHoja, col + " (suma)", suma.toFixed(2), fecha]);
        datosFinales.push([nombreHoja, col + " (promedio)", (suma/vals.length).toFixed(2), fecha]);
        datosFinales.push([nombreHoja, col + " (registros)", vals.length, fecha]);
      }
    });
  });

  hojaDestino.clear();
  if (datosFinales.length > 1) {
    hojaDestino.getRange(1, 1, datosFinales.length, 4).setValues(datosFinales);
  }
  console.log("✓ Resumen estadístico sincronizado");
}
📋
Implementación
Configuración paso a paso
1
Crea el archivo pequeño de contexto
Ve a Google Drive y crea un nuevo Google Sheet. Nómbralo NotebookLM_Sync_[NombreDetuProyecto]. Copia su ID de la URL.
URL: docs.google.com/spreadsheets/d/ → ESTE_ES_EL_ID → /edit
💡 Mantén este archivo solo para NotebookLM — no lo uses para otra cosa
2
Abre Apps Script en tu archivo grande
En tu archivo gigante ve a Extensiones → Apps Script. Se abre el editor. Borra el código que hay por defecto.
💡 El script vive en el archivo grande, no en el pequeño
3
Pega el script y configura
Copia el código de arriba, pégalo en Apps Script. Edita solo la sección CONFIG: pega el ID del archivo pequeño y los nombres exactos de tus hojas.
idDestino: "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms" // ejemplo
4
Ejecuta una vez manualmente para probar
Selecciona la función sincronizarParaNotebookLM en el menú desplegable y haz clic en el botón ▶ Run. Acepta los permisos que pide Google. Verifica que el archivo pequeño se llenó correctamente.
💡 Si hay error de permisos, haz clic en "Revisar permisos" y acepta
5
Activa el trigger automático
Selecciona la función crearTriggerHorario y ejecútala una sola vez. Desde ese momento el script se ejecutará solo cada hora sin que hagas nada.
💡 Verifica en Triggers (ícono del reloj) que aparezca el trigger creado
6
Conecta el archivo pequeño a NotebookLM
En NotebookLM → Add sources → Google Drive → selecciona el archivo NotebookLM_Sync_[...]. Desde ahora NotebookLM siempre tendrá los datos más recientes sin que hagas nada más.
💡 Cada vez que hagas preguntas en NotebookLM, los datos estarán actualizados de la última hora
⚠️
Importante sobre permisos: Google Apps Script necesita autorización para acceder a tus archivos. Cuando ejecutes el script por primera vez, Google mostrará una pantalla de permisos. Haz clic en "Configuración avanzada" → "Ir a [nombre del script]" → "Permitir". Es seguro — el script solo accede a tus propios archivos.
🔧
Estrategias avanzadas
¿Qué variante usar según tu caso?
Tu situaciónFunción a usarResultado en NotebookLM¿Cuándo?
Archivo con miles de filas, necesitas ver datos recientes sincronizarParaNotebookLM() Últimas 500 filas de cada hoja + encabezados Operativo diario
Datos demasiado grandes incluso filtrados sincronizarSoloResumen() Solo sumas, promedios y conteos por columna Gerencia / KPIs
Datos que cambian poco (contratos, políticas) Trigger semanal en vez de horario Actualización cada 7 días Documentos
Necesitas análisis por período (mes, trimestre) Modificar el script para filtrar por fecha Solo filas del período seleccionado Reportes periódicos
Múltiples archivos grandes como fuente Un script por archivo, todos apuntan al mismo destino Un solo archivo de contexto con todo consolidado Multifuente
Datos en tiempo real (cada minuto) Apps Script no puede — usar Zapier o Make.com Actualización casi en tiempo real Tiempo real
🎯
Estrategia recomendada para empresas: Usa sincronizarSoloResumen() para el análisis gerencial (KPIs, tendencias, decisiones estratégicas) y sincronizarParaNotebookLM() para el equipo operativo que necesita ver casos específicos recientes. Crea dos notebooks separados en NotebookLM — uno por función.
🏢
Casos reales
Cómo lo aplica cada sector
📈
Ventas — Análisis de pipeline
Empresas
Archivo grande: CRM con 50,000 oportunidades históricas. El script sincroniza las últimas 500 (las activas del trimestre) + el resumen de tasas de cierre por vendedor y por producto. NotebookLM puede responder: "¿Quién tiene el mejor ratio de cierre en clientes enterprise este trimestre?"
Analiza el pipeline actual y dime qué oportunidades tienen mayor probabilidad de cerrarse este mes según el patrón histórico de las oportunidades similares
🚛
Logística — Control de despachos
Empresas
Archivo grande: log de 2 millones de despachos de los últimos 3 años. El script sincroniza los últimos 500 despachos + resumen de tiempos promedio por ruta y por transportador. NotebookLM identifica qué rutas tienen demoras sistemáticas y en qué días de la semana.
¿Qué transportadores tienen consistentemente los peores tiempos de entrega y en qué rutas? ¿Hay un patrón por día de semana?
⚙️
Producción — Mantenimiento predictivo
Empresas
Archivo grande: logs de sensores de 12 máquinas durante 2 años. El script sincroniza las últimas lecturas anómalas + resumen de frecuencia de fallas por máquina y por turno. NotebookLM detecta patrones que preceden a las fallas para mantenimiento preventivo.
Basándote en el historial de fallas, ¿qué máquina tiene mayor probabilidad de fallar en las próximas 2 semanas y cuál es la señal de alerta temprana?
✍️
Autores — Archivo de investigación masivo
Autores
Archivo grande: 5 años de notas de investigación para la cuatrilogía φ — miles de entradas, citas, ideas, referencias. El script sincroniza las notas más recientes por categoría (personajes, filosofía, worldbuilding, referencias). NotebookLM puede responder preguntas de coherencia entre cualquier concepto.
¿Hay contradicciones entre la filosofía de la noesis que desarrollo en las notas del año 1 y cómo la implemento en los borradores recientes del capítulo 7?
φ

Metodología validada por Yoniliman Galvis

Ingeniero Industrial e Investigador de IA Explicativa (XAI). Este flujo ha sido optimizado para potenciar la toma de decisiones basada en hechos verificables y datos reales de tu propia industria.