Workflow n8n

Automatisation Google Sheets avec n8n : synchronisation Clockify

Ce workflow n8n a pour objectif de synchroniser les données entre Clockify et Google Sheets, facilitant ainsi la gestion des heures de travail et des projets. Dans un contexte où la gestion du temps est cruciale pour les entreprises, ce processus d'automatisation permet de réduire les erreurs humaines et d'optimiser le suivi des heures. Les utilisateurs peuvent ainsi se concentrer sur des tâches à plus forte valeur ajoutée. Le workflow commence par un déclencheur Webhook qui reçoit les données de Clockify. Ensuite, les informations sont traitées et envoyées vers Google Sheets via le noeud Google Sheets, où les heures travaillées sont enregistrées. Un traitement supplémentaire est effectué avec les noeuds 'ForGoogle' et 'ForSyncro' pour préparer les données avant de les envoyer. La recherche de correspondances dans Google Sheets est effectuée grâce au noeud 'FindMatch', suivi de conditions logiques avec le noeud 'IF' pour déterminer les actions à entreprendre. Les requêtes HTTP pour créer ou mettre à jour des minuteries dans Syncro sont gérées par les noeuds 'NewSyncroTimer' et 'UpdateSyncroTimer'. Ce workflow apporte une réelle valeur ajoutée en automatisant la synchronisation des données, ce qui permet de gagner du temps et d'améliorer la précision des rapports de travail.

Tags clés :automatisationGoogle SheetsworkflowClockifysynchronisation
Catégorie: Webhook · Tags: automatisation, Google Sheets, workflow, Clockify, synchronisation0

Workflow n8n Google Sheets, Clockify, synchronisation : vue d'ensemble

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

Workflow n8n Google Sheets, Clockify, synchronisation : détail des nœuds

  • Webhook

    Ce noeud reçoit des requêtes HTTP via un webhook.

  • Google Sheets

    Ce noeud interagit avec Google Sheets pour effectuer des opérations sur des feuilles de calcul.

  • ForGoogle

    Ce noeud définit des valeurs à utiliser dans le workflow pour Google.

  • ForSyncro

    Ce noeud définit des valeurs à utiliser dans le workflow pour Syncro.

  • FindMatch

    Ce noeud recherche une valeur spécifique dans une feuille de calcul Google Sheets.

  • IF

    Ce noeud évalue des conditions pour déterminer le chemin d'exécution suivant.

  • NewSyncroTimer

    Ce noeud envoie une requête HTTP pour créer un nouveau minuteur dans Syncro.

  • UpdateSyncroTimer

    Ce noeud envoie une requête HTTP pour mettre à jour un minuteur existant dans Syncro.

  • EnvVariables

    Ce noeud définit des variables d'environnement à utiliser dans le workflow.

  • SetTechnicians

    Ce noeud définit des valeurs pour les techniciens à utiliser dans le workflow.

  • MatchTechnician

    Ce noeud exécute une fonction personnalisée pour faire correspondre un technicien.

  • IF1

    Ce noeud évalue une autre condition pour déterminer le chemin d'exécution suivant.

  • NoOp

    Ce noeud ne réalise aucune opération, servant de point de passage dans le workflow.

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

Inscription gratuite

S'inscrire gratuitementBesoin d'aide ?
{
  "id": "3",
  "name": "Clockify to Syncro",
  "nodes": [
    {
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        280,
        350
      ],
      "webhookId": "82b654d7-aeb2-4cc1-97a8-0ebd1a729202",
      "parameters": {
        "path": "82b654d7-aeb2-4cc1-97a8-0ebd1a729202",
        "options": {},
        "httpMethod": "POST",
        "responseData": "allEntries",
        "responseMode": "lastNode"
      },
      "typeVersion": 1
    },
    {
      "name": "Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1830,
        350
      ],
      "parameters": {
        "range": "A:B",
        "options": {
          "valueInputMode": "USER_ENTERED"
        },
        "sheetId": "xxx",
        "operation": "append"
      },
      "credentials": {
        "googleApi": "Google"
      },
      "typeVersion": 1
    },
    {
      "name": "ForGoogle",
      "type": "n8n-nodes-base.set",
      "position": [
        1650,
        350
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "Syncro",
              "value": "={{$json[\"id\"]}}"
            },
            {
              "name": "Clockify",
              "value": "={{$node[\"Webhook\"].json[\"body\"][\"id\"]}}"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "name": "ForSyncro",
      "type": "n8n-nodes-base.set",
      "position": [
        730,
        350
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "id",
              "value": "={{ $json[\"body\"][\"project\"][\"name\"].match(/\\[(\\d+)]/)[1] }}"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "name": "FindMatch",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1130,
        350
      ],
      "parameters": {
        "range": "A:B",
        "options": {
          "valueRenderMode": "UNFORMATTED_VALUE",
          "returnAllMatches": true
        },
        "sheetId": "xxx",
        "operation": "lookup",
        "lookupValue": "={{$node[\"Webhook\"].json[\"body\"][\"id\"]}}",
        "lookupColumn": "=Clockify"
      },
      "credentials": {
        "googleApi": "Google"
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "name": "IF",
      "type": "n8n-nodes-base.if",
      "position": [
        1300,
        350
      ],
      "parameters": {
        "conditions": {
          "string": [],
          "boolean": [
            {
              "value1": "={{!!Object.keys($node[\"FindMatch\"].data).length}}",
              "value2": true
            }
          ]
        }
      },
      "typeVersion": 1,
      "alwaysOutputData": false
    },
    {
      "name": "NewSyncroTimer",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1490,
        350
      ],
      "parameters": {
        "url": "={{$node[\"EnvVariables\"].json[\"syncro_baseurl\"]}}/api/v1/tickets/{{$node[\"ForSyncro\"].json[\"id\"]}}/timer_entry",
        "options": {},
        "requestMethod": "POST",
        "authentication": "headerAuth",
        "bodyParametersUi": {
          "parameter": [
            {
              "name": "start_at",
              "value": "={{$node[\"Webhook\"].json[\"body\"][\"timeInterval\"][\"start\"]}}"
            },
            {
              "name": "end_at",
              "value": "={{$node[\"Webhook\"].json[\"body\"][\"timeInterval\"][\"end\"]}}"
            },
            {
              "name": "notes",
              "value": "={{$node[\"Webhook\"].json[\"body\"][\"description\"]}}"
            },
            {
              "name": "user_id",
              "value": "={{$node[\"MatchTechnician\"].json[\"id\"]}}"
            }
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": "Syncro"
      },
      "typeVersion": 1
    },
    {
      "name": "UpdateSyncroTimer",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1490,
        580
      ],
      "parameters": {
        "url": "={{$node[\"EnvVariables\"].json[\"syncro_baseurl\"]}}/api/v1/tickets/{{$node[\"ForSyncro\"].json[\"id\"]}}/update_timer_entry",
        "options": {
          "followRedirect": true
        },
        "requestMethod": "PUT",
        "authentication": "headerAuth",
        "bodyParametersUi": {
          "parameter": [
            {
              "name": "timer_entry_id",
              "value": "={{$node[\"IF\"].json[\"Syncro\"]}}"
            },
            {
              "name": "start_time",
              "value": "={{$node[\"Webhook\"].json[\"body\"][\"timeInterval\"][\"start\"]}}"
            },
            {
              "name": "end_time",
              "value": "={{$node[\"Webhook\"].json[\"body\"][\"timeInterval\"][\"end\"]}}"
            },
            {
              "name": "notes",
              "value": "={{$node[\"Webhook\"].json[\"body\"][\"description\"]}}"
            },
            {
              "name": "user_id",
              "value": "={{$node[\"MatchTechnician\"].json[\"id\"]}}"
            }
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": "Syncro"
      },
      "typeVersion": 1
    },
    {
      "name": "EnvVariables",
      "type": "n8n-nodes-base.set",
      "position": [
        580,
        350
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "syncro_baseurl",
              "value": "https://subdomain.syncromsp.com"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "name": "SetTechnicians",
      "type": "n8n-nodes-base.set",
      "position": [
        870,
        350
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "Tech 1",
              "value": "1234"
            },
            {
              "name": "Tech 2",
              "value": "5678"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "name": "MatchTechnician",
      "type": "n8n-nodes-base.function",
      "position": [
        1000,
        350
      ],
      "parameters": {
        "functionCode": "\nconst results = [];\n\nconst user = $node[\"Webhook\"].json[\"body\"][\"user\"];\n\nconst persons = items[0].json\n\nfor (key of Object.keys(persons)) {\n  if (key === user.name) {\n    results.push({ json: { id: persons[key], name: key } })\n  }\n}\n\nreturn results;"
      },
      "typeVersion": 1
    },
    {
      "name": "IF1",
      "type": "n8n-nodes-base.if",
      "position": [
        420,
        350
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$json[\"body\"][\"project\"][\"name\"]}}",
              "value2": "Ticket",
              "operation": "contains"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "name": "NoOp",
      "type": "n8n-nodes-base.noOp",
      "position": [
        480,
        520
      ],
      "parameters": {},
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {},
  "connections": {
    "IF": {
      "main": [
        [
          {
            "node": "UpdateSyncroTimer",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "NewSyncroTimer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF1": {
      "main": [
        [
          {
            "node": "EnvVariables",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "NoOp",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "IF1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "FindMatch": {
      "main": [
        [
          {
            "node": "IF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ForGoogle": {
      "main": [
        [
          {
            "node": "Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ForSyncro": {
      "main": [
        [
          {
            "node": "SetTechnicians",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "EnvVariables": {
      "main": [
        [
          {
            "node": "ForSyncro",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "NewSyncroTimer": {
      "main": [
        [
          {
            "node": "ForGoogle",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "SetTechnicians": {
      "main": [
        [
          {
            "node": "MatchTechnician",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MatchTechnician": {
      "main": [
        [
          {
            "node": "FindMatch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Workflow n8n Google Sheets, Clockify, synchronisation : pour qui est ce workflow ?

Ce workflow s'adresse aux PME et aux équipes de gestion de projet qui utilisent Clockify et Google Sheets pour le suivi des heures. Il est idéal pour les utilisateurs ayant un niveau technique intermédiaire souhaitant automatiser leurs processus de reporting.

Workflow n8n Google Sheets, Clockify, synchronisation : problème résolu

Ce workflow résout le problème de la saisie manuelle des heures de travail dans Google Sheets, ce qui peut entraîner des erreurs et des pertes de temps. En automatisant ce processus, les utilisateurs peuvent s'assurer que les données sont toujours à jour et précises, ce qui réduit le risque d'erreurs et améliore l'efficacité opérationnelle. Après la mise en place de ce workflow, les utilisateurs bénéficient d'une gestion du temps simplifiée et d'une meilleure visibilité sur les projets.

Workflow n8n Google Sheets, Clockify, synchronisation : étapes du workflow

Étape 1 : Le workflow est déclenché par un Webhook qui reçoit les données de Clockify.

  • Étape 1 : Les données sont traitées par le noeud 'ForGoogle' pour préparer les informations à envoyer.
  • Étape 2 : Le noeud 'FindMatch' recherche les correspondances dans Google Sheets pour vérifier si les données existent déjà.
  • Étape 3 : En fonction des résultats, le noeud 'IF' détermine si une nouvelle minuterie doit être créée ou mise à jour dans Syncro.
  • Étape 4 : Les requêtes HTTP pour créer ou mettre à jour les minuteries sont effectuées par les noeuds 'NewSyncroTimer' et 'UpdateSyncroTimer'.
  • Étape 5 : Les données sont ensuite enregistrées dans Google Sheets, assurant une synchronisation efficace des heures de travail.

Workflow n8n Google Sheets, Clockify, synchronisation : guide de personnalisation

Pour personnaliser ce workflow, vous pouvez modifier l'URL du Webhook pour l'adapter à votre instance Clockify. Il est également possible de changer l'ID de la feuille Google Sheets pour enregistrer les données dans un autre document. Les paramètres des noeuds 'NewSyncroTimer' et 'UpdateSyncroTimer' peuvent être ajustés pour correspondre aux spécificités de votre configuration Syncro. Pensez à sécuriser votre flux en utilisant des variables d'environnement pour stocker des informations sensibles comme les clés API. Enfin, vous pouvez ajouter des noeuds supplémentaires pour intégrer d'autres outils selon vos besoins.