Módulo 1: Google Sheets
Escribir Filas Nuevas (Append)
Descripción de la cápsula
Leer no cambia nada. Escribir sí. Y la operación de escritura más común — y más segura — es Append: agregar una fila nueva al final de la hoja sin tocar nada de lo que ya existe.
Append es la operación que usas cuando algo nuevo entra a tu negocio: un lead llenó un formulario, una venta se cerró, un ticket se abrió. Cada evento se convierte en una fila nueva. Es el "log" de tu negocio.
Pero Append tiene un peligro silencioso: no verifica nada. Si tu workflow recibe el mismo lead dos veces, Append crea dos filas. Llamas al workflow 10 veces de prueba, tienes 10 filas basura. Por eso esta cápsula no es solo "cómo agregar una fila" — es "cómo agregar una fila sin duplicar", aplicando el patrón "buscar antes de actuar" de la cápsula anterior.
Lo que vas a aprender
Al terminar esta cápsula serás capaz de:
- ✅ Usar la operación Append para agregar filas nuevas
- ✅ Mapear datos de un nodo anterior a las columnas de la hoja
- ✅ Agregar varias filas de una vez (uno por item)
- ✅ Evitar duplicados combinando lookup + IF + Append
- ✅ Entender por qué Append no valida nada y cuándo eso es un problema
- ✅ Decidir cuándo Append es la operación correcta y cuándo no
La operación Append
Configuración base del nodo Google Sheets:
- Operation:
Append Row(oAppend) - Document: tu hoja
- Sheet: la pestaña
- Columns: aquí mapeas qué dato va en qué columna
Cómo funciona el mapeo de columnas
n8n te muestra las columnas de tu hoja (las leyó de la fila 1). Para cada columna, defines qué valor escribir:
| Columna de la hoja | Valor a escribir |
|---|---|
name | {{ $json.name }} |
email | {{ $json.email }} |
city | {{ $json.city }} |
registration_date | {{ $now }} |
El valor puede ser:
- Una expression (
{{ $json.email }}) — toma el dato del nodo anterior - Texto fijo (
pending) — siempre escribe lo mismo - Una expression calculada (
{{ $now }}) — fecha actual, un cálculo, etc.
n8n tiene dos modos de mapeo: automático (si los nombres de campo del nodo anterior coinciden exactamente con los encabezados de la hoja, los conecta solos) y manual (tú defines cada uno). Empieza con el manual hasta que el mapeo te quede claro — lo profundizamos en la cápsula 06.
Agregar una fila: ejemplo completo
Workflow: un formulario manda datos por webhook, los registras en una hoja.
Webhook Trigger → Google Sheets (Append Row)
El webhook recibe:
{ "name": "Diana Soto", "email": "diana@example.com", "city": "Lima" }
El nodo Google Sheets, Append Row, mapea:
name→{{ $json.name }}email→{{ $json.email }}city→{{ $json.city }}status→new(texto fijo)registration_date→{{ $now }}
Resultado: una fila nueva al final de la hoja con esos 5 valores. Las filas anteriores no se tocan.
Agregar varias filas de una vez
Si el nodo anterior produce varios items, Append crea una fila por item automáticamente. No necesitas un loop.
Ejemplo: lees 5 productos de una API → conectas a Google Sheets Append → se agregan 5 filas. n8n procesa cada item y agrega su fila.
Esto conecta con G2: si vienes pensando que necesitas un nodo Loop para "repetir el Append", recuerda que los nodos de n8n ya iteran sobre items por defecto. Append sobre 5 items = 5 filas, sin loop explícito.
El problema: Append no valida nada
Esta es la parte importante de la cápsula.
Append hace exactamente una cosa: agrega una fila. No revisa si ese registro ya existe. No revisa si los datos son válidos. No revisa nada.
El escenario típico de duplicados
Webhook Trigger → Google Sheets (Append Row)
Funciona perfecto... hasta que:
- El usuario hace doble click en "Enviar" del formulario → 2 webhooks → 2 filas
- Pruebas el workflow 8 veces → 8 filas de prueba
- El servicio externo reintenta el webhook por un timeout → fila duplicada
Resultado: tu hoja de leads tiene a "Diana Soto" tres veces. El equipo de ventas la contacta tres veces. Mal.
La solución: buscar antes de hacer Append
Aplicamos el patrón de la cápsula 03. No hagas Append directo — primero busca si el registro ya existe:
Webhook Trigger
│
▼
Google Sheets (Get Row(s), filtro: email = {{ $json.email }})
│
▼
IF: ¿el lookup devolvió 0 items?
│
┌──────┴──────┐
▼ ▼
SÍ (no existe) NO (ya existe)
→ Append Row → no hacer nada (o Update — cápsula 05)
Cómo configurar el IF
La condición que detecta "no existe":
{{ $('Google Sheets').all().length === 0 }}
true→ el lookup no encontró nada → es seguro hacer Appendfalse→ ya existe → no dupliques
Reemplaza
'Google Sheets'con el nombre exacto de tu nodo de lookup. Si lo renombraste aLookup Lead, sería{{ $('Lookup Lead').all().length === 0 }}.
Con este patrón, el workflow es idempotente: el mismo lead puede llegar 100 veces y solo se crea una fila.
Cuándo Append directo SÍ está bien
No siempre necesitas el lookup. Append directo (sin verificar) es correcto cuando:
- Es un log de eventos: registras cada ejecución, cada clic, cada acción. Aquí las "repeticiones" son datos reales, no duplicados. Un log de "se envió email a las 9:03" no es un duplicado de "se envió email a las 9:05".
- El trigger garantiza unicidad: si el dato viene de una fuente que ya no repite (ej. un Schedule diario que corre una vez), no hay riesgo de duplicado.
- Estás en pruebas controladas: sabes que estás probando y limpiarás la hoja después.
La regla: ¿una fila repetida sería un error o un dato legítimo? Si sería un error → lookup primero. Si sería un dato legítimo → Append directo.
Trampas comunes
Trampa 1: Append directo en un workflow con webhook público
Qué pasa: Tu webhook está expuesto y cualquier reintento, doble submit o bot genera filas duplicadas.
Cómo evitar: Webhook + Append casi siempre necesita lookup primero. La excepción es si es explícitamente un log.
Trampa 2: Los nombres de campo no coinciden con los encabezados
Qué pasa: El nodo anterior produce emailAddress pero la columna de la hoja se llama email. El mapeo automático no las conecta y la columna email queda vacía.
Cómo evitar: Usa mapeo manual y asigna explícitamente email → {{ $json.emailAddress }}. O renombra los campos antes. Esto se cubre a fondo en la cápsula 06.
Trampa 3: Escribir en una hoja sin encabezados
Qué pasa: Tu hoja está vacía, sin fila 1 de encabezados. Append no sabe qué columna es qué y escribe mal o falla.
Cómo evitar: Siempre ten la fila 1 con encabezados antes de hacer Append. Aunque la hoja esté vacía de datos, los encabezados deben existir.
Trampa 4: Esperar que Append actualice una fila existente
Qué pasa: Quieres "actualizar el estado de Diana" y usas Append → se crea una fila nueva de Diana en vez de modificar la existente.
Cómo evitar: Append solo agrega, nunca modifica. Para modificar una fila existente, necesitas la operación Update (cápsula 05).
Trampa 5: La fecha se escribe como texto raro
Qué pasa: Mapeas date → {{ $now }} y en la hoja aparece algo como 2026-05-14T15:03:00.000-06:00 en vez de una fecha legible.
Cómo evitar: $now es un objeto de fecha completo. Para un formato limpio usa {{ $now.toFormat('yyyy-LL-dd') }} o {{ $now.toFormat('yyyy-LL-dd HH:mm') }}. El formateo de fechas se cubre más en la cápsula 07 y en G4.
Ejercicio: append seguro vs append peligroso
Objetivo: sentir la diferencia entre Append directo y Append con lookup.
Parte A: el problema
- Crea una hoja
Registroscon columnasname,email,date - Workflow: Manual Trigger → Set (name=Eva, email=eva@example.com) → Google Sheets (Append Row)
- Ejecútalo 4 veces seguidas
- Mira la hoja: tienes 4 filas idénticas de Eva. Ese es el problema.
Parte B: la solución
- Limpia la hoja (deja solo encabezados)
- Reconstruye el workflow con el patrón: Manual Trigger → Set → Google Sheets (Get Row(s), filtro email) → IF (length === 0) → Append Row (solo en la rama "true")
- Ejecútalo 4 veces seguidas
- Mira la hoja: una sola fila de Eva. Idempotente.
Ver la condición del IF
En el IF, modo expression:
{{ $('Google Sheets').all().length === 0 }}
(usa el nombre real de tu nodo de lookup). La rama true lleva al Append; la rama false no hace nada.
Resumen y siguiente paso
- Append agrega una fila nueva al final de la hoja, sin tocar lo existente — es la escritura más común
- El mapeo de columnas define qué valor (expression, texto fijo o cálculo) va en cada columna
- Append crea una fila por item — varios items, varias filas, sin loop
- Append no valida nada: el mismo dato dos veces = dos filas
- Para evitar duplicados: lookup → IF (length === 0) → Append — hace el workflow idempotente
- Append directo SÍ está bien cuando una fila repetida es un dato legítimo (logs) o el trigger garantiza unicidad
- 5 trampas: append en webhook público, nombres que no coinciden, hoja sin encabezados, esperar que Append modifique, fechas mal formateadas
Antes de avanzar deberías poder:
- Configurar un Append con mapeo de columnas
- Decidir si un caso necesita lookup previo o no
- Construir el patrón lookup → IF → Append
Lo que sigue (cápsula 05):
Append agrega; ahora aprendes a modificar lo que ya existe: la operación Update. Vas a ver cómo apuntar a la fila correcta, y conocerás Update or Append (upsert) — la operación que combina "buscar, y si existe actualizar, si no agregar" en un solo nodo.
Recursos adicionales
- n8n Google Sheets node Docs - Operación Append.
- n8n Set node Docs - Para preparar datos antes de escribir.
- n8n expressions: dates - Formateo de
$nowy fechas.
Creado: Mayo 14, 2026 Versión: 1.0