{ "name": "SurfersIsland_MailBot", "nodes": [ { "parameters": { "options": { "forceReconnect": 60, "trackLastMessageId": true } }, "type": "n8n-nodes-base.emailReadImap", "typeVersion": 2.1, "position": [ -496, -368 ], "id": "b5acfac0-3170-4add-b5f2-1b7c894e93e2", "name": "Email Trigger (IMAP)", "credentials": { "imap": { "id": "rkm3vxPn7aslUPMR", "name": "IMAP account" } } }, { "parameters": { "chatId": "5109688502", "text": "=Neue E-Mail-Buchung in {{ $json.sport }} von {{ $json['Full Name'] }} zum {{ $json.Dates }}.\n\nNachricht:\n{{ $json.Message }}\n\n", "additionalFields": { "appendAttribution": false } }, "type": "n8n-nodes-base.telegram", "typeVersion": 1.2, "position": [ 1072, -576 ], "id": "158e8692-d3d3-491a-8b08-03b727222efc", "name": "Send a text message", "webhookId": "7ec63efb-de68-42a2-8237-b79c3e5d1d27", "credentials": { "telegramApi": { "id": "kdu1SvGTcXmeMbB1", "name": "Telegram paulependelt_bot" } } }, { "parameters": { "jsCode": "const text = $input.first().json.textPlain;\n\n// Regex: findet *Field:* und den Text bis zum nächsten *Field:* \nconst regex = /\\*(.*?)\\*:\\s*([\\s\\S]*?)(?=\\n\\s*\\*|$)/g;\n\nlet match;\nconst result = {};\n\nwhile ((match = regex.exec(text)) !== null) {\n const key = match[1].trim();\n const value = match[2].trim();\n result[key] = value;\n}\n\nreturn [\n {\n json: result\n }\n];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -112, -704 ], "id": "435905b6-bc89-4d16-ad96-396f496bf872", "name": "Parse Mail to Json" }, { "parameters": { "jsCode": "const inputs = $json.Dates.split(';').map(i => i.trim());\nlet results = [];\n\nfor (input of inputs){\n results.push({\n ...$json,\n Dates: input,\n });\n};\n\nreturn results.map(r => ({ json: r }));" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 400, -272 ], "id": "d84a7544-bad3-4ff4-871d-5931e4b78f56", "name": "Split Dates to Items", "alwaysOutputData": false }, { "parameters": { "jsCode": "const [day, month, year] = $json.Dates.split(\".\");\n\nconst dateObj = new Date(`${year}-${month}-${day}`);\n\nconst monthNames = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];\n\nconst sheetName = `${monthNames[dateObj.getMonth()]} ${year.slice(2)}`;\n\nlet results = [];\n\nresults.push({\n ...$json,\n \"Sheet\": sheetName,\n});\n\nreturn results.map(r => ({ json: r }));" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 848, -256 ], "id": "7b381b7c-f404-4346-9686-dd7247d39451", "name": "Get Sheet Name" }, { "parameters": { "jsCode": "const inputDate = $json.Dates; \n// Format: 07.05.2026\n\n// Datum zerlegen\nconst [day, month, year] = inputDate.split(\".\");\n\n// JS Date erzeugen (ISO Format)\nconst date = new Date(`${year}-${month}-${day}`);\n\n// Excel / Sheets Basisdatum\nconst excelEpoch = new Date(\"1899-12-30\");\n\n// Differenz in Millisekunden\nconst diffMs = date - excelEpoch;\n\n// In Tage umrechnen\nconst serialNumber = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\nreturn [{\n json: {\n ...$json,\n DateSerial: serialNumber\n }\n}];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 1296, -160 ], "id": "a89c576f-e695-4564-a65c-79ea262fe39c", "name": "Get Date in Serial" }, { "parameters": { "method": "PUT", "url": "=https://sheets.googleapis.com/v4/spreadsheets/{{ $json.spreadsheetId }}/values/'{{ $('Get Sheet Name').item.json.Sheet }}'!A{{ $('Merge').item.json.row_number +2}}:Z{{ $('Merge').item.json.row_number +2}}?valueInputOption=USER_ENTERED", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleSheetsOAuth2Api", "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"range\": \"'{{ $('Get Sheet Name').item.json.Sheet }}'!A{{ $('Merge').item.json.row_number +2}}:Z{{ $('Merge').item.json.row_number +2}}\",\n \"majorDimension\": \"ROWS\",\n \"values\": [\n [\n \"New\",\n \"{{ $('Loop Over Items').item.json['Full Name'] }}\",\n \"{{ $('Loop Over Items').item.json.Age }}\",\n \"{{ $('Loop Over Items').item.json.Tall }}\",\n \"{{ $('Loop Over Items').item.json.Weigh }}\",\n \"\",\n \"=BOARD(E{{ $('Merge').item.json.row_number +2}})\",\n \"\",\n \"{{ $('Loop Over Items').item.json.Accommodation }}\"\n ]\n ]\n}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 2416, -80 ], "id": "12d5aa0e-4493-4cfc-9015-f0f1a4025ecb", "name": "Insert Data", "executeOnce": false, "credentials": { "googleSheetsOAuth2Api": { "id": "uD5ZF97n5p0sR1i3", "name": "Google Sheets" } } }, { "parameters": { "method": "POST", "url": "=https://sheets.googleapis.com/v4/spreadsheets/{{ $json.spreadsheetID }}:batchUpdate", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleSheetsOAuth2Api", "sendBody": true, "specifyBody": "json", "jsonBody": "={ \n \"requests\": [ \n { \"insertDimension\": { \n \"range\": { \n \"sheetId\": {{ $json.sheetId }}, \n \"dimension\": \"ROWS\", \n \"startIndex\": {{ $json.row_number+1 }}, \n \"endIndex\": {{ $json.row_number+2 }} \n }, \n \"inheritFromBefore\": false \n }\n } \n ]\n} ", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 2192, -224 ], "id": "3f9c58f8-81f0-4a33-9acf-ed4c351ca4fc", "name": "Add Row", "credentials": { "googleSheetsOAuth2Api": { "id": "uD5ZF97n5p0sR1i3", "name": "Google Sheets" } } }, { "parameters": { "url": "=https://sheets.googleapis.com/v4/spreadsheets/{{ $json.spreadsheetID }}", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleSheetsOAuth2Api", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 1072, -384 ], "id": "81e01fda-c91d-4f13-9854-c0366c1a8bb7", "name": "Get Sheed IDs", "executeOnce": true, "credentials": { "googleSheetsOAuth2Api": { "id": "uD5ZF97n5p0sR1i3", "name": "Google Sheets" } } }, { "parameters": { "jsCode": "const sheets = $json.sheets;\nconst target = sheets.find(s => s.properties.title === $('Get Sheet Name').first().json.Sheet);\nreturn [{ sheetId: target.properties.sheetId }];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 1296, -384 ], "id": "14eac781-34d5-4db0-a65a-07674ff280f6", "name": "Find Sheet ID" }, { "parameters": { "mode": "combine", "combineBy": "combineByPosition", "numberInputs": 3, "options": {} }, "type": "n8n-nodes-base.merge", "typeVersion": 3.2, "position": [ 1968, -240 ], "id": "b124a24d-61d1-4a16-885a-49ace32ab72b", "name": "Merge" }, { "parameters": { "options": {} }, "type": "n8n-nodes-base.splitInBatches", "typeVersion": 3, "position": [ 624, -272 ], "id": "6c96e3e5-4a73-4efe-877d-737242c5f5a5", "name": "Loop Over Items" }, { "parameters": { "mode": "chooseBranch" }, "type": "n8n-nodes-base.merge", "typeVersion": 3.2, "position": [ 848, -576 ], "id": "cb67ca67-f357-4097-adab-8713df191a7c", "name": "Merge1" }, { "parameters": { "jsCode": "const subject = $json.subject;\nlet results = []\n\nswitch (subject){\n case \"BookingRequest-MailBot-Surf\":\n results.push({\n sport: \"Surf\",\n spreadsheetID: \"1T4vjZi7JKHHJH8KxWsa6AzGLmz4PROW1s93fwlMru-U\",\n });\n break;\n case \"BookingRequest-MailBot-Kite\":\n results.push({\n sport: \"Kite\",\n spreadsheetID: \"1OcUsAlnhp4d-qKbnJAcQ-2-6iOs5XWoVunqCjTBlIEw\",\n });\n break;\n}\n\nreturn results.map(r => ({ json: r }));" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -112, -288 ], "id": "807aac51-7910-43fa-82f2-ee2de6e11637", "name": "Kite or Surf" }, { "parameters": { "mode": "combine", "combineBy": "combineByPosition", "options": {} }, "type": "n8n-nodes-base.merge", "typeVersion": 3.2, "position": [ 176, -368 ], "id": "997a2fc0-bd38-4745-b0bb-59bbcf15dd5f", "name": "Merge2" }, { "parameters": { "documentId": { "__rl": true, "value": "={{ $('Get Sheed IDs').item.json.spreadsheetId }}", "mode": "id" }, "sheetName": { "__rl": true, "value": "={{ $json.sheetId }}", "mode": "id" }, "filtersUI": { "values": [ { "lookupColumn": "Date", "lookupValue": "={{ $json.DateSerial }}" } ] }, "options": { "dataLocationOnSheet": { "values": { "rangeDefinition": "specifyRangeA1", "range": "A:A" } }, "outputFormatting": { "values": { "general": "UNFORMATTED_VALUE", "date": "SERIAL_NUMBER" } }, "returnFirstMatch": true } }, "type": "n8n-nodes-base.googleSheets", "typeVersion": 4.7, "position": [ 1744, -416 ], "id": "7046f3c7-875a-48a6-b684-7f1e2e61199a", "name": "Get row(s) in sheet", "credentials": { "googleSheetsOAuth2Api": { "id": "uD5ZF97n5p0sR1i3", "name": "Google Sheets" } } }, { "parameters": { "mode": "combine", "combineBy": "combineByPosition", "options": {} }, "type": "n8n-nodes-base.merge", "typeVersion": 3.2, "position": [ 1520, -320 ], "id": "ddcafb5d-7fc2-4cfe-915d-0b43cb6d61ca", "name": "Merge3" }, { "parameters": { "method": "POST", "url": "=https://sheets.googleapis.com/v4/spreadsheets/{{ $json.spreadsheetId }}:batchUpdate", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleSheetsOAuth2Api", "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"requests\": [\n {\n \"repeatCell\": {\n \"range\": {\n \"sheetId\": {{ $('Merge').item.json.sheetId }},\n \"startRowIndex\": {{ $('Merge').item.json.row_number +1}},\n \"endRowIndex\": {{ $('Merge').item.json.row_number +2}},\n \"startColumnIndex\": 12,\n \"endColumnIndex\": 16\n },\n \"cell\": {\n \"userEnteredFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 1\n }\n }\n },\n \"fields\": \"userEnteredFormat.backgroundColor\"\n }\n }\n ]\n}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 2624, -144 ], "id": "bf5e85b8-c3b9-44f1-8b93-3e5568f355fe", "name": "White", "credentials": { "googleSheetsOAuth2Api": { "id": "uD5ZF97n5p0sR1i3", "name": "Google Sheets" } } }, { "parameters": { "method": "POST", "url": "=https://sheets.googleapis.com/v4/spreadsheets/{{ $json.spreadsheetId }}:batchUpdate", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleSheetsOAuth2Api", "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"requests\": [\n {\n \"repeatCell\": {\n \"range\": {\n \"sheetId\": {{ $('Merge').item.json.sheetId }},\n \"startRowIndex\": {{ $('Merge').item.json.row_number +1}},\n \"endRowIndex\": {{ $('Merge').item.json.row_number +2}},\n \"startColumnIndex\": 0,\n \"endColumnIndex\": 11\n },\n \"cell\": {\n \"userEnteredFormat\": {\n \"backgroundColor\": {\n \"red\": 1,\n \"green\": 1,\n \"blue\": 0\n }\n }\n },\n \"fields\": \"userEnteredFormat.backgroundColor\"\n }\n }\n ]\n}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 2624, 0 ], "id": "061cd389-e8ba-44e2-b973-5a9ad8e454e4", "name": "Yellow", "credentials": { "googleSheetsOAuth2Api": { "id": "uD5ZF97n5p0sR1i3", "name": "Google Sheets" } } }, { "parameters": { "mode": "chooseBranch" }, "type": "n8n-nodes-base.merge", "typeVersion": 3.2, "position": [ 2832, 0 ], "id": "88113df7-42d7-4145-9c69-8ba6cb2cead8", "name": "Merge4" }, { "parameters": { "jsCode": "const text = $json.textPlain; \n\nconst lines = text.split('\\n').filter(l => l.trim() !== '');\n\nconst result = {};\n\nfor (const line of lines) {\n const [key, value] = line.split(':');\n if (key && value) {\n result[key.trim()] = value.trim();\n }\n}\n\nreturn [\n {\n json: result\n }\n];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -112, -480 ], "id": "de54ab86-aa00-49b6-bc7b-718a8f0bd103", "name": "Parse Mail to Json1" } ], "pinData": {}, "connections": { "Email Trigger (IMAP)": { "main": [ [ { "node": "Kite or Surf", "type": "main", "index": 0 }, { "node": "Parse Mail to Json1", "type": "main", "index": 0 } ] ] }, "Parse Mail to Json": { "main": [ [] ] }, "Split Dates to Items": { "main": [ [ { "node": "Loop Over Items", "type": "main", "index": 0 } ] ] }, "Get Sheet Name": { "main": [ [ { "node": "Get Date in Serial", "type": "main", "index": 0 }, { "node": "Get Sheed IDs", "type": "main", "index": 0 } ] ] }, "Get Date in Serial": { "main": [ [ { "node": "Merge3", "type": "main", "index": 0 }, { "node": "Merge", "type": "main", "index": 1 } ] ] }, "Add Row": { "main": [ [ { "node": "Insert Data", "type": "main", "index": 0 } ] ] }, "Get Sheed IDs": { "main": [ [ { "node": "Find Sheet ID", "type": "main", "index": 0 } ] ] }, "Find Sheet ID": { "main": [ [ { "node": "Merge3", "type": "main", "index": 1 } ] ] }, "Merge": { "main": [ [ { "node": "Add Row", "type": "main", "index": 0 } ] ] }, "Loop Over Items": { "main": [ [ { "node": "Merge1", "type": "main", "index": 1 } ], [ { "node": "Get Sheet Name", "type": "main", "index": 0 } ] ] }, "Insert Data": { "main": [ [ { "node": "Yellow", "type": "main", "index": 0 }, { "node": "White", "type": "main", "index": 0 } ] ] }, "Merge1": { "main": [ [ { "node": "Send a text message", "type": "main", "index": 0 } ] ] }, "Kite or Surf": { "main": [ [ { "node": "Merge2", "type": "main", "index": 1 } ] ] }, "Merge2": { "main": [ [ { "node": "Merge1", "type": "main", "index": 0 }, { "node": "Split Dates to Items", "type": "main", "index": 0 } ] ] }, "Get row(s) in sheet": { "main": [ [ { "node": "Merge", "type": "main", "index": 0 } ] ] }, "Merge3": { "main": [ [ { "node": "Get row(s) in sheet", "type": "main", "index": 0 }, { "node": "Merge", "type": "main", "index": 2 } ] ] }, "Yellow": { "main": [ [ { "node": "Merge4", "type": "main", "index": 0 } ] ] }, "White": { "main": [ [ { "node": "Merge4", "type": "main", "index": 1 } ] ] }, "Merge4": { "main": [ [ { "node": "Loop Over Items", "type": "main", "index": 0 } ] ] }, "Parse Mail to Json1": { "main": [ [ { "node": "Merge2", "type": "main", "index": 0 } ] ] } }, "active": false, "settings": { "executionOrder": "v1", "binaryMode": "separate", "availableInMCP": false }, "versionId": "682b6e06-36ae-4bd4-8089-df236c96d0c0", "meta": { "templateCredsSetupCompleted": true, "instanceId": "4674f284e85213f04baf0419e3407e986c2c4a3d3e335730c4a2482ed0ab860a" }, "id": "3hAYo6T16q1q63sx", "tags": [] }