{
  "name": "Formulario de la web a hoja de cálculo y aviso (plantilla de Cauce)",
  "nodes": [
    {
      "parameters": {
        "content": "## Formulario de la web a hoja de cálculo y aviso\nCada vez que alguien rellena el formulario de tu web, el contacto se guarda en una hoja de Google y te llega un correo al momento. Descarta el spam más común.\n\n**Antes de activarla:**\n1. Crea una hoja de Google llamada **Contactos** con estas columnas: Fecha · Nombre · Email · Teléfono · Mensaje · Página.\n2. En **Guardar en la hoja**, conecta tu cuenta de Google y pega la URL de la hoja.\n3. En **Avisar por correo**, conecta tu correo (SMTP), el remitente y a quién llega.\n4. Activa el flujo y copia la **URL de producción** del nodo **Formulario de la web**: es la dirección a la que tu formulario envía los datos (POST con los campos nombre, email, telefono, mensaje y el campo oculto web).\n\nTienes un ejemplo de formulario en la página de la plantilla.\n\nPlantilla gratuita de Cauce · cauceautomation.es/automatizacion-de-procesos/plantillas-n8n",
        "height": 480,
        "width": 560,
        "color": 4
      },
      "id": "aa849c49-fd9f-5d39-89bc-9537f75a078a",
      "name": "Cómo usar esta plantilla",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -80,
        -440
      ]
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "formulario-web",
        "options": {}
      },
      "id": "7fa8276b-33be-57ec-9a5d-baf0d16aef2b",
      "name": "Formulario de la web",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        0,
        100
      ],
      "webhookId": "05d9ef0b-f6b5-56c4-af78-f07f1798df8e"
    },
    {
      "parameters": {
        "jsCode": "// Recibe el formulario de tu web, descarta el spam y deja los datos limpios para la hoja y el aviso.\nconst limpio = (v, max) => String(v ?? '').replace(/\\s+/g, ' ').trim().slice(0, max);\nconst salida = [];\nfor (const item of $input.all()) {\n  const b = item.json.body ?? {};\n  // Campo trampa: un campo oculto llamado \"web\" que una persona no rellena y muchos bots sí.\n  if (limpio(b.web, 200) !== '') continue;\n  const datos = {\n    'Fecha': $now.toFormat('dd/MM/yyyy HH:mm'),\n    'Nombre': limpio(b.nombre, 100),\n    'Email': limpio(b.email, 150).toLowerCase(),\n    'Teléfono': limpio(b.telefono, 30),\n    'Mensaje': limpio(b.mensaje, 2000),\n    'Página': limpio(b.pagina || item.json.headers?.referer, 300),\n  };\n  const emailOk = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(datos['Email']);\n  const telOk = datos['Teléfono'].replace(/\\D/g, '').length >= 9;\n  if (!datos['Nombre'] || (!emailOk && !telOk)) continue;\n  salida.push({ json: datos });\n}\nreturn salida;"
      },
      "id": "48cd7731-a6c1-5808-ba64-190115ee4885",
      "name": "Validar y limpiar",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        240,
        100
      ]
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "",
          "mode": "url"
        },
        "sheetName": {
          "__rl": true,
          "value": "Contactos",
          "mode": "name"
        },
        "operation": "append",
        "columns": {
          "mappingMode": "autoMapInputData",
          "value": {},
          "matchingColumns": [],
          "schema": []
        },
        "options": {}
      },
      "id": "6fd10c8e-fc5c-5166-8583-e4652fd6e881",
      "name": "Guardar en la hoja",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        480,
        100
      ]
    },
    {
      "parameters": {
        "fromEmail": "",
        "toEmail": "",
        "subject": "=Nuevo contacto: {{ $('Validar y limpiar').item.json['Nombre'] }}",
        "emailFormat": "html",
        "html": "=<p><b>Nuevo contacto desde la web</b></p><p>{{ $('Validar y limpiar').item.json['Nombre'] }}<br>{{ $('Validar y limpiar').item.json['Email'] }} · {{ $('Validar y limpiar').item.json['Teléfono'] }}</p><p>{{ $('Validar y limpiar').item.json['Mensaje'] }}</p><p><small>{{ $('Validar y limpiar').item.json['Fecha'] }} · {{ $('Validar y limpiar').item.json['Página'] }}</small></p>",
        "options": {}
      },
      "id": "97b23d67-9d75-5c2e-9719-f5cadfa85935",
      "name": "Avisar por correo",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        720,
        100
      ]
    }
  ],
  "connections": {
    "Formulario de la web": {
      "main": [
        [
          {
            "node": "Validar y limpiar",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validar y limpiar": {
      "main": [
        [
          {
            "node": "Guardar en la hoja",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Guardar en la hoja": {
      "main": [
        [
          {
            "node": "Avisar por correo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "timezone": "Europe/Madrid"
  },
  "meta": {
    "templateCredsSetupCompleted": false,
    "source": "Plantilla gratuita de Cauce · cauceautomation.es/automatizacion-de-procesos/plantillas-n8n"
  },
  "tags": []
}
