Task: n8n workflow backup management with Dropbox and Airtable

n8n workflow JSON:
{"id":"48","name":"Workflow management","nodes":[{"name":"On clicking 'execute'","type":"n8n-nodes-base.manualTrigger","position":[240,300],"parameters":{},"typeVersion":1},{"name":"Function","type":"n8n-nodes-base.function","position":[570,300],"parameters":{"functionCode":"//console.log(items[0].json.data);\nlet data = items[0].json.data;\nitems = data.map(i => {\n//  console.log({json:i});\n  return {json:i};\n});\n//console.log(items);\nreturn items;"},"typeVersion":1},{"name":"SplitInBatches","type":"n8n-nodes-base.splitInBatches","position":[760,300],"parameters":{"options":{},"batchSize":1},"typeVersion":1},{"name":"IF","type":"n8n-nodes-base.if","position":[2090,570],"parameters":{"conditions":{"boolean":[{"value1":"={{$node[\"SplitInBatches\"].context[\"noItemsLeft\"]}}","value2":true}]}},"typeVersion":1},{"name":"NoOp","type":"n8n-nodes-base.noOp","position":[2270,550],"parameters":{},"typeVersion":1},{"name":"Airtable","type":"n8n-nodes-base.airtable","position":[1100,200],"parameters":{"table":"Workflows","operation":"list","application":"<YOUR_APP_ID>","additionalOptions":{"fields":[],"filterByFormula":"=workflowId={{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}"}},"credentials":{"airtableApi":"n8n management demo"},"typeVersion":1,"alwaysOutputData":true},{"name":"Airtable1","type":"n8n-nodes-base.airtable","position":[1750,130],"parameters":{"id":"={{$node[\"Airtable\"].json[\"id\"]}}","table":"Workflows","options":{"typecast":true},"operation":"update","application":"<YOUR_APP_ID>"},"credentials":{"airtableApi":"n8n management demo"},"typeVersion":1},{"name":"Airtable2","type":"n8n-nodes-base.airtable","position":[1750,320],"parameters":{"table":"Workflows","options":{"typecast":true},"operation":"append","application":"<YOUR_APP_ID>"},"credentials":{"airtableApi":"n8n management demo"},"typeVersion":1},{"name":"Set","type":"n8n-nodes-base.set","position":[1590,130],"parameters":{"values":{"string":[{"name":"workflowId","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}"},{"name":"name","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"name\"]}}"},{"name":"errorWorkflowId","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"errorWorkflow\"]}}"},{"name":"createdAt","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"createdAt\"]}}"},{"name":"updatedAt","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"updatedAt\"]}}"},{"name":"nodes","value":"={{$node[\"Prepare data\"].json[\"fields\"][\"nodes\"]}}"},{"name":"timezone","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"timezone\"]}}"},{"name":"CRON_details","value":"={{$node[\"Prepare data\"].json[\"fields\"][\"CRON_details\"]}}"},{"name":"rawData","value":"={{$node[\"Prepare data\"].json[\"fields\"][\"rawData\"]}}"}],"boolean":[{"name":"isActive","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"active\"]}}"},{"name":"isCRON","value":"={{$node[\"Prepare data\"].json[\"fields\"][\"isCRON\"]}}"},{"name":"saveManualExecutions","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"saveManualExecutions\"]}}"},{"name":"isTrigger","value":"={{$node[\"Prepare data\"].json[\"fields\"][\"isTrigger\"]}}"}]},"options":{},"keepOnlySet":true},"typeVersion":1},{"name":"Set1","type":"n8n-nodes-base.set","position":[1590,320],"parameters":{"values":{"string":[{"name":"workflowId","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}"},{"name":"name","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"name\"]}}"},{"name":"errorWorkflowId","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"errorWorkflow\"]}}"},{"name":"createdAt","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"createdAt\"]}}"},{"name":"updatedAt","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"updatedAt\"]}}"},{"name":"nodes","value":"={{$node[\"Prepare data1\"].json[\"fields\"][\"nodes\"]}}"},{"name":"timezone","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"timezone\"]}}"},{"name":"CRON_details","value":"={{$node[\"Prepare data1\"].json[\"fields\"][\"CRON_details\"]}}"},{"name":"rawData","value":"={{$node[\"Prepare data1\"].json[\"fields\"][\"rawData\"]}}"}],"boolean":[{"name":"isActive","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"active\"]}}"},{"name":"isCRON","value":"={{$node[\"Prepare data1\"].json[\"fields\"][\"isCRON\"]}}"},{"name":"saveManualExecutions","value":"={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"saveManualExecutions\"]}}"},{"name":"isTrigger","value":"={{$node[\"Prepare data1\"].json[\"fields\"][\"isTrigger\"]}}"}]},"options":{},"keepOnlySet":true},"typeVersion":1},{"name":"Get All Workflows","type":"n8n-nodes-base.httpRequest","position":[410,300],"parameters":{"url":"http://localhost:5678/rest/workflows","options":{"fullResponse":false},"headerParametersUi":{"parameter":[{"name":"Authorization","value":"<TOKEN>"}]},"allowUnauthorizedCerts":true},"typeVersion":1},{"name":"Prepare data","type":"n8n-nodes-base.function","position":[1430,130],"parameters":{"functionCode":"let data = $node[\"Get Workflow Details\"].json[\"data\"];\nlet file = $node[\"Get file link\"].json[\"link\"];\nlet nodes = new Set(data[\"nodes\"].map(i => i.type));\nlet nodes2 = [...nodes];\n//console.log(...nodes);\nlet data2 = data[\"nodes\"].map(i => i.name);\nif(nodes2.includes('n8n-nodes-base.cron')){\n  console.log('Cron found!');\n//  console.log(data);\n  let cron_node = data[\"nodes\"].filter(i => i.type == 'n8n-nodes-base.cron');\n  //console.log(cron_node[0].parameters.triggerTimes.item);\n  items[0].json[\"fields\"][\"isCRON\"]=true;\n  items[0].json[\"fields\"][\"nodes\"]=[...nodes];\n  items[0].json[\"fields\"][\"CRON_details\"]=cron_node[0].parameters.triggerTimes.item;\n  items[0].json[\"fields\"][\"rawData\"]=[{url:file ,filename: 'workflow_'+data[\"id\"]+'__'+data[\"updatedAt\"]+'.json'}];\n} else {  \n  //console.log('Cron not found!');\n  items[0].json[\"fields\"][\"isCRON\"]=false;\n  items[0].json[\"fields\"][\"nodes\"]=[...nodes];\n  items[0].json[\"fields\"][\"rawData\"]=[{url:file ,filename: 'workflow_'+data[\"id\"]+'__'+data[\"updatedAt\"]+'.json'}];\n}\nif(nodes2.some(i => {\n  let regExp = new RegExp(/n8n-nodes-base\\.[\\w]+Trigger/);\n  if(i=='n8n-nodes-base.webhook'){\n    return true;\n  }\n  if(regExp.test(i)){\n    return true;\n  }\n  return false;\n})){\n  items[0].json[\"fields\"][\"isTrigger\"]=true;  \n} else {\n  items[0].json[\"fields\"][\"isTrigger\"]=false;\n}\n  \n//console.log(items);\nreturn items;\n"},"typeVersion":1},{"name":"Prepare data1","type":"n8n-nodes-base.function","position":[1430,320],"parameters":{"functionCode":"let data = $node[\"Get Workflow Details\"].json[\"data\"];\nlet file = $node[\"Get file link\"].json[\"link\"];\nlet nodes = new Set(data[\"nodes\"].map(i => i.type));\nlet nodes2 = [...nodes];\n//console.log(data);\nlet data2 = data[\"nodes\"].map(i => i.name);\nif(nodes2.includes('n8n-nodes-base.cron')){\n  //console.log('Cron found!');\n  let cron_node = data[\"nodes\"].filter(i => i.type == 'n8n-nodes-base.cron');\n  items[0].json={\n    fields:{\n      isCRON:true,\n      nodes:[...nodes],\n      CRON_details:cron_node[0].parameters.triggerTimes.item,\n      rawData:[{url:file ,filename: 'workflow_'+data[\"id\"]+'__'+data[\"updatedAt\"]+'.json'}]\n    }\n  };\n} else {  \n  //console.log('Cron not found!');\n  items[0].json={\n    fields:{\n      isCRON:false,\n      nodes:[...nodes],\n      rawData:[{url:file ,filename: 'workflow_'+data[\"id\"]+'__'+data[\"updatedAt\"]+'.json'}]\n    }\n  };\n}\nif(nodes2.some(i => {\n  let regExp = new RegExp(/n8n-nodes-base\\.[\\w]+Trigger/);\n  if(i=='n8n-nodes-base.webhook'){\n    return true;\n  }\n  if(regExp.test(i)){\n    return true;\n  }\n  return false;\n})){\n  items[0].json[\"fields\"][\"isTrigger\"]=true;  \n} else {\n  items[0].json[\"fields\"][\"isTrigger\"]=false;\n}\n//console.log(items);\nreturn items;\n\n"},"typeVersion":1},{"name":"Cron","type":"n8n-nodes-base.cron","position":[250,510],"parameters":{"triggerTimes":{"item":[{"mode":"everyHour","minute":15},{"mode":"everyHour","minute":45}]}},"typeVersion":1},{"name":"Move Binary Data","type":"n8n-nodes-base.moveBinaryData","position":[1000,-10],"parameters":{"mode":"jsonToBinary","options":{"keepSource":true}},"typeVersion":1},{"name":"Dropbox","type":"n8n-nodes-base.dropbox","position":[1140,-10],"parameters":{"path":"=/workflows/workflow_{{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}/workflow_{{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}__{{$node[\"Get Workflow Details\"].json[\"data\"][\"updatedAt\"]}}.json","binaryData":true},"credentials":{"dropboxApi":"My n8n backups"},"typeVersion":1},{"name":"Get Workflow Details","type":"n8n-nodes-base.httpRequest","position":[840,-10],"parameters":{"url":"=http://localhost:5678/rest/workflows/{{$node[\"SplitInBatches\"].json[\"id\"]}}","options":{},"headerParametersUi":{"parameter":[{"name":"Authorization","value":"<TOKEN>"}]},"allowUnauthorizedCerts":true},"typeVersion":1},{"name":"Get file link","type":"n8n-nodes-base.httpRequest","position":[1290,-10],"parameters":{"url":"https://api.dropboxapi.com/2/files/get_temporary_link","options":{},"requestMethod":"POST","bodyParametersUi":{"parameter":[{"name":"path","value":"={{$node[\"Dropbox\"].json[\"path_lower\"]}}"}]},"headerParametersUi":{"parameter":[{"name":"Authorization","value":"<TOKEN>"}]}},"typeVersion":1,"continueOnFail":true,"alwaysOutputData":true},{"name":"IF Airtable record exists?","type":"n8n-nodes-base.if","position":[1270,200],"parameters":{"conditions":{"boolean":[{"value1":"={{$node[\"Airtable\"].json[\"id\"] != \"\" && $node[\"Airtable\"].json[\"id\"] != null && $node[\"Airtable\"].json[\"id\"] != undefined}}","value2":true}]}},"typeVersion":1}],"active":true,"settings":{"errorWorkflow":"5"},"connections":{"IF":{"main":[[{"node":"NoOp","type":"main","index":0}],[{"node":"SplitInBatches","type":"main","index":0}]]},"Set":{"main":[[{"node":"Airtable1","type":"main","index":0}]]},"Cron":{"main":[[{"node":"Get All Workflows","type":"main","index":0}]]},"Set1":{"main":[[{"node":"Airtable2","type":"main","index":0}]]},"Dropbox":{"main":[[{"node":"Get file link","type":"main","index":0}]]},"Airtable":{"main":[[{"node":"IF Airtable record exists?","type":"main","index":0}]]},"Function":{"main":[[{"node":"SplitInBatches","type":"main","index":0}]]},"Airtable1":{"main":[[{"node":"IF","type":"main","index":0}]]},"Airtable2":{"main":[[{"node":"IF","type":"main","index":0}]]},"Prepare data":{"main":[[{"node":"Set","type":"main","index":0}]]},"Get file link":{"main":[[{"node":"Airtable","type":"main","index":0}]]},"Prepare data1":{"main":[[{"node":"Set1","type":"main","index":0}]]},"SplitInBatches":{"main":[[{"node":"Get Workflow Details","type":"main","index":0}]]},"Move Binary Data":{"main":[[{"node":"Dropbox","type":"main","index":0}]]},"Get All Workflows":{"main":[[{"node":"Function","type":"main","index":0}]]},"Get Workflow Details":{"main":[[{"node":"Move Binary Data","type":"main","index":0}]]},"On clicking 'execute'":{"main":[[{"node":"Get All Workflows","type":"main","index":0}]]},"IF Airtable record exists?":{"main":[[{"node":"Prepare data","type":"main","index":0}],[{"node":"Prepare data1","type":"main","index":0}]]}}}