Dashboard
Conectando...
Tracker de Guiones — sincronización automática cada 30 segundos.
Guión
0
pendientes
Grabación
0
en progreso
Edición
0
en progreso
Aprob. Final
0
en revisión
Publicados
0
completados
Actividad reciente
Cargando...
#Nombre del ReelGuiónPipelineEstadoF. Publicación
Conectando...
Todos los guiones
#Nombre del ReelTema / GanchoGuión CompletoPipelineEstadoF. Publicación
📊 Conexión — Tracker de Guiones

Cabeceras en fila 3, datos desde fila 4. 1 fila = 1 guión.

URL CSV del Sheet
Intervalo sync (seg)
🔍 Debug — Columnas detectadas

Después de sincronizar, aquí verás qué columnas detectó el sistema.

Esperando sincronización...
✍️ Escritura bidireccional — Apps Script

Para que aprobaciones, notas y links se guarden en el Sheet.

1
Abre tu Sheet → Extensiones → Apps Script
2
Pega este código:
const SHEET_ID = 'PON_AQUI_EL_ID_DE_TU_SHEET'; const TAB = 'Hoja1'; // ← Nombre exacto de tu pestaña function doPost(e) { try { const raw = e.postData ? e.postData.contents : ''; const d = JSON.parse(raw); return process(d); } catch(err) { return out({error: err.message}); } } function doGet(e) { try { if (e.parameter && e.parameter.data) { const d = JSON.parse(decodeURIComponent(e.parameter.data)); return process(d); } return out({status: 'ContentFlow API activa'}); } catch(err) { return out({error: err.message}); } } function process(d) { const sh = SpreadsheetApp.openById(SHEET_ID).getSheetByName(TAB) || SpreadsheetApp.openById(SHEET_ID).getSheets()[0]; let hdrRow = 1; for (let r = 1; r <= 5; r++) { const vals = sh.getRange(r, 1, 1, sh.getLastColumn()).getValues()[0]; if (vals.filter(v => String(v).trim()).length > sh.getLastColumn() * 0.3) { hdrRow = r; break; } } const hdr = sh.getRange(hdrRow, 1, 1, sh.getLastColumn()).getValues()[0] .map(h => norm(String(h))); const row = parseInt(d.row); if (!row || row <= hdrRow) throw new Error('fila invalida: ' + row); for (const [col, val] of Object.entries(d.updates || {})) { const nc = norm(col); let ci = hdr.findIndex(h => h === nc); if (ci < 0) ci = hdr.findIndex(h => h.includes(nc) || nc.includes(h)); if (ci >= 0) sh.getRange(row, ci + 1).setValue(val); } SpreadsheetApp.flush(); return out({ok: true, row: row}); } function norm(s) { return s.toLowerCase().normalize('NFD') .replace(/[\u0300-\u036f]/g,'') .replace(/[^a-z0-9\s]/g,' ') .replace(/\s+/g,' ').trim(); } function out(d) { return ContentService.createTextOutput(JSON.stringify(d)) .setMimeType(ContentService.MimeType.JSON); }
3
Implementar → Aplicación web → Acceso: Cualquier persona
4
Pega la URL aquí:
URL Apps Script
GUIÓN #—
OK