Workflow: Import CSV from URL to GoogleSheet
Integrations: filter, googleSheets, httpRequest, manualTrigger, set, spreadsheetFile, stickyNote

{"id": "NLVfecejH0cTtcdd", "meta": {"instanceId": "workflow-9aefb406", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:44.881153", "updatedAt": "2025-09-29T07:07:44.881227", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production"}, "name": "Import CSV from URL to GoogleSheet", "tags": ["automation", "n8n", "production-ready", "excellent", "optimized"], "nodes": [{"id": "90cced3d-b03b-4b51-b1f7-4cbd2dac25eb", "name": "When clicking \"Execute Workflow\"", "type": "n8n-nodes-base.manualTrigger", "position": [860, 380], "parameters": {}, "typeVersion": 1, "notes": "This manualTrigger node performs automated tasks as part of the workflow."}, {"id": "df9519b6-937e-4a9e-bdb9-86fb722ca3c1", "name": "Upload to spreadsheet", "type": "n8n-nodes-base.googleSheets", "position": [1880, 380], "parameters": {"columns": {"value": {}, "schema": [{"id": "unique_key", "type": "string", "display": true, "removed": false, "required": false, "displayName": "unique_key", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "\ufeffcountry", "type": "string", "display": true, "required": false, "displayName": "\ufeffcountry", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "country_code", "type": "string", "display": true, "required": false, "displayName": "country_code", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "year_week", "type": "string", "display": true, "required": false, "displayName": "year_week", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "level", "type": "string", "display": true, "required": false, "displayName": "level", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "region", "type": "string", "display": true, "required": false, "displayName": "region", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "region_name", "type": "string", "display": true, "required": false, "displayName": "region_name", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "new_cases", "type": "string", "display": true, "required": false, "displayName": "new_cases", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "tests_done", "type": "string", "display": true, "required": false, "displayName": "tests_done", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "population", "type": "string", "display": true, "required": false, "displayName": "population", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "testing_rate", "type": "string", "display": true, "required": false, "displayName": "testing_rate", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "positivity_rate", "type": "string", "display": true, "required": false, "displayName": "positivity_rate", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "testing_data_source", "type": "string", "display": true, "required": false, "displayName": "testing_data_source", "defaultMatch": false, "canBeUsedToMatch": true}], "mappingMode": "autoMapInputData", "matchingColumns": ["unique_key"]}, "options": {"cellFormat": "USER_ENTERED"}, "operation": "appendOrUpdate", "sheetName": {"__rl": true, "mode": "list", "value": 383583634, "cachedResultUrl": "{{ $env.WEBHOOK_URL }}", "cachedResultName": "COVID-weekly"}, "documentId": {"__rl": true, "mode": "url", "value": "{{ $env.WEBHOOK_URL }}"}}, "credentials": {"googleSheetsOAuth2Api": {"id": "{{ $credentials.googleSheetsOAuth2Api.id }}", "name": "Google Sheets account"}}, "typeVersion": 4, "notes": "This googleSheets node performs automated tasks as part of the workflow."}, {"id": "8298b29e-8784-4e15-902f-dc073fa73668", "name": "Add unique field", "type": "n8n-nodes-base.set", "position": [1460, 380], "parameters": {"fields": {"values": [{"name": "unique_key", "stringValue": "={{ $json.country_code }}-{{ $json.year_week }}"}]}, "options": {}}, "typeVersion": 3, "notes": "This set node performs automated tasks as part of the workflow."}, {"id": "b71bb998-4df2-4311-ae98-42c3e5e41d58", "name": "Import CSV", "type": "n8n-nodes-base.spreadsheetFile", "position": [1260, 380], "parameters": {"options": {"headerRow": true}, "fileFormat": "csv"}, "typeVersion": 2, "notes": "This spreadsheetFile node performs automated tasks as part of the workflow."}, {"id": "36204081-3995-46d4-ac8f-3408cbaed657", "name": "Download CSV", "type": "n8n-nodes-base.httpRequest", "position": [1060, 380], "parameters": {"url": "{{ $env.WEBHOOK_URL }}", "options": {"response": {"response": {"responseFormat": "file"}}}}, "typeVersion": 4.1, "notes": "This httpRequest node performs automated tasks as part of the workflow."}, {"id": "b1a78d2e-1a8b-4d98-b130-080b3017192d", "name": "Keep only DACH in 2023", "type": "n8n-nodes-base.filter", "position": [1680, 380], "parameters": {"conditions": {"string": [{"value1": "={{ $json.year_week }}", "value2": "2023", "operation": "startsWith"}], "boolean": [{"value1": "={{ ['DE', 'AT', 'CH'].includes($json.country_code )}}", "value2": true}]}}, "typeVersion": 1, "notes": "This filter node performs automated tasks as part of the workflow."}, {"id": "c5a3af9b-30a0-4337-bbb7-cff54007b22f", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [1620, 241], "parameters": {"width": 460, "height": 293, "content": "### Google API has rate-limits for read and write operations, that's why we take only a subset of the data\n\nTo import the whole dataset please add Split In Batches and a Wait node with a sufficient delay."}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}], "active": false, "pinData": {}, "settings": {"executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000}, "versionId": "d49a3f54-a422-4e76-b410-f8c12b4dd78b", "connections": {"36204081-3995-46d4-ac8f-3408cbaed657": {"main": [[{"node": "error-handler-36204081-3995-46d4-ac8f-3408cbaed657", "type": "main", "index": 0}], [{"node": "error-handler-36204081-3995-46d4-ac8f-3408cbaed657-a27c62ca", "type": "main", "index": 0}], [{"node": "error-handler-36204081-3995-46d4-ac8f-3408cbaed657-827762ba", "type": "main", "index": 0}], [{"node": "error-handler-36204081-3995-46d4-ac8f-3408cbaed657-f2ea6990", "type": "main", "index": 0}], [{"node": "error-handler-36204081-3995-46d4-ac8f-3408cbaed657-a89ab0ab", "type": "main", "index": 0}], [{"node": "error-handler-36204081-3995-46d4-ac8f-3408cbaed657-461288a1", "type": "main", "index": 0}], [{"node": "error-handler-36204081-3995-46d4-ac8f-3408cbaed657-1a37d040", "type": "main", "index": 0}], [{"node": "error-handler-36204081-3995-46d4-ac8f-3408cbaed657-ae33f4ac", "type": "main", "index": 0}], [{"node": "error-handler-36204081-3995-46d4-ac8f-3408cbaed657-e7348e42", "type": "main", "index": 0}]]}, "df9519b6-937e-4a9e-bdb9-86fb722ca3c1": {"main": [[{"node": "error-handler-df9519b6-937e-4a9e-bdb9-86fb722ca3c1-3f53620d", "type": "main", "index": 0}]]}, "b71bb998-4df2-4311-ae98-42c3e5e41d58": {"main": [[{"node": "error-handler-b71bb998-4df2-4311-ae98-42c3e5e41d58-61a37a67", "type": "main", "index": 0}]]}}, "description": "Automated workflow: Import CSV from URL to GoogleSheet. This workflow integrates 8 different services: filter, httpRequest, stickyNote, spreadsheetFile, set. It contains 11 nodes and follows best practices for error handling and security.", "notes": "Excellent quality workflow: Import CSV from URL to GoogleSheet. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}