Workflow n8n

Automatisation Google Calendar avec n8n : gestion des absences

Ce workflow n8n est conçu pour automatiser la gestion des absences au sein d'une entreprise en intégrant Google Calendar. Il permet de vérifier chaque mois les jours d'absence pour maladie ou vacances, facilitant ainsi la planification des ressources humaines. À l'aide d'un déclencheur cron, le workflow s'active le 1er de chaque mois à 8h, garantissant une mise à jour régulière des données. L'étape initiale consiste à récupérer les événements du mois précédent via le nœud Google Calendar. Ensuite, le workflow utilise un nœud de type switch pour vérifier si des jours d'absence sont signalés, en distinguant les jours de vacances des jours de maladie. Les nœuds de filtrage permettent de sélectionner uniquement les jours pertinents. Les résultats sont ensuite fusionnés et traités pour calculer le nombre total de jours d'absence pour chaque catégorie. Enfin, un message est construit et envoyé par email à l'équipe de paie, assurant ainsi une communication fluide et efficace. Cette automatisation n8n offre une solution précieuse pour les entreprises cherchant à optimiser leur gestion des ressources humaines, en réduisant le temps consacré à la collecte et à l'analyse des données d'absence.

Tags clés :Google Calendarautomatisationgestion des absencesn8nressources humaines
Catégorie: Scheduled · Tags: Google Calendar, automatisation, gestion des absences, n8n, ressources humaines0

Workflow n8n Google Calendar, gestion des absences, ressources humaines : vue d'ensemble

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

Workflow n8n Google Calendar, gestion des absences, ressources humaines : détail des nœuds

  • Previous Month

    Ce noeud calcule la date du mois précédent.

  • 1st of Every month at 8am

    Ce noeud déclenche le workflow le 1er de chaque mois à 8h.

  • Check Summary for Illness or Holiday

    Ce noeud vérifie si le résumé concerne une maladie ou un congé.

  • Holiday

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

  • Illness

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

  • Filter Holiday Days

    Ce noeud filtre les jours de congé en définissant des valeurs spécifiques.

  • Filter Illness Days

    Ce noeud filtre les jours de maladie en définissant des valeurs spécifiques.

  • Merge

    Ce noeud fusionne les données provenant de plusieurs sources.

  • Get previous months events

    Ce noeud récupère les événements du mois précédent à partir de Google Calendar.

  • Send email to payroll

    Ce noeud envoie un email à la paie avec les informations nécessaires.

  • Combine Holiday Counts

    Ce noeud combine les comptes de jours de congé en utilisant du code JavaScript.

  • Combine Illness Counts

    Ce noeud combine les comptes de jours de maladie en utilisant du code JavaScript.

  • Build the message to send

    Ce noeud construit le message à envoyer en utilisant du code JavaScript.

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

Inscription gratuite

S'inscrire gratuitementBesoin d'aide ?
{
  "meta": {
    "instanceId": "8c8c5237b8e37b006a7adce87f4369350c58e41f3ca9de16196d3197f69eabcd"
  },
  "nodes": [
    {
      "id": "6f869392-1501-49b9-be86-4b767f7ec597",
      "name": "Previous Month",
      "type": "n8n-nodes-base.dateTime",
      "position": [
        360,
        420
      ],
      "parameters": {
        "value": "={{Date()}}",
        "action": "calculate",
        "options": {},
        "duration": 1,
        "timeUnit": "months",
        "operation": "subtract"
      },
      "typeVersion": 1
    },
    {
      "id": "1446eb44-bd1e-4dad-9ecc-c2a1e8cb2ca6",
      "name": "1st of Every month at 8am",
      "type": "n8n-nodes-base.cron",
      "position": [
        180,
        420
      ],
      "parameters": {
        "triggerTimes": {
          "item": [
            {
              "hour": 8,
              "mode": "everyMonth"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a044ac76-49d9-4046-b008-2b4adf6512b1",
      "name": "Check Summary for Illness or Holiday",
      "type": "n8n-nodes-base.switch",
      "position": [
        760,
        420
      ],
      "parameters": {
        "rules": {
          "rules": [
            {
              "value2": "Holiday",
              "operation": "contains"
            },
            {
              "output": 1,
              "value2": "Illness",
              "operation": "contains"
            }
          ]
        },
        "value1": "={{$json[\"summary\"]}}",
        "dataType": "string"
      },
      "typeVersion": 1
    },
    {
      "id": "6b40beab-7938-4aaa-a8a8-7a1e364dc2de",
      "name": "Holiday",
      "type": "n8n-nodes-base.noOp",
      "position": [
        980,
        220
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "b069f3ce-66d1-4f64-946b-f9fda27db46b",
      "name": "Illness",
      "type": "n8n-nodes-base.noOp",
      "position": [
        980,
        400
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "5725626b-2bfd-47a0-947e-efd28f0c29fe",
      "name": "Filter Holiday Days",
      "type": "n8n-nodes-base.set",
      "position": [
        1180,
        220
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "Name",
              "value": "={{$json[\"description\"].split(\",\")[0]}}"
            },
            {
              "name": "Days",
              "value": "={{(new Date($json[\"end\"][\"date\"]).getTime() - new Date($json[\"start\"][\"date\"]).getTime()) / (1000 * 3600 * 24)}}"
            },
            {
              "name": "Type",
              "value": "Holiday"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "id": "3114eb4f-a5be-452c-9729-b94d2904eb4b",
      "name": "Filter Illness Days",
      "type": "n8n-nodes-base.set",
      "position": [
        1180,
        400
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "Name",
              "value": "={{$json[\"description\"].split(\",\")[0]}}"
            },
            {
              "name": "Days",
              "value": "={{(new Date($json[\"end\"][\"date\"]).getTime() - new Date($json[\"start\"][\"date\"]).getTime()) / (1000 * 3600 * 24)}}"
            },
            {
              "name": "Type",
              "value": "Illness"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "id": "04617849-c162-4af5-9634-ab8ffd925625",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        1620,
        320
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "daf227d9-938d-4110-9a47-5bf8bb661586",
      "name": "Get previous months events",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        560,
        420
      ],
      "parameters": {
        "options": {
          "timeMax": "={{new Date().toISOString()}}",
          "timeMin": "={{$json[\"data\"]}}"
        },
        "calendar": "[Select Cal]",
        "operation": "getAll",
        "returnAll": true
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "50",
          "name": "Google Calendar account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "19ec862a-e71a-49f9-b799-26f73a410553",
      "name": "Send email to payroll",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        1980,
        320
      ],
      "parameters": {
        "text": "={{$json[\"message\"]}}",
        "options": {},
        "subject": "Absences from last month",
        "toEmail": "payroll-team@mydomain.tld",
        "fromEmail": "n8n@mydomain.tld"
      },
      "credentials": {
        "smtp": {
          "id": "16",
          "name": "mailtrap"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5805b2e1-e723-4803-a7e0-8df5fd4cf84d",
      "name": "Combine Holiday Counts",
      "type": "n8n-nodes-base.code",
      "position": [
        1380,
        220
      ],
      "parameters": {
        "jsCode": "let names = $input.all().map(e => e.json.Name);\nlet unique_names = [...new Set(names)];\nlet results = [];\n\nfor (thisName of unique_names) {\n  let result = {\n    \"Name\": thisName,\n    \"Days\": 0,\n    \"Type\": \"Holiday\"\n  }\n\n  for (matching_item of $input.all().filter(e => e.json.Name === thisName)) {\n    result.Days += parseInt(matching_item.json.Days);\n  }\n  \n  results.push(result);\n}\n\nreturn results.map(e => { return {json: e} });"
      },
      "typeVersion": 1
    },
    {
      "id": "c30345ae-1a19-4453-a67b-eda71cb7326e",
      "name": "Combine Illness Counts",
      "type": "n8n-nodes-base.code",
      "position": [
        1380,
        400
      ],
      "parameters": {
        "jsCode": "let names = $input.all().map(e => e.json.Name);\nlet unique_names = [...new Set(names)];\nlet results = [];\n\nfor (thisName of unique_names) {\n  let result = {\n    \"Name\": thisName,\n    \"Days\": 0,\n    \"Type\": \"Illness\"\n  }\n\n  for (matching_item of $input.all().filter(e => e.json.Name === thisName)) {\n    result.Days += parseInt(matching_item.json.Days);\n  }\n  \n  results.push(result);\n}\n\nreturn results.map(e => { return {json: e} });"
      },
      "typeVersion": 1
    },
    {
      "id": "7bac2604-ca55-4300-a7a5-38fc96830ba6",
      "name": "Build the message to send",
      "type": "n8n-nodes-base.code",
      "position": [
        1800,
        320
      ],
      "parameters": {
        "jsCode": "let illnessMessage = \"\";\nlet holidayMessage = \"\";\nlet message = \"Here is a breakdown of absences for the last month.\\n\\n\";\n\n// Loop the input items\nfor (item of $input.all()) {\n  if (item.json.Type == \"Holiday\") {\n    holidayMessage += item.json.Name + \" had \" + item.json.Days + \" days\\n\";\n  }\n  if (item.json.Type == \"Illness\") {\n    illnessMessage += item.json.Name + \" had \" + item.json.Days + \" days\\n\";\n  }\n}\n\nif (holidayMessage != \"\") {\n  message += \"Holiday Events\\n\";\n  message += holidayMessage + \"\\n\";\n} else {\n  message += \"No Holiday Events\\n\";\n}\n\nif (illnessMessage != \"\") {\n  message += \"Illness Events\\n\";\n  message += illnessMessage;\n} else {\n  message += \"No Illness Events\\n\";\n}\n\n// Return our message\nreturn [{json: {message}}];"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "Build the message to send",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Holiday": {
      "main": [
        [
          {
            "node": "Filter Holiday Days",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Illness": {
      "main": [
        [
          {
            "node": "Filter Illness Days",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Previous Month": {
      "main": [
        [
          {
            "node": "Get previous months events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Holiday Days": {
      "main": [
        [
          {
            "node": "Combine Holiday Counts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Illness Days": {
      "main": [
        [
          {
            "node": "Combine Illness Counts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine Holiday Counts": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine Illness Counts": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "1st of Every month at 8am": {
      "main": [
        [
          {
            "node": "Previous Month",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build the message to send": {
      "main": [
        [
          {
            "node": "Send email to payroll",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get previous months events": {
      "main": [
        [
          {
            "node": "Check Summary for Illness or Holiday",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Summary for Illness or Holiday": {
      "main": [
        [
          {
            "node": "Holiday",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Illness",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Workflow n8n Google Calendar, gestion des absences, ressources humaines : pour qui est ce workflow ?

Ce workflow s'adresse aux équipes RH et aux gestionnaires de paie au sein des PME et grandes entreprises. Il est idéal pour les organisations qui cherchent à automatiser la gestion des absences et à améliorer leur efficacité opérationnelle. Un niveau technique de base est requis pour la configuration initiale.

Workflow n8n Google Calendar, gestion des absences, ressources humaines : problème résolu

Ce workflow résout le problème de la gestion manuelle des absences, qui peut être chronophage et sujet à des erreurs. En automatisant le processus de collecte et d'analyse des jours d'absence, les entreprises peuvent réduire les risques d'erreurs et gagner un temps précieux. Les utilisateurs bénéficient d'une vue d'ensemble claire des absences, ce qui facilite la planification des ressources et améliore la communication au sein de l'équipe.

Workflow n8n Google Calendar, gestion des absences, ressources humaines : étapes du workflow

Étape 1 : Le workflow est déclenché le 1er de chaque mois à 8h grâce à un nœud cron.

  • Étape 1 : Il récupère les événements du mois précédent via le nœud Google Calendar.
  • Étape 2 : Un nœud switch vérifie si des jours d'absence sont signalés, en distinguant les jours de vacances et de maladie.
  • Étape 3 : Les jours pertinents sont filtrés à l'aide de nœuds de type set.
  • Étape 4 : Les résultats sont fusionnés et traités pour calculer le nombre total de jours d'absence.
  • Étape 5 : Un message est construit et envoyé par email à l'équipe de paie.

Workflow n8n Google Calendar, gestion des absences, ressources humaines : guide de personnalisation

Pour personnaliser ce workflow, vous pouvez modifier le calendrier Google utilisé pour récupérer les événements en ajustant les paramètres du nœud Google Calendar. Il est également possible de personnaliser le message envoyé par email en modifiant le code dans le nœud de construction du message. Assurez-vous de mettre à jour les adresses email dans le nœud d'envoi d'email pour qu'elles correspondent à votre équipe de paie. Enfin, vous pouvez ajouter d'autres nœuds pour intégrer des outils supplémentaires si nécessaire.