Workflow n8n

Automatisation Airtable avec n8n : gestion de workflows simplifiée

Ce workflow n8n a pour objectif de faciliter la gestion des workflows en intégrant Airtable. Il est particulièrement utile pour les équipes qui souhaitent automatiser le suivi et la mise à jour de leurs projets. Grâce à cette automatisation n8n, les utilisateurs peuvent déclencher des actions spécifiques en fonction de l'état des enregistrements dans Airtable, ce qui permet d'économiser du temps et d'éviter les erreurs manuelles. Le processus commence par un déclencheur manuel qui active le workflow. Ensuite, une série de fonctions et de vérifications conditionnelles sont mises en place pour traiter les données. Par exemple, le nœud 'SplitInBatches' permet de gérer les données par lots, tandis que les nœuds 'IF' vérifient si des enregistrements existent déjà dans Airtable. En fonction des résultats, le workflow peut soit mettre à jour des enregistrements existants, soit en créer de nouveaux. Les nœuds 'Get All Workflows' et 'Get Workflow Details' sont utilisés pour récupérer des informations pertinentes sur les workflows en cours, garantissant ainsi que toutes les données sont à jour. Les bénéfices pour les entreprises sont significatifs : ce workflow réduit le temps passé sur des tâches répétitives, améliore la précision des données et permet une meilleure collaboration au sein des équipes. En intégrant Airtable avec n8n, les utilisateurs peuvent se concentrer sur des tâches à plus forte valeur ajoutée, tout en ayant la certitude que leurs données sont gérées de manière efficace. Tags clés : automatisation, Airtable, workflow.

Catégorie: Manual · Tags: automatisation, Airtable, workflow, n8n, gestion de projets0

Vue d'ensemble du workflow n8n

Schéma des nœuds et connexions de ce workflow n8n, généré à partir du JSON n8n.

Détail des nœuds du workflow n8n

  • On clicking 'execute'

    Déclenche le workflow manuellement lorsque l'utilisateur clique sur 'exécuter'.

  • Function

    Exécute un code JavaScript personnalisé pour traiter des données.

  • SplitInBatches

    Divise les données en plusieurs lots selon la taille spécifiée.

  • IF

    Évalue des conditions pour déterminer le chemin à suivre dans le workflow.

  • NoOp

    N'effectue aucune action, servant de point de passage dans le workflow.

  • Airtable

    Interagit avec une table Airtable pour effectuer l'opération spécifiée.

  • Airtable1

    Effectue une opération sur un enregistrement spécifique dans Airtable.

  • Airtable2

    Effectue une opération sur une table Airtable avec des options spécifiées.

  • Set

    Définit des valeurs dans le contexte du workflow selon les options fournies.

  • Set1

    Définit d'autres valeurs dans le contexte du workflow, en fonction des options.

  • Get All Workflows

    Effectue une requête HTTP pour récupérer tous les workflows.

  • Prepare data

    Prépare des données en exécutant un code JavaScript personnalisé.

  • Prepare data1

    Prépare d'autres données en exécutant un code JavaScript personnalisé.

  • Cron

    Déclenche le workflow à des intervalles réguliers selon les horaires spécifiés.

  • Move Binary Data

    Déplace des données binaires selon le mode et les options spécifiés.

  • Dropbox

    Interagit avec Dropbox pour gérer des fichiers à un chemin donné.

  • Get Workflow Details

    Effectue une requête HTTP pour obtenir les détails d'un workflow.

  • Get file link

    Effectue une requête HTTP pour obtenir un lien vers un fichier.

  • IF Airtable record exists?

    Évalue si un enregistrement existe dans Airtable selon les conditions spécifiées.

Inscris-toi pour voir l'intégralité du workflow

Inscription gratuite

S'inscrire gratuitementBesoin d'aide ?
{
  "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
          }
        ]
      ]
    }
  }
}

Pour qui est ce workflow ?

Ce workflow s'adresse aux équipes de projet, aux responsables de la gestion des workflows et aux entreprises qui utilisent Airtable pour la gestion de leurs données. Il est conçu pour des utilisateurs ayant un niveau technique intermédiaire, souhaitant optimiser leurs processus internes.

Problème résolu

Ce workflow résout le problème de la gestion manuelle des données dans Airtable, qui peut être source d'erreurs et de pertes de temps. En automatisant les mises à jour et les vérifications d'enregistrements, les utilisateurs évitent les doublons et assurent que les informations sont toujours à jour. Le résultat est une gestion plus fluide et efficace des projets, avec moins de stress lié à la saisie manuelle des données.

Étapes du workflow

Étape 1 : Le workflow est déclenché manuellement. Étape 2 : Les données sont traitées par le nœud 'Function' pour préparer les informations nécessaires. Étape 3 : Les données sont ensuite divisées en lots grâce au nœud 'SplitInBatches'. Étape 4 : Des vérifications sont effectuées pour déterminer si des enregistrements existent déjà dans Airtable. Étape 5 : En fonction des résultats, le workflow met à jour ou crée de nouveaux enregistrements dans Airtable. Étape 6 : Les informations sur les workflows en cours sont récupérées pour garantir la mise à jour des données.

Guide de personnalisation du workflow n8n

Pour personnaliser ce workflow, vous pouvez modifier le nœud 'Function' pour adapter le traitement des données selon vos besoins spécifiques. Assurez-vous également de mettre à jour les paramètres des nœuds Airtable, tels que le nom de la table et les opérations souhaitées. Si vous souhaitez intégrer d'autres outils, vous pouvez ajouter des nœuds supplémentaires pour enrichir le flux. Pensez à sécuriser le workflow en vérifiant les autorisations d'accès aux données dans Airtable et en configurant les options de monitoring pour suivre les performances du flux.