Files
SurfersIsland/n8n/SurfersIsland_MailBot.json
T
2026-03-25 06:41:14 +01:00

674 lines
19 KiB
JSON

{
"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": []
}