Workflow n8n

Automatisation n8n : gestion des requêtes avec Google Sheets

Ce workflow n8n a pour objectif d'automatiser la gestion des requêtes en utilisant Google Sheets. Dans un contexte où les entreprises doivent gérer un volume croissant de demandes, cette automatisation permet de simplifier le processus de collecte et de traitement des informations. Par exemple, les équipes de support ou de vente peuvent bénéficier d'une gestion efficace des requêtes, réduisant ainsi le temps de réponse et améliorant la satisfaction client. Le workflow commence par un déclencheur planifié qui active le processus à intervalles réguliers. Ensuite, il utilise un nœud HTTP pour obtenir un jeton d'authentification, essentiel pour interagir avec l'API de Google Sheets. Une fois le jeton récupéré, le workflow vérifie les requêtes non traitées à l'aide d'un code JavaScript, puis les envoie à Google Sheets via un autre nœud HTTP. Des nœuds supplémentaires permettent de stocker le jeton d'authentification et de suivre les dernières requêtes traitées. En intégrant des notes autocollantes, ce workflow offre une visualisation claire des étapes et des données. Les bénéfices business incluent une réduction significative des erreurs humaines, une meilleure traçabilité des requêtes et une optimisation du temps de travail des équipes, ce qui se traduit par une augmentation de la productivité et une amélioration de la qualité du service. Tags clés : automatisation, Google Sheets, workflow.

Catégorie: Scheduled · Tags: automatisation, Google Sheets, workflow, n8n, gestion des requêtes0

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

  • Schedule Trigger

    Ce noeud déclenche le workflow selon un calendrier défini.

  • Get Auth Token

    Ce noeud envoie une requête HTTP pour obtenir un jeton d'authentification.

  • Unprocessed Requests

    Ce noeud exécute un code JavaScript pour traiter les requêtes non traitées.

  • Get Latest Requests

    Ce noeud effectue une requête HTTP pour récupérer les dernières requêtes.

  • POST to n8n

    Ce noeud envoie une requête HTTP POST à n8n avec des données spécifiques.

  • Merge

    Ce noeud fusionne les données provenant de plusieurs sources selon un mode spécifié.

  • Local Webhook Address

    Ce noeud définit une adresse webhook locale pour recevoir des données.

  • Latest Update Time

    Ce noeud exécute un code JavaScript pour déterminer le temps de la dernière mise à jour.

  • Sticky Note

    Ce noeud crée une note autocollante avec un contenu spécifié.

  • Sticky Note1

    Ce noeud crée une deuxième note autocollante avec un contenu donné.

  • Sticky Note2

    Ce noeud crée une troisième note autocollante avec un contenu défini.

  • Sticky Note3

    Ce noeud crée une note autocollante avec une couleur, une largeur et une hauteur spécifiées.

  • Sticky Note4

    Ce noeud crée une note autocollante avec une couleur et des dimensions définies.

  • Store Auth Token

    Ce noeud stocke un jeton d'authentification dans un stockage clé-valeur.

  • Store Last Processed

    Ce noeud enregistre la dernière donnée traitée dans un stockage clé-valeur.

  • Retrieve Auth Token

    Ce noeud récupère un jeton d'authentification à partir d'un stockage clé-valeur.

  • Retrieve Last Processed

    Ce noeud récupère la dernière donnée traitée depuis un stockage clé-valeur.

  • If Auth Token Exists

    Ce noeud vérifie si un jeton d'authentification existe en fonction de conditions définies.

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

Inscription gratuite

S'inscrire gratuitementBesoin d'aide ?
{
  "meta": {
    "instanceId": "7858a8e25b8fc4dae485c1ef345e6fe74effb1f5060433ef500b4c186c965c18"
  },
  "nodes": [
    {
      "id": "4a82b490-3550-4700-8e9a-5ae1ef7c327f",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -100,
        600
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "seconds",
              "secondsInterval": 10
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "bfe180f2-329c-4d00-9d93-3a87d694cb4e",
      "name": "Get Auth Token",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        720,
        1080
      ],
      "parameters": {
        "url": "https://webhook.site/token",
        "method": "POST",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "26089f68-9d3c-4abd-8541-1d63a8a303c1",
      "name": "Unprocessed Requests",
      "type": "n8n-nodes-base.code",
      "position": [
        1420,
        680
      ],
      "parameters": {
        "jsCode": "let filter_method = \"POST\"\nlet last_processed = $json.value ? $json.value : 0\nlet data = $json.data\n\nfunction dateToTime(datetime){\n  return new Date(datetime.replace(\" \", \"T\") + \"Z\").getTime()\n}\n\n//Convert datetimes to timestamps\ndata.forEach(datum=>{datum.created_at = dateToTime(datum.created_at)})\n\n//Filter all new POST requests\nreturn data.filter(datum=>!last_processed || datum.created_at > last_processed).filter(datum=>!filter_method || datum.method==filter_method)"
      },
      "typeVersion": 2
    },
    {
      "id": "00a5c01c-0cc1-4a56-9b5b-b90cc778ee36",
      "name": "Get Latest Requests",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1060,
        800
      ],
      "parameters": {
        "url": "=https://webhook.site/token/{{ $json.value }}/requests",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "42fbb0c3-34c9-4d97-8761-1b9c84c2f8f7",
      "name": "POST to n8n",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2000,
        680
      ],
      "parameters": {
        "url": "={{ $('Local Webhook Address').first().json.webhook }}",
        "body": "={{ $('Unprocessed Requests').item.json.content }}",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "raw",
        "rawContentType": "=application/json"
      },
      "typeVersion": 4.2
    },
    {
      "id": "fd38a00e-2d7f-4621-8f18-47d1770ef3ac",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        1220,
        680
      ],
      "parameters": {
        "mode": "combine",
        "options": {
          "includeUnpaired": true
        },
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3
    },
    {
      "id": "ef347c09-9870-42db-9109-934277290e0b",
      "name": "Local Webhook Address",
      "type": "n8n-nodes-base.set",
      "position": [
        160,
        700
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "3c53386d-23a8-4c8a-b5e9-dfbb755e2be1",
              "name": "webhook",
              "type": "string",
              "value": "http://localhost:5678/webhook/66210723-bd48-473c-8f8d-73d39d5012db"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "89baa16d-4a06-4f98-9735-9cc9fda5ff09",
      "name": "Latest Update Time",
      "type": "n8n-nodes-base.code",
      "position": [
        1600,
        680
      ],
      "parameters": {
        "jsCode": "var datetimes = $('Unprocessed Requests').all().map(x=>x.json.created_at)\nreturn {last_time: Math.max(...datetimes)}"
      },
      "typeVersion": 2
    },
    {
      "id": "c826677d-317f-4ad4-959d-153862de4ff7",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        620,
        980
      ],
      "parameters": {
        "width": 460.2964713549969,
        "height": 288.34663983291097,
        "content": "## 1. Retrieve existing or get new auth token for webhook.site"
      },
      "typeVersion": 1
    },
    {
      "id": "f4bc9a8c-d9dc-4969-9251-ce892a5ed41e",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1080,
        517.8563272190441
      ],
      "parameters": {
        "width": 483.2839292355176,
        "height": 384.1277143350834,
        "content": "## 2. Check if any new requests to webhook that came later than the last checked request"
      },
      "typeVersion": 1
    },
    {
      "id": "adaf19be-cb2f-4727-9881-1a3e4098c528",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1608.5062710597388,
        518.9281636095216
      ],
      "parameters": {
        "width": 395.16534069351894,
        "height": 380.2964713549969,
        "content": "## 3. Relay the request to the local n8n workflow set in *Local Webhook Address*"
      },
      "typeVersion": 1
    },
    {
      "id": "4e7add8c-1e95-4ebb-b7c8-35cee3cdeed5",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -760,
        340
      ],
      "parameters": {
        "color": 4,
        "width": 566.9804381508956,
        "height": 859.1365566530386,
        "content": "# Public Webhook Relay\n## How it Works\nUtilizes webhook.site to receive public webhook requests and relays them to your local n8n workflow\n\n## How to Use\n- To use with local key-value store:\n Go to settings > community nodes and enter ```@horka.tv/n8n-nodes-storage-kv``` to install the key-value store node\n- To use with a different storage method:\n Replace the four key-value nodes with a temporary storage option of your choice (Airtable, Notion, Firebase, etc). This is required to save data between runs.\n- Set **Schedule Trigger** with a polling interval (default is every 10 seconds).\n- Set your local workflow address in Local Webhook Address.\n\n## How to Test\n- Set the workflow to *Active*.\n- After workflow executes at least once, you can check the input to **Get Latest Requests** for your auth token.\n- Run this command: ```curl -X POST -H \"Content-Type: application/json\" -d '{\"foo\":\"bar\"}'  https://webhook.site/[THE AUTH TOKEN YOU JUST GOT]```\n- Now check **Executions** and confirm that the workflow ran all the way to the end. Confirm in **Unprocessed Requests** that your data was retrieved (data[0].content should be equal to {\"foo\":\"bar\"})\n- Now check your other local workflow and confirm that it was triggered with the correct data packet ```{\"foo\":\"bar\"}```.\n- *You're done!*\n\n## Caveats\nAt present, the relay expects a POST with form/json data. If you wish to relay raw data or GET requests, please alter the **Unprocessed Requests** and **POST to n8n** nodes accordingly."
      },
      "typeVersion": 1
    },
    {
      "id": "5d8db2a1-569e-47c0-99a1-d66cb8b86897",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        40,
        608.688533362355
      ],
      "parameters": {
        "color": 3,
        "width": 304.23688498154337,
        "height": 264.4911255434983,
        "content": "### 0. Set this to your local workflow address (Production URL or Test URL in your Workflow Trigger node)"
      },
      "typeVersion": 1
    },
    {
      "id": "e728e8fe-1a7d-4f44-96b8-7344b70b0452",
      "name": "Store Auth Token",
      "type": "@horka.tv/n8n-nodes-storage-kv.keyValueStorage",
      "position": [
        880,
        1080
      ],
      "parameters": {
        "key": "auth_token",
        "value": "={{ $json.uuid }}",
        "fileName": "savefile"
      },
      "typeVersion": 1
    },
    {
      "id": "1c19ff08-d6ed-4874-9c1a-69e92b25138a",
      "name": "Store Last Processed",
      "type": "@horka.tv/n8n-nodes-storage-kv.keyValueStorage",
      "position": [
        1800,
        680
      ],
      "parameters": {
        "key": "last_processed",
        "value": "={{ $json.last_time }}",
        "fileName": "savefile"
      },
      "typeVersion": 1
    },
    {
      "id": "ea927186-6147-42c7-8873-029616bdbe6d",
      "name": "Retrieve Auth Token",
      "type": "@horka.tv/n8n-nodes-storage-kv.keyValueStorage",
      "position": [
        380,
        860
      ],
      "parameters": {
        "key": "auth_token",
        "fileName": "savefile",
        "operation": "read"
      },
      "typeVersion": 1
    },
    {
      "id": "f217889c-7104-4183-8adb-4459f6cdc3d6",
      "name": "Retrieve Last Processed",
      "type": "@horka.tv/n8n-nodes-storage-kv.keyValueStorage",
      "position": [
        680,
        620
      ],
      "parameters": {
        "key": "last_processed",
        "fileName": "savefile",
        "operation": "read"
      },
      "typeVersion": 1
    },
    {
      "id": "12293fc3-8964-40da-8326-85c36dade0df",
      "name": "If Auth Token Exists",
      "type": "n8n-nodes-base.if",
      "position": [
        580,
        860
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "4356f226-da36-418b-957d-880872ddc420",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.value }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.1
    }
  ],
  "pinData": {},
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "Unprocessed Requests",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Auth Token": {
      "main": [
        [
          {
            "node": "Store Auth Token",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Local Webhook Address",
            "type": "main",
            "index": 0
          },
          {
            "node": "Retrieve Last Processed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store Auth Token": {
      "main": [
        [
          {
            "node": "Get Latest Requests",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Latest Update Time": {
      "main": [
        [
          {
            "node": "Store Last Processed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Latest Requests": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Retrieve Auth Token": {
      "main": [
        [
          {
            "node": "If Auth Token Exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If Auth Token Exists": {
      "main": [
        [
          {
            "node": "Get Latest Requests",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Get Auth Token",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store Last Processed": {
      "main": [
        [
          {
            "node": "POST to n8n",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Unprocessed Requests": {
      "main": [
        [
          {
            "node": "Latest Update Time",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Local Webhook Address": {
      "main": [
        [
          {
            "node": "Retrieve Auth Token",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Retrieve Last Processed": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Pour qui est ce workflow ?

Ce workflow s'adresse aux équipes de support client, aux départements de vente et aux petites et moyennes entreprises qui cherchent à optimiser la gestion de leurs requêtes. Un niveau technique intermédiaire est recommandé pour la mise en place et la personnalisation de ce workflow.

Problème résolu

Ce workflow résout le problème de la gestion manuelle des requêtes, souvent source de confusion et d'erreurs. En automatisant ce processus, les utilisateurs peuvent éviter les retards dans le traitement des demandes et réduire le risque de perte d'informations importantes. Après la mise en place de ce workflow, les utilisateurs bénéficient d'une gestion fluide et efficace de leurs requêtes, ce qui améliore la réactivité et la satisfaction client.

Étapes du workflow

Étape 1 : Le workflow est déclenché selon un calendrier prédéfini. Étape 2 : Un nœud HTTP est utilisé pour récupérer un jeton d'authentification nécessaire à l'accès à l'API de Google Sheets. Étape 3 : Un code JavaScript vérifie les requêtes non traitées. Étape 4 : Les requêtes sont envoyées à Google Sheets via un autre nœud HTTP. Étape 5 : Les jetons d'authentification et les dernières requêtes traitées sont stockés pour un accès futur. Étape 6 : Des notes autocollantes sont ajoutées pour une visualisation claire des données.

Guide de personnalisation du workflow n8n

Pour personnaliser ce workflow, commencez par ajuster le déclencheur planifié selon vos besoins, en modifiant la fréquence d'exécution. Ensuite, mettez à jour l'URL de l'API de Google Sheets et les paramètres d'authentification dans le nœud HTTP. Vous pouvez également adapter le code JavaScript pour filtrer les requêtes selon des critères spécifiques. Pour intégrer d'autres outils, envisagez d'ajouter des nœuds supplémentaires ou de modifier les nœuds existants. Assurez-vous de sécuriser les jetons d'authentification en utilisant des options de stockage appropriées, et surveillez régulièrement le flux pour garantir son bon fonctionnement.