{ "nodes": [ { "id": "fc128eed-1666-46b8-8feb-e6ddf05e85d1", "name": "Schedule Trigger", "type": "n8n-nodes-base.scheduleTrigger", "position": [ 380, 240 ], "parameters": { "rule": { "interval": [ { "field": "hours", "hoursInterval": 2 } ] } }, "typeVersion": 1.2, "notes": "This scheduleTrigger node performs automated tasks as part of the workflow." }, { "id": "830708eb-197b-4bf7-95da-893d78329ab2", "name": "Strava", "type": "n8n-nodes-base.strava", "position": [ 380, 480 ], "parameters": { "limit": 10, "operation": "getAll" }, "typeVersion": 1.1, "notes": "This strava node performs automated tasks as part of the workflow." }, { "id": "de776ebf-3ad5-4c4c-b0c8-7bc74cba5446", "name": "Code", "type": "n8n-nodes-base.code", "position": [ 380, 740 ], "parameters": { "jsCode": "// Obtén los items del nodo \"Strava\"\nconst stravaItems = $('strava_last').all();\n\n// Obtén los items del nodo \"ultimas_id\"\nconst ultimasGuardadasItems = $('saved_last').all();\n\n// Extrae las referencias guardadas en un Set, asegurando el formato como cadena\nconst referenciasGuardadas = new Set(\n ultimasGuardadasItems.map(item => String(item.json.id))\n);\n\n// Filtra los items de \"Strava\" cuyos IDs no estén en las referencias guardadas\nconst filteredItems = stravaItems.filter(item => {\n // Convertir el ID actual de Strava a cadena para comparar correctamente\n return !referenciasGuardadas.has(String(item.json.id));\n});\n\n// Depuración: imprime las referencias y los resultados\nconsole.log('Referencias guardadas:', [...referenciasGuardadas]);\nconsole.log('Items filtrados:', filteredItems);\n\n// Devuelve los items filtrados\nreturn filteredItems;\n\n\n" }, "typeVersion": 2, "notes": "This code node performs automated tasks as part of the workflow." }, { "id": "c8a93e6e-67fc-4f6d-bcde-83d3a885c622", "name": "Google Sheets", "type": "n8n-nodes-base.googleSheets", "position": [ 900, 740 ], "parameters": { "columns": { "value": { "Kms": "={{ $json.distancia }}", "Ref": "={{ $json.id }}", "Fecha": "={{ $json.fecha }}", "Track": "={{ $env.WEBHOOK_URL }}{{ $json.id }}", "Tiempo": "={{ $json.tiempo }}", "Desnivel": "={{ $json.elevacion }}" }, "schema": [ { "id": "Fecha", "type": "string", "display": true, "required": false, "displayName": "Fecha", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "Kms", "type": "string", "display": true, "required": false, "displayName": "Kms", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "Tiempo", "type": "string", "display": true, "required": false, "displayName": "Tiempo", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "Ref", "type": "string", "display": true, "removed": false, "required": false, "displayName": "Ref", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "Track", "type": "string", "display": true, "required": false, "displayName": "Track", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "Bicicleta", "type": "string", "display": true, "required": false, "displayName": "Bicicleta", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "Terreno", "type": "string", "display": true, "required": false, "displayName": "Terreno", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "Desnivel", "type": "string", "display": true, "required": false, "displayName": "Desnivel", "defaultMatch": false, "canBeUsedToMatch": true } ], "mappingMode": "defineBelow", "matchingColumns": [] }, "options": {}, "operation": "append", "sheetName": { "__rl": true, "mode": "list", "value": 419561402, "cachedResultUrl": "{{ $env.WEBHOOK_URL }}", "cachedResultName": "n8n" }, "documentId": { "__rl": true, "mode": "list", "value": "159k8cDL8hZooz-dsHE6ueWf68mBkHhxVCKnWm-lYLqs", "cachedResultUrl": "{{ $env.WEBHOOK_URL }}", "cachedResultName": "Sherlo_Bike" } }, "credentials": { "googleSheetsOAuth2Api": { "id": "tyg7FJlIITkSazyi", "name": "Nik's Google" } }, "typeVersion": 4.5, "notes": "This googleSheets node performs automated tasks as part of the workflow." }, { "id": "0ce07d54-97af-4e88-9d27-452191a0b3ba", "name": "strava_last", "type": "n8n-nodes-base.set", "position": [ 1420, 480 ], "parameters": { "options": {}, "assignments": { "assignments": [ { "id": "423ae4b8-287c-4dc1-b32b-d1b6f1f45efa", "name": "id", "type": "number", "value": "={{ $json.id }}" }, { "id": "595802d2-17d0-40be-9e43-d655ffbf4ce0", "name": "fecha", "type": "string", "value": "={{ DateTime.fromISO($json.start_date_local).toFormat('d/M/yyyy') }}" }, { "id": "4b39d783-19f2-4a7e-b0e6-dbe2b98f1ae0", "name": "distancia", "type": "number", "value": "={{ Math.round($json.distance / 100) / 10 }}" }, { "id": "2f321dc0-435f-4b4d-866c-091ff9eaf9df", "name": "elevacion", "type": "number", "value": "={{ Math.round($json.total_elevation_gain) }}" }, { "id": "ba1bb089-5ae7-4e42-ac65-07323c4e1842", "name": "tiempo", "type": "string", "value": "={{ `${Math.floor($json.moving_time / 3600)}:${Math.floor(($json.moving_time % 3600) / 60).toString().padStart(2, '0')}:${($json.moving_time % 60).toString().padStart(2, '0')}` }}\n" } ] } }, "typeVersion": 3.4, "notes": "This set node performs automated tasks as part of the workflow." }, { "id": "490f7be9-73c9-4431-8b83-fcdbbcc283eb", "name": "Remove Duplicates", "type": "n8n-nodes-base.removeDuplicates", "position": [ 900, 480 ], "parameters": { "compare": "selectedFields", "options": {}, "fieldsToCompare": "id" }, "typeVersion": 2, "notes": "This removeDuplicates node performs automated tasks as part of the workflow." }, { "id": "2d1c4dc5-2baa-4c89-a312-4b40381d4e5d", "name": "activities", "type": "n8n-nodes-base.googleSheets", "position": [ 660, 240 ], "parameters": { "options": {}, "sheetName": { "__rl": true, "mode": "list", "value": 419561402, "cachedResultUrl": "{{ $env.WEBHOOK_URL }}", "cachedResultName": "n8n" }, "documentId": { "__rl": true, "mode": "list", "value": "159k8cDL8hZooz-dsHE6ueWf68mBkHhxVCKnWm-lYLqs", "cachedResultUrl": "{{ $env.WEBHOOK_URL }}", "cachedResultName": "Sherlo_Bike" } }, "credentials": { "googleSheetsOAuth2Api": { "id": "tyg7FJlIITkSazyi", "name": "Nik's Google" } }, "typeVersion": 4.5, "notes": "This googleSheets node performs automated tasks as part of the workflow." }, { "id": "2c7b7939-4ca1-4868-92bf-5fd7384a1103", "name": "sort_saved", "type": "n8n-nodes-base.sort", "position": [ 900, 240 ], "parameters": { "options": {}, "sortFieldsUi": { "sortField": [ { "fieldName": "Ref" } ] } }, "typeVersion": 1, "notes": "This sort node performs automated tasks as part of the workflow." }, { "id": "4e1d9064-6dda-4a01-af48-f278792f8b6b", "name": "last_saved", "type": "n8n-nodes-base.limit", "position": [ 1160, 240 ], "parameters": { "keep": "lastItems", "maxItems": 10 }, "typeVersion": 1, "notes": "This limit node performs automated tasks as part of the workflow." }, { "id": "6eb2053a-1101-477b-86e9-113813be2d92", "name": "saved_last", "type": "n8n-nodes-base.set", "position": [ 1420, 240 ], "parameters": { "options": {}, "assignments": { "assignments": [ { "id": "50097932-ab91-4af7-9412-925fab1982f0", "name": "id", "type": "string", "value": "={{ $json.Ref }}" } ] } }, "typeVersion": 3.4, "notes": "This set node performs automated tasks as part of the workflow." }, { "id": "afd986f1-0c49-4a69-b948-aefcbff1010f", "name": "sort_strava", "type": "n8n-nodes-base.sort", "position": [ 660, 480 ], "parameters": { "options": {}, "sortFieldsUi": { "sortField": [ { "fieldName": "id" } ] } }, "typeVersion": 1, "notes": "This sort node performs automated tasks as part of the workflow." }, { "id": "16094d29-f35b-492c-9d93-3145dab30cd3", "name": "last_strava", "type": "n8n-nodes-base.limit", "position": [ 1160, 480 ], "parameters": { "keep": "lastItems", "maxItems": 10 }, "typeVersion": 1, "notes": "This limit node performs automated tasks as part of the workflow." }, { "id": "9986360b-fcd3-42f4-ad13-aea69f6d1a80", "name": "sort_results", "type": "n8n-nodes-base.sort", "position": [ 660, 740 ], "parameters": { "options": {}, "sortFieldsUi": { "sortField": [ { "fieldName": "id" } ] } }, "typeVersion": 1, "notes": "This sort node performs automated tasks as part of the workflow." }, { "id": "error-86636632", "name": "Error Handler", "type": "n8n-nodes-base.stopAndError", "typeVersion": 1, "position": [ 1000, 400 ], "parameters": { "message": "Workflow execution error", "options": {} } } ], "pinData": {}, "connections": { "c8a93e6e-67fc-4f6d-bcde-83d3a885c622": { "main": [ [ { "node": "error-handler-c8a93e6e-67fc-4f6d-bcde-83d3a885c622-972921c0", "type": "main", "index": 0 } ] ] }, "2d1c4dc5-2baa-4c89-a312-4b40381d4e5d": { "main": [ [ { "node": "error-handler-2d1c4dc5-2baa-4c89-a312-4b40381d4e5d-312e1db2", "type": "main", "index": 0 } ] ] } }, "name": "Scheduletrigger Workflow", "description": "Automated workflow: Scheduletrigger Workflow. This workflow processes data and performs automated tasks.", "settings": { "executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000 }, "meta": { "instanceId": "workflow-17ecfdee", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:47.427026", "updatedAt": "2025-09-29T07:07:47.427041", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production" }, "tags": [ "automation", "n8n", "production-ready", "excellent", "optimized" ], "notes": "Excellent quality workflow: Scheduletrigger Workflow. This workflow has been optimized for production use with comprehensive error handling, security, and documentation." }