{"workflow":{"id":13716,"name":"Track Excel 365 changes and approvals with Telegram and Google Sheets logging","views":76,"recentViews":1,"totalViews":76,"createdAt":"2026-02-25T18:18:24.402Z","description":"# Track changes and approvals in Excel 365\n\n## 📌 Overview\n\nThis workflow monitors an Excel 365 sheet every minute and detects new, updated, and deleted rows using a unique ID column. It compares the current dataset with the previous snapshot and identifies field-level differences.\n\nWhen changes are detected, the workflow filters rows that require approval (Status = “Waiting Approval”), sends structured notifications, and optionally logs every field-level change into an audit sheet (Excel or Google Sheets).\n\nThe configuration layer allows you to define the ID column, ignored fields, and audit logging behavior without modifying the comparison logic.\n\nThis template is suitable for approval tracking, operational monitoring, and lightweight compliance logging.\n\n## How it works\n1. Runs every minute using a schedule trigger\n2. Reads rows from Excel 365\n3. Normalizes and stores a snapshot\n4. Compares with the previous state\n5. Detects new, updated, and deleted rows\n6. Filters rows with “Waiting Approval” status\n7. Sends structured notifications\n8. Logs changes if audit logging is enabled\n\n## Setup steps\n1. Configure Microsoft Excel credentials\n2. Ensure your sheet contains a unique ID column\n3. Update the Environment Config node\n4.(Optional) Configure Google Sheets credentials for audit logging\n5. Activate the workflow\n\n## 🚀 Features\n\n### ⏱ Scheduled Monitoring\n- Runs automatically every 1 minute\n- Near real-time Excel monitoring\n- Prevents unnecessary execution when no changes are detected\n\n### 🔍 Row-Level Change Detection\n\n### Detects:\n- ✅ New rows\n- ✏️ Updated rows\n- ❌ Deleted rows\n\nUses a unique ID field per row for accurate tracking.\n\n⸻\n\n### 🧠 Field-Level Comparison\n- Compares previous vs current values\n- Identifies exactly which fields changed\n- Outputs structured change data\n- Prevents false positives via data normalization\n\n⸻\n\n## ⚙️ Environment Configuration Layer\n\nCentralized configuration node allows easy customization without modifying core logic.\n\n## Configurable options include:\n- idField\n- ignoreFields\n- monitorOnly\n- firstRunSilent\n- enableAuditLog\n\nNo hardcoded logic required.\n\n⸻\n\n## 🛑 Approval Validation Layer\n- Filters rows where Status = \"Waiting Approval\"\n- Sends notifications only for relevant approval cases\n- Prevents unnecessary alerts\n\n⸻\n\n## 🔔 Smart Notification System\n- Sends formatted change notifications\n- Includes:\n- Change Type (NEW / UPDATED / DELETED)\n- Row ID\n- Field-level old → new values\n\nFully customizable message formatting.\n⸻\n## 📊 Optional Audit Logging\n\nIf enabled in the Environment Config:\n- Converts each field-level change into structured audit rows\n- Appends logs to:\n- Excel 365 (Audit Sheet)\n- Google Sheets (External Log)\n\nAudit Log Structure\n\n| Timestamp | ChangeType | RowID | Field | OldValue | New Value |\n|-------------|--------------|--------|------|----------|------------|\n\nDesigned for compliance and tracking purposes.\n\n## 📦 Use Cases\n- Internal approval tracking\n- Financial data monitoring\n- Sales pipeline control\n- Procurement workflows\n- Excel-based compliance systems\n- SME automation systems\n\n## 🧩 Requirements\n- Microsoft 365 (Excel Online – Business)\n- n8n (Cloud or Self-hosted)\n- Microsoft credentials configured in n8n\n- Telegram Bot\n- (Optional) Google Sheets credentials for audit logging\n\n## 🔧 Configuration Guide\nAll system behavior is controlled from the Environment Config node.\n\nExample configuration structure:\n\n```\n{\n  CONFIG: {\n    idField: \"ID\",\n    ignoreFields: [\"UpdatedAt\", \"LastModified\"],\n    monitorOnly: null,\n    firstRunSilent: true,\n    enableAuditLog: true\n  }\n}\n```\n\nYou can customize:\n- Which column acts as unique ID\n- Which fields to ignore\n- Which fields to monitor exclusively\n- Whether to enable audit logging\n- Whether first run should be silent\n\n## 🟢 First Run Behavior\nOn first execution:\n- The workflow initializes internal snapshot storage\n- No mass notification is sent (if firstRunSilent = true)\n\nThis prevents false “NEW row” alerts during setup.\n## 🏢 Who Is This For?\n- Operations teams\n- Finance departments\n- SMEs using Excel as core system\n- Automation consultants\n- Businesses requiring lightweight audit tracking\n\n⸻\n\n## 💡 Why This Workflow?\n\nUnlike simple Excel polling workflows, this solution:\n- Tracks changes at field level\n- Supports approval-based filtering\n- Includes structured audit logging\n- Avoids duplicate alerts\n- Is fully configurable\n- Designed for production usage\n\nThis is not just an Excel notifier — it is a structured Change Tracking & Approval Monitoring System built on n8n.```language\n\n```\n","workflow":{"id":"2sUwYje5ZEf8dXH9","meta":{"instanceId":"6cc986a902b3f0ff9240ae3d0468a1ce9791fa6b4506fb60ba160c17b5ef243b","templateCredsSetupCompleted":true},"name":"Track changes and approvals in Excel 365","tags":[],"nodes":[{"id":"5b8a06be-2ef3-437c-8003-826d8e868c58","name":"Get rows","type":"n8n-nodes-base.microsoftExcel","position":[112,128],"parameters":{"table":{"__rl":true,"mode":"list","value":"{C46945EA-111F-884A-9CE2-7890BA63B938}","cachedResultUrl":"https://onedrive.live.com/personal/f1cfeff06c99e405/_layouts/15/doc.aspx?resid=1736a44f-46ee-4594-ac0c-ca2529c411a8&cid=f1cfeff06c99e405&activeCell=Sheet2!A1:E23","cachedResultName":"Table_sheet2"},"filters":{},"resource":"table","workbook":{"__rl":true,"mode":"list","value":"F1CFEFF06C99E405!s1736a44f46ee4594ac0cca2529c411a8","cachedResultUrl":"https://onedrive.live.com/personal/f1cfeff06c99e405/_layouts/15/doc.aspx?resid=1736a44f-46ee-4594-ac0c-ca2529c411a8&cid=f1cfeff06c99e405","cachedResultName":"Contoh Excel N8N"},"operation":"getRows","returnAll":true,"worksheet":{"__rl":true,"mode":"list","value":"{9ECBF732-2A1B-49F1-AC81-3EB96DB24F0C}","cachedResultUrl":"https://onedrive.live.com/personal/f1cfeff06c99e405/_layouts/15/doc.aspx?resid=1736a44f-46ee-4594-ac0c-ca2529c411a8&cid=f1cfeff06c99e405&activeCell=Sheet2!A1","cachedResultName":"Sheet2"}},"credentials":{"microsoftExcelOAuth2Api":{"id":"credential-id","name":"Microsoft Excel account"}},"typeVersion":2.2},{"id":"c2076d05-31dd-49b0-8016-4c99ab7a2fed","name":"Normalize Data","type":"n8n-nodes-base.code","position":[320,128],"parameters":{"jsCode":"let items = $input.all();\nreturn items.map(item => {\n  return {\n    json: {\n      ...item.json,\n      ID: String(item.json.ID).trim()\n    }\n  };\n});"},"typeVersion":2},{"id":"d8329b72-1d5c-43d8-8b71-8512f306cb9a","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-144,48],"parameters":{"color":7,"width":1024,"height":272,"content":"## Step 1 "},"typeVersion":1},{"id":"ab56b1b5-ddba-4ea3-8c52-139a87f18974","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-128,384],"parameters":{"color":7,"width":704,"height":352,"content":"## Step 2 "},"typeVersion":1},{"id":"8b277663-15b3-421e-bab9-effd20cfb42b","name":"Append Log to Excel","type":"n8n-nodes-base.microsoftExcel","position":[384,832],"parameters":{"options":{},"dataMode":"autoMap","resource":"worksheet","workbook":{"__rl":true,"mode":"list","value":"F1CFEFF06C99E405!s1736a44f46ee4594ac0cca2529c411a8","cachedResultUrl":"https://onedrive.live.com/personal/f1cfeff06c99e405/_layouts/15/doc.aspx?resid=1736a44f-46ee-4594-ac0c-ca2529c411a8&cid=f1cfeff06c99e405","cachedResultName":"Contoh Excel N8N"},"operation":"append","worksheet":{"__rl":true,"mode":"list","value":"{82742EB8-C5C4-7049-B489-EC3070316882}","cachedResultUrl":"https://onedrive.live.com/personal/f1cfeff06c99e405/_layouts/15/doc.aspx?resid=1736a44f-46ee-4594-ac0c-ca2529c411a8&cid=f1cfeff06c99e405&activeCell=Audit_Log!A1","cachedResultName":"Audit_Log"}},"credentials":{"microsoftExcelOAuth2Api":{"id":"credential-id","name":"Microsoft Excel account"}},"typeVersion":2.2},{"id":"0f3f7587-3db5-4bf8-a1a9-6999b69b4f28","name":"Append Log to Sheet","type":"n8n-nodes-base.googleSheets","position":[384,992],"parameters":{"columns":{"value":{},"schema":[{"id":"No","type":"string","display":true,"required":false,"displayName":"No","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Timestamp","type":"string","display":true,"required":false,"displayName":"Timestamp","defaultMatch":false,"canBeUsedToMatch":true},{"id":"ChangeType","type":"string","display":true,"required":false,"displayName":"ChangeType","defaultMatch":false,"canBeUsedToMatch":true},{"id":"RowID","type":"string","display":true,"required":false,"displayName":"RowID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Field","type":"string","display":true,"required":false,"displayName":"Field","defaultMatch":false,"canBeUsedToMatch":true},{"id":"OldValue","type":"string","display":true,"required":false,"displayName":"OldValue","defaultMatch":false,"canBeUsedToMatch":true},{"id":"NewValue","type":"string","display":true,"required":false,"displayName":"NewValue","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"autoMapInputData","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1H5P7YgBkyFgOSKZE4CMd8bu4L1b4ki7YSSaCpNMaL9E/edit#gid=0","cachedResultName":"Audit_Log"},"documentId":{"__rl":true,"mode":"list","value":"1H5P7YgBkyFgOSKZE4CMd8bu4L1b4ki7YSSaCpNMaL9E","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1H5P7YgBkyFgOSKZE4CMd8bu4L1b4ki7YSSaCpNMaL9E/edit?usp=drivesdk","cachedResultName":"Contoh n8n"}},"credentials":{"googleSheetsOAuth2Api":{"id":"credential-id","name":"Google Sheets account"}},"typeVersion":4.7},{"id":"f5ed1189-72e8-4c7b-a2d7-27ff4c215b89","name":"Environment Config","type":"n8n-nodes-base.code","position":[512,128],"parameters":{"jsCode":"return [{\n  json: {\n    CONFIG: {\n      idField: \"ID\",\n      ignoreFields: [\"UpdatedAt\", \"LastModified\"],\n      monitorOnly: null, \n      firstRunSilent: true,\n      enableAuditLog: true\n    }\n  }\n}];"},"typeVersion":2},{"id":"ad209afb-740f-47ad-8e76-a08e0e1e1e73","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-128,800],"parameters":{"color":7,"width":704,"height":368,"content":"## Step 4 – Audit Log"},"typeVersion":1},{"id":"c0955ae1-fa4d-4e29-a0eb-1e52806b9e72","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-1568,-592],"parameters":{"width":832,"height":3552,"content":"# Track changes and approvals in Excel 365\n\n## 📌 Overview\n\nThis workflow monitors an Excel 365 sheet every minute and detects new, updated, and deleted rows using a unique ID column. It compares the current dataset with the previous snapshot and identifies field-level differences.\n\nWhen changes are detected, the workflow filters rows that require approval (Status = “Waiting Approval”), sends structured notifications, and optionally logs every field-level change into an audit sheet (Excel or Google Sheets).\n\nThe configuration layer allows you to define the ID column, ignored fields, and audit logging behavior without modifying the comparison logic.\n\nThis template is suitable for approval tracking, operational monitoring, and lightweight compliance logging.\n\n⸻\n\n## 🚀 Features\n\n### ⏱ Scheduled Monitoring\n- Runs automatically every 1 minute\n- Near real-time Excel monitoring\n- Prevents unnecessary execution when no changes are detected\n\n### 🔍 Row-Level Change Detection\n\n### Detects:\n- ✅ New rows\n- ✏️ Updated rows\n- ❌ Deleted rows\n\nUses a unique ID field per row for accurate tracking.\n\n⸻\n\n### 🧠 Field-Level Comparison\n- Compares previous vs current values\n- Identifies exactly which fields changed\n- Outputs structured change data\n- Prevents false positives via data normalization\n\n⸻\n\n## ⚙️ Environment Configuration Layer\n\nCentralized configuration node allows easy customization without modifying core logic.\n\n## Configurable options include:\n- idField\n- ignoreFields\n- monitorOnly\n- firstRunSilent\n- enableAuditLog\n\nNo hardcoded logic required.\n\n⸻\n\n## 🛑 Approval Validation Layer\n- Filters rows where Status = \"Waiting Approval\"\n- Sends notifications only for relevant approval cases\n- Prevents unnecessary alerts\n\n⸻\n\n## 🔔 Smart Notification System\n- Sends formatted change notifications\n- Includes:\n- Change Type (NEW / UPDATED / DELETED)\n- Row ID\n- Field-level old → new values\n\nFully customizable message formatting.\n⸻\n## 📊 Optional Audit Logging\n\nIf enabled in the Environment Config:\n- Converts each field-level change into structured audit rows\n- Appends logs to:\n- Excel 365 (Audit Sheet)\n- Google Sheets (External Log)\n\nAudit Log Structure\n\n| Timestamp | ChangeType | RowID | Field | OldValue | New Value |\n|-------------|--------------|--------|------|----------|------------|\n\nDesigned for compliance and tracking purposes.\n\n## 📦 Use Cases\n- Internal approval tracking\n- Financial data monitoring\n- Sales pipeline control\n- Procurement workflows\n- Excel-based compliance systems\n- SME automation systems\n\n## 🧩 Requirements\n- Microsoft 365 (Excel Online – Business)\n- n8n (Cloud or Self-hosted)\n- Microsoft credentials configured in n8n\n- Telegram Bot\n- (Optional) Google Sheets credentials for audit logging\n\n## 🔧 Configuration Guide\nAll system behavior is controlled from the Environment Config node.\n\nExample configuration structure:\n\n```\n{\n  CONFIG: {\n    idField: \"ID\",\n    ignoreFields: [\"UpdatedAt\", \"LastModified\"],\n    monitorOnly: null,\n    firstRunSilent: true,\n    enableAuditLog: true\n  }\n}\n```\n\nYou can customize:\n- Which column acts as unique ID\n- Which fields to ignore\n- Which fields to monitor exclusively\n- Whether to enable audit logging\n- Whether first run should be silent\n\n## 🟢 First Run Behavior\nOn first execution:\n- The workflow initializes internal snapshot storage\n- No mass notification is sent (if firstRunSilent = true)\n\nThis prevents false “NEW row” alerts during setup.\n## 🏢 Who Is This For?\n- Operations teams\n- Finance departments\n- SMEs using Excel as core system\n- Automation consultants\n- Businesses requiring lightweight audit tracking\n\n⸻\n\n## 💡 Why This Workflow?\n\nUnlike simple Excel polling workflows, this solution:\n- Tracks changes at field level\n- Supports approval-based filtering\n- Includes structured audit logging\n- Avoids duplicate alerts\n- Is fully configurable\n- Designed for production usage\n\nThis is not just an Excel notifier — it is a structured Change Tracking & Approval Monitoring System built on n8n."},"typeVersion":1},{"id":"6d5867c7-9ce0-493d-af68-d4b921f04c39","name":"Notification Approval","type":"n8n-nodes-base.telegram","position":[864,544],"webhookId":"d81f2862-d9d2-4ed1-83e5-c5d10724c69d","parameters":{"text":"=Payment Request Need Approval\n\nRequester :  {{ $json.Requester }}\nKeterangan : {{ $json.Name }}\nNominal : {{ $json.Amount }}","chatId":"123456789","replyMarkup":"inlineKeyboard","inlineKeyboard":{"rows":[{"row":{"buttons":[{"text":"Approve","additionalFields":{"url":"https://n8n.entigi.co.id/webhook-test/2ed56b5e-5307-4b7c-bc17-c70da9814eba?status=1&ID={{ $json.ID }}"}},{"text":"Reject","additionalFields":{"url":"=https://n8n.entigi.co.id/webhook-test/2ed56b5e-5307-4b7c-bc17-c70da9814eba?status=2&ID={{ $json.ID }}"}}]}}]},"additionalFields":{}},"credentials":{"telegramApi":{"id":"credential-id","name":"EngineN8N"}},"typeVersion":1.2},{"id":"bb0e40aa-f1cb-4d05-a858-fc3431e77f66","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[592,464],"parameters":{"color":7,"width":496,"height":272,"content":" ## Step 3 Approval\n"},"typeVersion":1},{"id":"d02a76ce-a5ca-4a3d-bae4-eb1909316a4a","name":"Run every 1 minute","type":"n8n-nodes-base.scheduleTrigger","position":[-96,128],"parameters":{"rule":{"interval":[{"field":"minutes","minutesInterval":1}]}},"typeVersion":1.3},{"id":"36fa3e89-7789-4562-9c1a-abf13e222da6","name":"Check if changes exist","type":"n8n-nodes-base.if","position":[-96,560],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"a79d003d-7f26-41d5-b722-aec295b87f31","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.hasChanges }}","rightValue":false}]}},"typeVersion":2.2},{"id":"97834431-1892-4201-9fef-3807fb020835","name":"Check if audit logging is enabled","type":"n8n-nodes-base.switch","position":[-96,896],"parameters":{"rules":{"values":[{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"36f6286b-c585-495a-b282-c4bf3cad1c5f","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $('Environment Config').item.json.CONFIG.enableAuditLog }}","rightValue":"true"}]}}]},"options":{}},"typeVersion":3.3},{"id":"949e7846-c8a3-46fd-9ed0-f459ec5c6398","name":"Compare previous and current snapshot","type":"n8n-nodes-base.code","position":[720,128],"parameters":{"jsCode":"// 1. Gunakan sintaks baru untuk Static Data\nconst staticData = $getWorkflowStaticData('global');\n\nif (!staticData.previousData) {\n  staticData.previousData = {};\n}\n\n// 2. Ambil data input menggunakan $input.all()\n//const inputItems = $input.all();\nconst inputItems = $('Get rows').all();\n\n\n// Convert current data to object keyed by ID\nconst currentData = {};\nfor (const item of inputItems) {\n  // Pastikan field 'ID' ada di data kamu\n  if (item.json.ID) {\n    currentData[item.json.ID] = item.json;\n  }\n}\n\nconst changes = [];\n\n// Detect New and Updated rows\nfor (const id in currentData) {\n  const currentRow = currentData[id];\n  const previousRow = staticData.previousData[id];\n\n  if (!previousRow) {  \n    const newFields = [];\n\n    for (const key in currentRow) {\n      newFields.push({\n        source: currentRow,\n        field: key,\n        old: null,\n        new: currentRow[key]\n      });\n    }\n    \n    changes.push({\n      type: \"NEW\",\n      id,\n      changes: newFields\n    });\n    continue;\n  }\n\n  const rowChanges = [];\n  let hasChanged = false;\n  const config = $input.first().json.CONFIG;\n  \n  for (const key in currentRow) {\n    \n    if (key === config.idField) continue;\n    if (config.ignoreFields.includes(key)) continue;\n    if (config.monitorOnly && !config.monitorOnly.includes(key)) continue;\n    \n    if (JSON.stringify(currentRow[key]) !== JSON.stringify(previousRow[key])) {\n      rowChanges.push({\n        source: currentRow,\n        field: key,\n        old: previousRow[key],\n        new: currentRow[key]\n      });\n      hasChanged = true;\n    }\n  }\n  \n  if (hasChanged) {\n    changes.push({\n      type: \"UPDATED\",\n      id,\n      changes: rowChanges\n    });\n  }\n  \n}\n\n// Detect Deleted rows\nfor (const id in staticData.previousData) {\n  if (!currentData[id]) {\n    changes.push({\n      type: \"DELETED\",\n      id\n    });\n  }\n}\n\n// 3. Simpan snapshot untuk run berikutnya\nstaticData.previousData = currentData;\n\n// Kembalikan hasil sebagai array item n8n\nreturn [{\n  json: {\n    hasChanges: changes.length > 0,\n    totalChanges: changes.length,\n    changes\n  }\n}];\n"},"typeVersion":2},{"id":"c78ddfa5-c614-4f68-bb49-ce4f9d57b6bd","name":"Transform changes for notification","type":"n8n-nodes-base.code","position":[176,432],"parameters":{"jsCode":"let message = \"📊 Excel Update Detected\\n\\n\";\nlet sendMessage = false;\nfor (const change of $json.changes) {\n\n  if (change.type === \"NEW\") {\n    message += `🆕 New Row Added (ID: ${change.id})\\n`;\n    \n    if (Array.isArray(change.changes)) {\n      for (const fieldChange of change.changes) {\n        message += `- ${fieldChange.field}: ${fieldChange.new}\\n`;\n      }\n    }\n    sendMessage=true;\n    message += \"\\n\";\n  }\n\n  if (change.type === \"UPDATED\") {\n    message += `✏️ Row Updated (ID: ${change.id})\\n`;\n\n    if (Array.isArray(change.changes)) {\n      for (const fieldChange of change.changes) {\n        message += `- ${fieldChange.field}: ${fieldChange.old} → ${fieldChange.new}\\n`;\n      }\n    }\n\n    message += \"\\n\";\n    sendMessage=true;\n  }\n\n  if (change.type === \"DELETED\") {\n    message += `❌ Row Deleted (ID: ${change.id})\\n\\n`;\n    sendMessage=true;\n  }\n}\n\nreturn [{\n  json: {\n    message,\n    sendMessage\n  }\n}];"},"typeVersion":2},{"id":"c467f737-037f-4e4b-9a07-7b7e31244b52","name":"Build audit log rows","type":"n8n-nodes-base.code","position":[144,896],"parameters":{"jsCode":"const auditRows = [];\nfor (const change of $json.changes) {\n  if (change.type === \"DELETED\") {\n    auditRows.push({\n      Timestamp: new Date().toISOString(),\n      ChangeType: \"DELETED\",\n      RowID: change.id,\n      Field: null,\n      OldValue: null,\n      NewValue: null\n    });\n    continue;\n  }\n\n  for (const fieldChange of change.changes) {\n    auditRows.push({\n      Timestamp: new Date().toISOString(),\n      ChangeType: change.type,\n      RowID: change.id,\n      Field: fieldChange.field,\n      OldValue: fieldChange.old ?? null,\n      NewValue: fieldChange.new ?? null\n    });\n  }\n}\n\nreturn auditRows.map(r => ({ json: r }));"},"typeVersion":2},{"id":"4ccfc3ae-f8de-4eb2-afd1-d46b52a6d2a2","name":"Filter rows with waiting approval","type":"n8n-nodes-base.code","position":[672,544],"parameters":{"jsCode":"// check apakah ada yang waiting approval\nlet change_message = [];\nfor (const change of $json.changes) {\n  for (const fieldChange of change.changes) {\n    if(fieldChange.field=='Status' && fieldChange.new == 'Waiting Approval'){\n      change_message.push(fieldChange.source); \n    }\n  }\n}\n\n// Kembalikan setiap item di dalam 'changes' sebagai item n8n yang terpisah\nreturn change_message.map(change => {\n  return {\n    // json: change\n    json : change\n  };\n});\n"},"typeVersion":2,"alwaysOutputData":true},{"id":"28a56211-bfc7-49bc-b431-a4bb0fab7e30","name":"Send notification","type":"n8n-nodes-base.telegram","position":[384,432],"webhookId":"36eaa985-037c-44a4-9c6f-7891ecf6fa31","parameters":{"text":"={{ $json.message }}","chatId":"123456789","forceReply":{},"replyMarkup":"forceReply","additionalFields":{}},"credentials":{"telegramApi":{"id":"credential-id","name":"EngineN8N"}},"typeVersion":1.2},{"id":"c8c5eb0f-d58a-47c6-898f-fe462713a0be","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-720,-592],"parameters":{"color":3,"width":576,"height":384,"content":"## How it works\n1. Runs every minute using a schedule trigger\n2. Reads rows from Excel 365\n3. Normalizes and stores a snapshot\n4. Compares with the previous state\n5. Detects new, updated, and deleted rows\n6. Filters rows with “Waiting Approval” status\n7. Sends structured notifications\n8. Logs changes if audit logging is enabled\n"},"typeVersion":1},{"id":"f7606576-0cec-4113-90e0-6c76c259d904","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[-720,-176],"parameters":{"color":5,"width":560,"height":288,"content":"## Setup steps\n1. Configure Microsoft Excel credentials\n2. Ensure your sheet contains a unique ID column\n3. Update the Environment Config node\n4.(Optional) Configure Google Sheets credentials for audit logging\n5. Activate the workflow"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"19874e82-7560-42af-b0c1-9fa47f43cbeb","connections":{"Get rows":{"main":[[{"node":"Normalize Data","type":"main","index":0}]]},"Normalize Data":{"main":[[{"node":"Environment Config","type":"main","index":0}]]},"Send notification":{"main":[[]]},"Environment Config":{"main":[[{"node":"Compare previous and current snapshot","type":"main","index":0}]]},"Run every 1 minute":{"main":[[{"node":"Get rows","type":"main","index":0}]]},"Build audit log rows":{"main":[[{"node":"Append Log to Excel","type":"main","index":0},{"node":"Append Log to Sheet","type":"main","index":0}]]},"Check if changes exist":{"main":[[{"node":"Transform changes for notification","type":"main","index":0},{"node":"Check if audit logging is enabled","type":"main","index":0},{"node":"Filter rows with waiting approval","type":"main","index":0}]]},"Check if audit logging is enabled":{"main":[[{"node":"Build audit log rows","type":"main","index":0}]]},"Filter rows with waiting approval":{"main":[[{"node":"Notification Approval","type":"main","index":0}]]},"Transform changes for notification":{"main":[[{"node":"Send notification","type":"main","index":0}]]},"Compare previous and current snapshot":{"main":[[{"node":"Check if changes exist","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":21,"nodeTypes":{"n8n-nodes-base.if":{"count":1},"n8n-nodes-base.code":{"count":6},"n8n-nodes-base.switch":{"count":1},"n8n-nodes-base.telegram":{"count":2},"n8n-nodes-base.stickyNote":{"count":7},"n8n-nodes-base.googleSheets":{"count":1},"n8n-nodes-base.microsoftExcel":{"count":2},"n8n-nodes-base.scheduleTrigger":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Ramdoni","username":"ramdoni","bio":"Automation engineer and backend developer specializing in workflow automation, API integrations, and scalable backend systems.\n\nI build practical automation solutions using n8n, focusing on real-world business use cases such as data processing, notifications, reporting, and approval workflows. My background in PHP, Laravel, and system architecture allows me to design workflows that are reliable, maintainable, and production-ready.","verified":true,"links":["https://www.linkedin.com/in/ram-doni-0554584a/"],"avatar":"https://gravatar.com/avatar/752716fd15bce611db203b00d64b395032b568b162c46f95ac359e5b46c6ada7?r=pg&d=retro&size=200"},"nodes":[{"id":18,"icon":"file:googleSheets.svg","name":"n8n-nodes-base.googleSheets","codex":{"data":{"alias":["CSV","Sheet","Spreadsheet","GS"],"resources":{"generic":[{"url":"https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/","icon":"❤️","label":"Love at first sight: Ricardo’s n8n journey"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/","icon":"⏲","label":"Creating triggers for n8n workflows using polling"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/","icon":"🍔","label":"How Honest Burgers Use Automation to Save $100k per year"},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\",\"output\"]","defaults":{"name":"Google Sheets"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="},"displayName":"Google Sheets","typeVersion":5,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":4,"name":"Productivity"}]},{"id":20,"icon":"fa:map-signs","name":"n8n-nodes-base.if","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.","resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"If","color":"#408000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"If","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":49,"icon":"file:telegram.svg","name":"n8n-nodes-base.telegram","codex":{"data":{"alias":["human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/","icon":"💪","label":"Using Automation to Boost Productivity in the Workplace"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/creating-telegram-bots-with-n8n-a-no-code-platform/","icon":"💬","label":"Creating Telegram Bots with n8n, a No-Code Platform"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.telegram/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/telegram/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"output\"]","defaults":{"name":"Telegram"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNjYgNjYiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzM3YWVlMiIgZD0iTTAgMzJjMCAxNy42NzMgMTQuMzI3IDMyIDMyIDMyczMyLTE0LjMyNyAzMi0zMlM0OS42NzMgMCAzMiAwIDAgMTQuMzI3IDAgMzIiLz48cGF0aCBmaWxsPSIjYzhkYWVhIiBkPSJtMjEuNjYxIDM0LjMzOCAzLjc5NyAxMC41MDhzLjQ3NS45ODMuOTgzLjk4MyA4LjA2OC03Ljg2NCA4LjA2OC03Ljg2NGw4LjQwNy0xNi4yMzctMjEuMTE5IDkuODk4eiIvPjxwYXRoIGZpbGw9IiNhOWM2ZDgiIGQ9Im0yNi42OTUgMzcuMDM0LS43MjkgNy43NDZzLS4zMDUgMi4zNzMgMi4wNjggMGw0LjY0NC00LjIwMyIvPjxwYXRoIGQ9Im0yMS43MyAzNC43MTItNy44MDktMi41NDVzLS45MzItLjM3OC0uNjMzLTEuMjM3Yy4wNjItLjE3Ny4xODYtLjMyOC41NTktLjU4OCAxLjczMS0xLjIwNiAzMi4wMjgtMTIuMDk2IDMyLjAyOC0xMi4wOTZzLjg1Ni0uMjg4IDEuMzYxLS4wOTdjLjIzMS4wODguMzc4LjE4Ny41MDMuNTQ4LjA0NS4xMzIuMDcxLjQxMS4wNjguNjg5LS4wMDMuMjAxLS4wMjcuMzg2LS4wNDUuNjc4LS4xODQgMi45NzgtNS43MDYgMjUuMTk4LTUuNzA2IDI1LjE5OHMtLjMzIDEuMy0xLjUxNCAxLjM0NWMtLjQzMi4wMTYtLjk1Ni0uMDcxLTEuNTgyLS42MS0yLjMyMy0xLjk5OC0xMC4zNTItNy4zOTQtMTIuMTI2LTguNThhLjM0LjM0IDAgMCAxLS4xNDYtLjIzOWMtLjAyNS0uMTI1LjEwOC0uMjguMTA4LS4yOHMxMy45OC0xMi40MjcgMTQuMzUyLTEzLjczMWMuMDI5LS4xMDEtLjA3OS0uMTUxLS4yMjYtLjEwNy0uOTI5LjM0Mi0xNy4wMjUgMTAuNTA2LTE4LjgwMSAxMS42MjktLjEwNC4wNjYtLjM5NS4wMjMtLjM5NS4wMjMiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Telegram","typeVersion":1,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":112,"icon":"fa:map-signs","name":"n8n-nodes-base.switch","codex":{"data":{"alias":["Router","If","Path","Filter","Condition","Logic","Branch","Case"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.switch/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"Switch","color":"#506000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"Switch","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":322,"icon":"file:excel.svg","name":"n8n-nodes-base.microsoftExcel","codex":{"data":{"alias":["_Excel","Excel","Sheet","CSV","Spreadsheet"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.microsoftexcel/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/microsoft/"}]},"categories":["Data & Storage","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Microsoft Excel 365"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0iIzAyNzIzQiIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik00My4xIDIwLjIyN2g5LjUxMnY0LjY5MmgtOS41MTN6bTAtNy4wMzRoOS41MTJ2NC42OWgtOS41MTN6bTAgMTQuMjI3aDkuNTEydjQuNjkxaC05LjUxM3ptMCA3LjAzNmg5LjUxMnY0LjY5MWgtOS41MTN6Ii8+PHBhdGggZD0iTTQzLjEgNDEuNjQ5aDkuNTEydjQuNjloLTkuNTEzek01OC4wNyA2Ljc4SDM1LjE0NlYuMzdMLjM3IDYuNDY3djQ3LjIybDM0Ljc3NiA1Ljk0MnYtNy4xODZINTguMDdjLjkzNSAwIDEuNTU5LS43ODEgMS41NTktMS41NTVWOC4zNDRjMC0uNzgxLS42MjQtMS41NTUtMS41Ni0xLjU1NVY2Ljc4ek0yMC4wMTggNDAuNTU0bC0zLjI3NC04LjU5M2gtLjE0OGMwIC4xNDktMy4yNzUgOC4xMy0zLjI3NSA4LjEzbC00LjM2Ni0uMzEyTDE0LjEgMjkuNjE2IDkuNDIyIDE5LjQ1M2w0LjM2Ny0uMzEyIDIuOTYzIDcuOTc0aC4xNDhjMC0uMTQ4IDMuMjc0LTguMjg3IDMuMjc0LTguMjg3bDQuNTIyLS4zMTItNS40NTcgMTEuMTAxIDUuNjE0IDExLjEwMi00LjgzNC0uMTQ5ek01Ny42IDUwLjcxN0gzNS4xNDZ2LTQuMzdoNS40NTh2LTQuNjkxaC01LjQ1OHYtMi4zNTJoNS40NTh2LTQuNjloLTUuNDU4di0yLjM0N2g1LjQ1OHYtNC42OWgtNS40NThWMjUuMjNoNS40NTh2LTQuNjloLTUuNDU4di0yLjM0NWg1LjQ1OHYtNC42OTJoLTUuNDU4di00LjY5aDIyLjQ1NnY0MS45MDNoLS4wMDF6Ii8+PHBhdGggZD0iTTQyLjcyOSAxOS44NTdoOS41MTJ2NC42OTFINDIuNzN6bTAtNy4wMzVoOS41MTJ2NC42OTFINDIuNzN6bTAgMTQuMjI4aDkuNTEydjQuNjlINDIuNzN6bTAgNy4wMzZoOS41MTJ2NC42OTFINDIuNzN6Ii8+PHBhdGggZD0iTTQyLjcyOSA0MS4yNzloOS41MTJ2NC42OUg0Mi43M3pNNTcuNjk5IDYuNDFIMzQuNzc2VjBMMCA2LjA5OHY0Ny4yMmwzNC43NzYgNS45NDF2LTcuMTg1aDIyLjkyM2MuOTM2IDAgMS41Ni0uNzgxIDEuNTYtMS41NTVWNy45NzRjMC0uNzgxLS42MjQtMS41NTUtMS41Ni0xLjU1NXpNMTkuNjQ3IDQwLjE4NGwtMy4yNzQtOC41OTNoLS4xNDhjMCAuMTQ4LTMuMjc0IDguMTMtMy4yNzQgOC4xM2wtNC4zNjctLjMxMiA1LjE0Ni0xMC4xNjMtNC42NzgtMTAuMTYzIDQuMzY3LS4zMTMgMi45NjIgNy45NzRoLjE0OWMwLS4xNDggMy4yNzQtOC4yODYgMy4yNzQtOC4yODZsNC41MjItLjMxMy01LjQ1OCAxMS4xMDIgNS42MTUgMTEuMTAxLTQuODM0LS4xNDh6TTU3LjIzIDUwLjM0N0gzNC43NzZ2LTQuMzdoNS40NTd2LTQuNjkyaC01LjQ1N3YtMi4zNTJoNS40NTd2LTQuNjloLTUuNDU3di0yLjM0N2g1LjQ1N3YtNC42OWgtNS40NTdWMjQuODZoNS40NTd2LTQuNjloLTUuNDU3di0yLjM0Nmg1LjQ1N3YtNC42OTJoLTUuNDU3di00LjY5aDIyLjQ1NnY0MS45MDR6Ii8+PC9nPjwvc3ZnPg=="},"displayName":"Microsoft Excel 365","typeVersion":2,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":4,"name":"Productivity"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":839,"icon":"fa:clock","name":"n8n-nodes-base.scheduleTrigger","codex":{"data":{"alias":["Time","Scheduler","Polling","Cron","Interval"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\",\"schedule\"]","defaults":{"name":"Schedule Trigger","color":"#31C49F"},"iconData":{"icon":"clock","type":"icon"},"displayName":"Schedule Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":35,"name":"Document Extraction"},{"id":49,"name":"AI Summarization"}],"image":[]}}