Extracteur de matrice de compétences

Avancé

Ceci est unMiscellaneous, AI Summarization, Multimodal AIworkflow d'automatisation du domainecontenant 17 nœuds.Utilise principalement des nœuds comme Code, GoogleDrive, GoogleSheets, ManualTrigger, Agent. Extraire la matrice des compétences vers Google Sheets avec Google Drive et GPT-4o

Prérequis
  • Informations d'identification Google Drive API
  • Informations d'identification Google Sheets API
  • Clé API OpenAI
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "I2RxYTHy30vIWRmh",
  "meta": {
    "instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
    "templateCredsSetupCompleted": true
  },
  "name": "Skill matrix extractor",
  "tags": [],
  "nodes": [
    {
      "id": "7119286f-4f1b-41ac-9aa0-8e0ba5e9a2be",
      "name": "Lors du clic sur 'Exécuter le workflow'",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "be3bdafb-8250-4580-809b-84df5a18587e",
      "name": "Azure OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        992,
        224
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "id": "C3WzT18XqF8OdVM6",
          "name": "Azure Open AI account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "539bdc67-0f64-409c-afbb-83bcef1d164c",
      "name": "Rechercher un CV",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        224,
        0
      ],
      "parameters": {
        "filter": {
          "folderId": {
            "__rl": true,
            "mode": "list",
            "value": "1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
            "cachedResultUrl": "https://drive.google.com/drive/folders/1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
            "cachedResultName": "Resume_store"
          }
        },
        "options": {},
        "resource": "fileFolder",
        "returnAll": true
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "gQtjXVGUgZru29qC",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "550324ac-717b-4749-b885-e78777a107f6",
      "name": "Télécharger le CV",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        448,
        0
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "gQtjXVGUgZru29qC",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "4c59808e-dd0d-4957-9738-b813cb2d3e70",
      "name": "Extraire le contenu du fichier",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        672,
        0
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "fdece73f-e3a0-4678-bd79-733f91ac38f3",
      "name": "Analyseur de compétences",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        896,
        0
      ],
      "parameters": {
        "text": "=Analyze the following resume and extract the skills into the required JSON format.\n\nResume:\n{{ $json.text }}",
        "options": {
          "systemMessage": "You are an AI assistant that analyzes resumes and extracts a structured skills matrix.  \n\nRules:\n- Only include skills relevant to this predefined tech stack: [React, Node.js, Angular, Python, Java, SQL, Docker, Kubernetes, AWS, Azure, GCP, HTML, CSS, JavaScript].  \n- For each skill, return:\n  - name (string)\n  - level (1–5, where 1 = beginner and 5 = expert)\n  - years (integer, number of years of experience if mentioned, otherwise estimate or set to null).  \n- Always return valid JSON in this exact format:\n{\n  \"skills\": [\n    {\"name\": \"React\", \"level\": 4, \"years\": 5},\n    {\"name\": \"Node.js\", \"level\": 3, \"years\": 2}\n  ]\n}\n- Do not include text outside of the JSON.\n"
        },
        "promptType": "define"
      },
      "typeVersion": 2.1
    },
    {
      "id": "810daa5b-6b4e-4960-9951-b7693a5a9e2c",
      "name": "Analyser la structure json",
      "type": "n8n-nodes-base.code",
      "position": [
        1296,
        0
      ],
      "parameters": {
        "jsCode": "// Get AI output string\nconst rawOutput = $json[\"output\"];\n\n// Parse string into JSON\nlet parsed;\ntry {\n  parsed = JSON.parse(rawOutput);\n} catch (e) {\n  throw new Error(\"Invalid JSON from AI: \" + e.message);\n}\n\n// Extract skills\nlet skills = parsed.skills || [];\n\n// Filter skills where level > 2\nskills = skills.filter(skill => skill.level > 2);\n\n// Return cleaned result\nreturn skills.map(skill => ({ json: skill }));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "676a04bd-ed64-46ee-a97c-428b9d3d1555",
      "name": "Note adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -224,
        -272
      ],
      "parameters": {
        "height": 272,
        "content": "##  Manual Trigger Node\n\n**Purpose:** Starts the workflow execution\n**How it works:** Click the \"Execute workflow\" button to begin processing\nWhen to use: Run this when you want to analyze new resumes that have been added to the resume folder"
      },
      "typeVersion": 1
    },
    {
      "id": "42f2c726-7b9d-4b11-85a1-a10b0a54bfda",
      "name": "Note adhésive 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        112,
        -352
      ],
      "parameters": {
        "height": 336,
        "content": "## Search Resume (Google Drive)\n\n**Purpose:** Locates resume files in a designated Google Drive folder\n\n**Configuration:**\nConnected to a specific folder named \"Resume_store\"\nSearches for all files in the folder\n\n**Output:** List of all resume files found in the folder"
      },
      "typeVersion": 1
    },
    {
      "id": "3ae4d01a-6b6a-43b9-bb63-cbce538d3513",
      "name": "Note adhésive 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        336,
        160
      ],
      "parameters": {
        "height": 304,
        "content": "##  Download Resume (Google Drive)\n\n**Purpose:** Downloads each resume file from Google Drive\n\n**How it works:** Takes the file IDs from the search step and downloads the actual PDF files\n\n**Security:** Uses secure Google Drive API credentials (details hidden for security)"
      },
      "typeVersion": 1
    },
    {
      "id": "78e6ef99-d11b-4423-b846-20052eeb357e",
      "name": "Note adhésive 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        -336
      ],
      "parameters": {
        "height": 304,
        "content": "##  Extract Content from File\n\n**Purpose:** Converts PDF resumes into readable text\n\n**Functionality:**\nProcesses PDF files\nExtracts all text content for analysis\n\n**Output:** Plain text version of each resume"
      },
      "typeVersion": 1
    },
    {
      "id": "2a0c837d-b006-4d75-a1f2-f4f4f7d10098",
      "name": "Note adhésive 4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        720,
        304
      ],
      "parameters": {
        "height": 304,
        "content": "## . Azure OpenAI Chat Model\n\n**Purpose:** Provides AI language model for skill analysis\n\n**Configuration:**\nUses GPT-4o-mini model\nConnected via secure Azure OpenAI credentials\n\n**Role:** Powers the skill analysis agent with AI capabilities"
      },
      "typeVersion": 1
    },
    {
      "id": "aa4ef7a5-8ef9-49a9-88f5-acf32b0fa7d1",
      "name": "Note adhésive 5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        -416
      ],
      "parameters": {
        "height": 400,
        "content": "## Skill Analyser (AI Agent)\n\n**Purpose:** Main intelligence of the workflow - analyzes resume text for technical skills\n\n**System Instructions:**\nFocuses on predefined tech stack: React, Node.js, Angular, Python, Java, SQL, Docker, Kubernetes, AWS, Azure, GCP, HTML, CSS, JavaScript\nEvaluates skill levels on 1-5 scale (1=beginner, 5=expert)\nEstimates years of experience for each skill\nReturns structured JSON format"
      },
      "typeVersion": 1
    },
    {
      "id": "52d9bd11-c8be-4337-b799-195d1b267b52",
      "name": "Note adhésive 6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        176
      ],
      "parameters": {
        "height": 336,
        "content": "## Parse Structured JSON\n\n**Purpose:** Processes and filters the AI analysis results\n\n**JavaScript Code Logic:**\nParses the JSON output from the AI agent\nFilters skills to only include those with proficiency level > 2\nStructures data for database storage\nHandles error cases for invalid JSON"
      },
      "typeVersion": 1
    },
    {
      "id": "e6fd03e9-307d-470c-b904-b7852271b9ae",
      "name": "Note adhésive 7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1296,
        -528
      ],
      "parameters": {
        "height": 512,
        "content": "## Update sheet with Skill matrix (Google Sheets)\n\n**Purpose:** Stores the extracted skills in a Google Sheets database\nTarget Sheet: \"Resume store\" spreadsheet, \"Sheet2\" tab\n\n**Data Mapping:**\nSkill name → extracted skill name\nSkill level → proficiency rating (1-5)\nSkill years → years of experience\nName → \"John Doe\" (hardcoded candidate name)\n\n\n**Operation:** Appends new rows or updates existing ones based on Name field"
      },
      "typeVersion": 1
    },
    {
      "id": "9fa44b2f-4e20-471f-aa01-9d4e6ffc1a67",
      "name": "Note adhésive 8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -640,
        -48
      ],
      "parameters": {
        "height": 496,
        "content": "## Workflow Process Flow\n\n**Start → Manual trigger initiates the process**\n\n**Search → Finds all resume files in Google Drive folder**\n\n**Download → Retrieves each resume file**\n\n**Extract → Converts PDF to text**\n\n**Analyze → AI evaluates skills and proficiency levels**\n\n**Filter → Keeps only intermediate to advanced skills (level > 2)**\n\n**Store → Saves results to Google Sheets database**"
      },
      "typeVersion": 1
    },
    {
      "id": "1fe999a3-5f03-4c31-9dd5-de285bbc510d",
      "name": "Mettre à jour la feuille avec la matrice de compétences",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1520,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "Name": "John Doe",
            "Skill name": "={{ $json.name }}",
            "Skill level": "={{ $json.level }}",
            "Skill years": "={{ $json.years }}"
          },
          "schema": [
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Phone ",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Phone ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Years of experience",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Years of experience",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "skills",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "skills",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "curent role",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "curent role",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "education",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "education",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Score",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Summary",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Skill name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Skill name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Skill level",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Skill level",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Skill years",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Skill years",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Name"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1424038785,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA/edit#gid=1424038785",
          "cachedResultName": "Sheet2"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA/edit?usp=drivesdk",
          "cachedResultName": "Resume store"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "s4dP1fNuVZ2gWvs3",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.6
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "80d15093-7694-4da9-8e07-7c82f9221cba",
  "connections": {
    "539bdc67-0f64-409c-afbb-83bcef1d164c": {
      "main": [
        [
          {
            "node": "550324ac-717b-4749-b885-e78777a107f6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fdece73f-e3a0-4678-bd79-733f91ac38f3": {
      "main": [
        [
          {
            "node": "810daa5b-6b4e-4960-9951-b7693a5a9e2c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "550324ac-717b-4749-b885-e78777a107f6": {
      "main": [
        [
          {
            "node": "4c59808e-dd0d-4957-9738-b813cb2d3e70",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "810daa5b-6b4e-4960-9951-b7693a5a9e2c": {
      "main": [
        [
          {
            "node": "1fe999a3-5f03-4c31-9dd5-de285bbc510d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "be3bdafb-8250-4580-809b-84df5a18587e": {
      "ai_languageModel": [
        [
          {
            "node": "fdece73f-e3a0-4678-bd79-733f91ac38f3",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "4c59808e-dd0d-4957-9738-b813cb2d3e70": {
      "main": [
        [
          {
            "node": "fdece73f-e3a0-4678-bd79-733f91ac38f3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7119286f-4f1b-41ac-9aa0-8e0ba5e9a2be": {
      "main": [
        [
          {
            "node": "539bdc67-0f64-409c-afbb-83bcef1d164c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé - Divers, Résumé IA, IA Multimodale

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds17
Catégorie3
Types de nœuds8
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur
Rahul Joshi

Rahul Joshi

@rahul08

Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34