Filtrage automatisé de CV avec GPT-4o et gestion d'erreurs - Processus Google Sheets et Google Drive

Avancé

Ceci est unContent Creation, Multimodal AIworkflow d'automatisation du domainecontenant 34 nœuds.Utilise principalement des nœuds comme If, Set, Gmail, Merge, Switch. GPT-4o与错误traitementdeautomatisation简历筛选 - Google表格与云端硬盘流程

Prérequis
  • Compte Google et informations d'identification Gmail API
  • Informations d'identification Google Drive API
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • 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
{
  "meta": {
    "instanceId": "2000c64071c20843606b95c63795bb0797c41036047055a6586498e855b96efc"
  },
  "nodes": [
    {
      "id": "548b4ba3-85c0-4e01-a89d-53c345910b22",
      "name": "Guide de configuration",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4752,
        -160
      ],
      "parameters": {
        "width": 600,
        "height": 1152,
        "content": "# 🎯 AI Resume Screening & Candidate Pipeline\n\n**Enhanced with Error Handling & Recovery**\n\n**Created by:** **David Olusola**\n\n## 🚀 What This Workflow Does\n\n- **Monitors Gmail** for resume submissions\n- **Processes multiple file formats** (PDF, DOCX, TXT)\n- **Uses AI analysis** with GPT-4o for candidate evaluation  \n- **Extracts contact info** automatically\n- **Scores candidates** against job requirements\n- **Logs everything** to Google Sheets dashboard\n- **Handles errors gracefully** with notifications\n\n## ⚡ Error Handling Features\n\n✅ File extraction validation\n✅ AI processing failure recovery\n✅ Email notifications for errors\n✅ Data validation before logging\n✅ Resume quality checks\n✅ Timeout protection\n\n## 📋 Required Setup\n\n- Gmail credentials\n- Google Drive & Sheets credentials  \n- OpenAI API key\n- Error notification email\n\n Copy the [Google Sheet Template](https://docs.google.com/spreadsheets/d/1vucZgBrULNToEQMAQrFyWczpOzXxBU6rzCX0waIZyeM/edit?gid=0#gid=0)  \nMake a copy of the sheet in your own Google Drive. This is where the workflow will write the parsed data back.\n\n## 🎯 Use Cases\n\n- HR departments screening applicants\n- Recruiting agencies processing candidates\n- Startups managing hiring pipelines\n- Remote teams coordinating interviews"
      },
      "typeVersion": 1
    },
    {
      "id": "c84f6d81-dec5-458d-b298-617752318f87",
      "name": "Surveiller les CV",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        -3952,
        560
      ],
      "parameters": {
        "simple": false,
        "filters": {},
        "options": {
          "downloadAttachments": true
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "LVRUgE95PAvkE1Mc",
          "name": "Gmail account 2"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "ddd0aa5e-dd9c-4658-9ccb-eb183bd75062",
      "name": "Surveillance des e-mails",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4080,
        320
      ],
      "parameters": {
        "color": 2,
        "width": 350,
        "height": 392,
        "content": "## 📧 Email Monitoring\n\nWatches Gmail inbox for:\n- Resume attachments\n- Job application emails\n- Candidate submissions\n\nSupports multiple file formats:\n- PDF documents\n- Word documents (.docx)\n- Plain text files (.txt)"
      },
      "typeVersion": 1
    },
    {
      "id": "e0a4d380-edc6-48c0-b655-f7ffc2d11603",
      "name": "Enregistrer dans Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -3728,
        560
      ],
      "parameters": {
        "name": "={{ $json.subject.replace(/[^a-zA-Z0-9]/g, '_') }}_resume_{{ $now.format('yyyy-MM-dd_HH-mm') }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "root",
          "cachedResultName": "/ (Root folder)"
        },
        "inputDataFieldName": "attachment_0"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "IPz4dCJVFC8uaoHw",
          "name": "Google Drive account 2"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "37bb352f-14f9-4286-9a0b-9b3e3680f733",
      "name": "Téléversement réussi ?",
      "type": "n8n-nodes-base.if",
      "position": [
        -3504,
        560
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "upload-success",
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $json.id !== undefined && $json.webViewLink !== undefined }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "6ee6f742-ce91-4bdc-a3ea-769a06cf2512",
      "name": "Router par type de fichier",
      "type": "n8n-nodes-base.switch",
      "position": [
        -3280,
        352
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "PDF",
              "conditions": {
                "options": {
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "pdf-check",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.mimeType }}",
                    "rightValue": "application/pdf"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "DOCX",
              "conditions": {
                "options": {
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "docx-check",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.mimeType }}",
                    "rightValue": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "TXT",
              "conditions": {
                "options": {
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "txt-check",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.mimeType }}",
                    "rightValue": "text/plain"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "899b217d-9258-4fd6-be41-fdd5fe52c5d3",
      "name": "Extraire le texte PDF",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -2864,
        128
      ],
      "parameters": {
        "options": {
          "maxPages": 10
        },
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "3f93e040-46e2-4c71-b0b2-548bcfe04235",
      "name": "Convertir DOCX en Docs",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -3056,
        368
      ],
      "parameters": {
        "url": "=https://www.googleapis.com/drive/v2/files/{{ $json.id }}/copy",
        "method": "POST",
        "options": {
          "timeout": 30000
        },
        "jsonBody": "{\n  \"title\": \"{{ $json.name }}_converted\",\n  \"mimeType\": \"application/vnd.google-apps.document\"\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleDriveOAuth2Api"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "IPz4dCJVFC8uaoHw",
          "name": "Google Drive account 2"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "64cf332a-2691-4181-a244-4cc18f9a1b13",
      "name": "Obtenir le Doc en texte",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -2832,
        368
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {
          "googleFileConversion": {
            "conversion": {
              "docsToFormat": "text/plain"
            }
          }
        },
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "IPz4dCJVFC8uaoHw",
          "name": "Google Drive account 2"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "6b5e1a57-2c26-4bbe-b104-99ef776f867c",
      "name": "Télécharger le TXT",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -3056,
        576
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "IPz4dCJVFC8uaoHw",
          "name": "Google Drive account 2"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "2255b19e-1842-4e23-9fcf-0c69b036226b",
      "name": "Extraire le contenu TXT",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -2832,
        576
      ],
      "parameters": {
        "options": {},
        "operation": "text",
        "destinationKey": "resumeText"
      },
      "typeVersion": 1
    },
    {
      "id": "ee8c0749-6302-420d-9fff-cb57dfef3b9e",
      "name": "Texte extrait ?",
      "type": "n8n-nodes-base.if",
      "position": [
        -2544,
        288
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "text-validation",
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ ($json.text && $json.text.length > 50) || ($json.data && $json.data.length > 50) || ($json.resumeText && $json.resumeText.length > 50) }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "cd20f833-a887-46c4-9702-94e53780552d",
      "name": "Standardiser les données du CV",
      "type": "n8n-nodes-base.set",
      "position": [
        -2320,
        192
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "resume-text",
              "name": "candidateResume",
              "type": "string",
              "value": "={{ $json.text || $json.data || $json.resumeText }}"
            },
            {
              "id": "original-email",
              "name": "originalEmail",
              "type": "object",
              "value": "={{ $('Monitor Resumes').item.json }}"
            },
            {
              "id": "drive-link",
              "name": "driveLink",
              "type": "string",
              "value": "={{ $('Save to Drive').item.json.webViewLink }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "87bae272-a305-4573-b651-8a0428d13fce",
      "name": "Contrôle qualité du CV",
      "type": "n8n-nodes-base.if",
      "position": [
        -2096,
        192
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "quality-check",
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $json.candidateResume && $json.candidateResume.length > 100 && ($json.candidateResume.toLowerCase().includes('experience') || $json.candidateResume.toLowerCase().includes('skills') || $json.candidateResume.toLowerCase().includes('education')) }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "0a211848-c56f-4602-a8f5-e0a63e9c0631",
      "name": "Description de poste",
      "type": "n8n-nodes-base.set",
      "position": [
        -1872,
        80
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "job-description",
              "name": "jobDescription",
              "type": "string",
              "value": "Job Title: Senior Software Engineer\n\nWe are seeking a Senior Software Engineer to join our growing team. The ideal candidate will have:\n\nRequired Skills:\n- 5+ years of software development experience\n- Strong proficiency in JavaScript, Python, or Java\n- Experience with cloud platforms (AWS, GCP, Azure)\n- Database design and optimization experience\n- Agile development methodology experience\n\nPreferred Skills:\n- Full-stack development experience\n- DevOps and CI/CD pipeline experience\n- Team leadership experience\n- Experience with microservices architecture\n\nResponsibilities:\n- Design and develop scalable software solutions\n- Collaborate with cross-functional teams\n- Mentor junior developers\n- Participate in code reviews\n- Contribute to technical decision making"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "53dbdfb5-0e9e-4e03-81d3-ed01714978ba",
      "name": "Analyse par recruteur IA",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -1648,
        80
      ],
      "parameters": {
        "text": "=**CANDIDATE RESUME:**\n\n{{ $('Extract PDF Text').item.json.text }}\n\n**JOB DESCRIPTION:**\n\n{{ $json.jobDescription }}",
        "options": {
          "systemMessage": "You are an expert technical recruiter and hiring manager with 15+ years of experience evaluating candidates across technology, business, and creative roles.\n\n# Your Mission\nAnalyze the candidate's resume against the provided job description and deliver a comprehensive, actionable screening report that helps hiring teams make informed decisions quickly.\n\n# Analysis Framework\nEvaluate the candidate across these dimensions:\n1. **Technical Skills Match** - Hard skills, tools, technologies\n2. **Experience Relevance** - Industry background, role progression\n3. **Cultural & Soft Skills Fit** - Leadership, communication, teamwork\n4. **Growth Potential** - Learning ability, adaptability, ambition\n5. **Red Flags** - Gaps, inconsistencies, concerns\n\n# Output Requirements\nProvide your analysis in this exact JSON structure - be specific and reference actual resume content.\n\n# Quality Standards\n- Reference specific resume content, not generalities\n- Consider both immediate needs and long-term potential\n- Balance optimism with realistic assessment\n- Provide actionable insights for hiring managers\n- Score from 1-10 where 8+ means \"definitely interview\""
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2
    },
    {
      "id": "416be5d3-78da-4837-b312-5edd184216b5",
      "name": "Analyse de sortie structurée",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -1504,
        304
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"candidate_strengths\": {\n      \"type\": \"array\",\n      \"items\": { \"type\": \"string\" },\n      \"description\": \"List of candidate's key strengths with evidence\"\n    },\n    \"candidate_weaknesses\": {\n      \"type\": \"array\", \n      \"items\": { \"type\": \"string\" },\n      \"description\": \"List of areas where candidate falls short\"\n    },\n    \"risk_assessment\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"level\": {\n          \"type\": \"string\",\n          \"enum\": [\"Low\", \"Medium\", \"High\"]\n        },\n        \"explanation\": {\n          \"type\": \"string\",\n          \"description\": \"Detailed risk analysis\"\n        }\n      }\n    },\n    \"opportunity_assessment\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"level\": {\n          \"type\": \"string\", \n          \"enum\": [\"Low\", \"Medium\", \"High\"]\n        },\n        \"explanation\": {\n          \"type\": \"string\",\n          \"description\": \"Upside potential analysis\"\n        }\n      }\n    },\n    \"overall_score\": {\n      \"type\": \"integer\",\n      \"minimum\": 1,\n      \"maximum\": 10,\n      \"description\": \"Overall fit score 1-10\"\n    },\n    \"score_justification\": {\n      \"type\": \"string\",\n      \"description\": \"Detailed explanation of the score\"\n    },\n    \"next_steps_recommendation\": {\n      \"type\": \"string\",\n      \"description\": \"Recommended next actions\"\n    }\n  },\n  \"required\": [\"candidate_strengths\", \"candidate_weaknesses\", \"risk_assessment\", \"opportunity_assessment\", \"overall_score\", \"score_justification\", \"next_steps_recommendation\"]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "ea66c7e3-1572-4824-8eae-a5b637e5df33",
      "name": "GPT-4o Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -1632,
        304
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {
          "maxTokens": 2000,
          "temperature": 0.3
        }
      },
      "credentials": {
        "openAiApi": {
          "id": "BXMUxnyGzjtZQOK4",
          "name": "OpenAi account Dave"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "101a971e-3fae-445e-96ac-878650a6d14a",
      "name": "Analyse IA réussie ?",
      "type": "n8n-nodes-base.if",
      "position": [
        -1296,
        80
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "ai-success",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.output && $json.output.overall_score && $json.output.candidate_strengths.join(\"/n/n\") }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "df2d7bc1-4628-4a08-8a55-6de9111eea4c",
      "name": "Extraire les infos candidat",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        -1136,
        -160
      ],
      "parameters": {
        "text": "={{ $('Standardize Resume Data').item.json.candidateResume }}",
        "options": {},
        "attributes": {
          "attributes": [
            {
              "name": "full_name",
              "required": true,
              "description": "Candidate's full name (first and last name combined)"
            },
            {
              "name": "email_address",
              "required": true,
              "description": "Primary email address of the candidate"
            },
            {
              "name": "phone_number",
              "description": "Phone number or mobile number"
            },
            {
              "name": "current_title",
              "description": "Current job title or most recent position"
            },
            {
              "name": "years_experience",
              "description": "Total years of relevant work experience"
            },
            {
              "name": "key_skills",
              "description": "Top 5 technical or professional skills mentioned"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "e5ac2a2d-bbdd-4582-b019-d8ba5ba6c57c",
      "name": "Données finales valides ?",
      "type": "n8n-nodes-base.if",
      "position": [
        -784,
        -160
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "data-validation",
              "operator": {
                "type": "number",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.output?.full_name && $json.output?.email_address && $('AI Recruiter Analysis').item.json.output?.overall_score }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "168334bc-97c8-490b-a1fc-0acb8066912d",
      "name": "Journaliser le traitement réussi",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -736,
        -336
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $('Save to Drive').item.json.createdTime }}",
            "Email": "={{ $json.output.email_address || $json.originalEmail.from }}",
            "Resume": "={{ $('Save to Drive').item.json.webViewLink }}",
            "Full Name": "={{ $json.output.full_name }}",
            "Strengths": "={{ $('AI Recruiter Analysis').item.json.output.candidate_strengths.join(' • ') }}",
            "Key Skills": "={{ $json.output.key_skills }}",
            "Weaknesses": "={{ $('AI Recruiter Analysis').item.json.output.candidate_weaknesses.join(' • ') }}",
            "Overall Fit": "={{ $('AI Recruiter Analysis').item.json.output.overall_score }}",
            "Risk Factor": "={{ $('AI Recruiter Analysis').item.json.output.risk_assessment.level }} \n{{ $('AI Recruiter Analysis').item.json.output.risk_assessment.explanation }}",
            "Justification": "={{ $('AI Recruiter Analysis').item.json.output.score_justification }}",
            "Reward Factor": "={{ $('AI Recruiter Analysis').item.json.output.opportunity_assessment.level }}  \n{{ $('AI Recruiter Analysis').item.json.output.opportunity_assessment.explanation }}"
          },
          "schema": [
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Resume",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Resume",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Full Name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Full Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Strengths",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Strengths",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Weaknesses",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Weaknesses",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Risk Factor",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Risk Factor",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Reward Factor",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Reward Factor",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Overall Fit",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Overall Fit",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Justification",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Justification",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Key Skills",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Key Skills",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1vucZgBrULNToEQMAQrFyWczpOzXxBU6rzCX0waIZyeM/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1vucZgBrULNToEQMAQrFyWczpOzXxBU6rzCX0waIZyeM",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1vucZgBrULNToEQMAQrFyWczpOzXxBU6rzCX0waIZyeM/edit?usp=drivesdk",
          "cachedResultName": "Resume Screener (file -> make a copy)"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "9bWZzYQ7NvMBs1Xg",
          "name": "Google Sheets account 2"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "95d4e4e5-63bd-4a2b-bc26-ea15144d76af",
      "name": "Définir erreur de téléversement",
      "type": "n8n-nodes-base.set",
      "position": [
        -560,
        752
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "error-type",
              "name": "error_type",
              "type": "string",
              "value": "Upload Failed"
            },
            {
              "id": "error-message",
              "name": "error_message",
              "type": "string",
              "value": "Failed to upload resume to Google Drive"
            },
            {
              "id": "original-data",
              "name": "original_email",
              "type": "object",
              "value": "={{ $('Monitor Resumes').item.json }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "56635bec-8887-4b1d-90fd-a4cf35484f57",
      "name": "Définir erreur d'extraction",
      "type": "n8n-nodes-base.set",
      "position": [
        -560,
        528
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "error-type",
              "name": "error_type",
              "type": "string",
              "value": "Text Extraction Failed"
            },
            {
              "id": "error-message",
              "name": "error_message",
              "type": "string",
              "value": "Unable to extract readable text from file"
            },
            {
              "id": "file-info",
              "name": "file_info",
              "type": "object",
              "value": "={{ $('Save to Drive').item.json }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "825c2125-1914-4e4b-9d6e-b67a2e3b11ce",
      "name": "Définir erreur de qualité",
      "type": "n8n-nodes-base.set",
      "position": [
        -560,
        336
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "error-type",
              "name": "error_type",
              "type": "string",
              "value": "Poor Resume Quality"
            },
            {
              "id": "error-message",
              "name": "error_message",
              "type": "string",
              "value": "Resume does not contain sufficient content for analysis"
            },
            {
              "id": "resume-data",
              "name": "resume_data",
              "type": "string",
              "value": "={{ $json.candidateResume?.substring(0, 200) }}..."
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "57f8e9fb-3175-4975-9775-e134e94eb6e4",
      "name": "Définir erreur IA",
      "type": "n8n-nodes-base.set",
      "position": [
        -560,
        112
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "error-type",
              "name": "error_type",
              "type": "string",
              "value": "AI Processing Failed"
            },
            {
              "id": "error-message",
              "name": "error_message",
              "type": "string",
              "value": "AI analysis did not complete successfully"
            },
            {
              "id": "ai-output",
              "name": "ai_output",
              "type": "object",
              "value": "={{ $json }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "f7b1385e-6a0a-470c-93cd-55ba1da56ee4",
      "name": "Définir erreur de validation",
      "type": "n8n-nodes-base.set",
      "position": [
        -560,
        -80
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "error-type",
              "name": "error_type",
              "type": "string",
              "value": "Data Validation Failed"
            },
            {
              "id": "error-message",
              "name": "error_message",
              "type": "string",
              "value": "Missing required candidate information or AI analysis data"
            },
            {
              "id": "available-data",
              "name": "available_data",
              "type": "string",
              "value": "={{ JSON.stringify({ candidateInfo: $json.output, aiAnalysis: $('AI Recruiter Analysis').item.json.output }) }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "3b4b6746-99e0-4d6b-a620-fc8c89974eee",
      "name": "Fusionner toutes les erreurs",
      "type": "n8n-nodes-base.merge",
      "position": [
        -336,
        352
      ],
      "parameters": {
        "mode": "combine",
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "5c692947-9802-43d7-848a-61d9fa01f02a",
      "name": "Envoyer notification d'erreur",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -112,
        352
      ],
      "webhookId": "8b233cc7-a903-4afe-9179-14923fcad8a7",
      "parameters": {
        "sendTo": "your-error-notification-email@company.com",
        "message": "=⚠️ **Resume Processing Failed**\n\n**Error Type:** {{ $json.error_type }}\n**Error Message:** {{ $json.error_message }}\n**Timestamp:** {{ $now.format('yyyy-MM-dd HH:mm:ss') }}\n\n**Original Email Details:**\n- From: {{ $json.original_email?.from || 'Unknown' }}\n- Subject: {{ $json.original_email?.subject || 'Unknown' }}\n- Date: {{ $json.original_email?.date || 'Unknown' }}\n\n**Next Steps:**\n- Review the error details above\n- Check file format and quality\n- Manually process if needed\n- Contact IT support if errors persist",
        "options": {},
        "subject": "=Resume Processing Error - {{ $json.error_type }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "Aecq49wES5aLVPPq",
          "name": "Gmail account 4"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "803eb0cb-f941-44cb-89dc-3813ec26d3c9",
      "name": "Journaliser l'erreur dans la feuille",
      "type": "n8n-nodes-base.googleSheets",
      "disabled": true,
      "position": [
        112,
        352
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "Requires Manual Review",
            "File_Link": "={{ $json.file_info?.webViewLink || 'Not available' }}",
            "Timestamp": "={{ $now.format('yyyy-MM-dd HH:mm:ss') }}",
            "Error_Type": "={{ $json.error_type }}",
            "Error_Message": "={{ $json.error_message }}",
            "Original_From": "={{ $json.original_email?.from || 'Unknown' }}",
            "Original_Subject": "={{ $json.original_email?.subject || 'Unknown' }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/your-error-sheet-id/edit#gid=0",
          "cachedResultName": "Errors"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "your-error-log-spreadsheet-id",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/your-error-sheet-id/edit",
          "cachedResultName": "Error Log Sheet"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "52ea629f-2f47-4b03-9498-98701026de61",
      "name": "Traitement des fichiers",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3104,
        -464
      ],
      "parameters": {
        "color": 6,
        "width": 400,
        "height": 1224,
        "content": "## 🔄 File Processing\n\nRoutes different file types:\n- **PDF**: Direct text extraction\n- **DOCX**: Convert to Google Doc first\n- **TXT**: Simple text processing\n\nAll paths converge to standardized text output"
      },
      "typeVersion": 1
    },
    {
      "id": "82d07dc3-aac4-4d04-94ce-89555c5c5abd",
      "name": "Gestion des erreurs",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -592,
        -480
      ],
      "parameters": {
        "color": 8,
        "width": 400,
        "height": 1340,
        "content": "## ⚠️ Error Handling\n\n**Multi-layer Validation:**\n- Upload success verification\n- Text extraction validation\n- Resume quality checks\n- AI processing validation\n- Final data verification\n\n**Error Recovery:**\n- Email notifications to admin\n- Error logging to spreadsheet\n- Graceful failure handling\n- Manual review triggers"
      },
      "typeVersion": 1
    },
    {
      "id": "e14473a9-91b4-43b7-8279-de2e3a47711f",
      "name": "Moteur d'analyse IA",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1648,
        -512
      ],
      "parameters": {
        "color": 5,
        "width": 736,
        "height": 828,
        "content": "## 🤖 AI Analysis Engine\n\n**Powered by GPT-4o**\n\nAnalyzes candidates across:\n- Technical skills alignment\n- Experience relevance  \n- Cultural fit indicators\n- Growth potential\n- Risk factors\n\nOutputs structured JSON with:\n- Strengths & weaknesses\n- Risk/opportunity assessment\n- 1-10 scoring with justification\n- Next steps recommendation"
      },
      "typeVersion": 1
    },
    {
      "id": "087335ab-ae10-46c5-8608-eafa51d47ed7",
      "name": "Obtenir le Doc",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -3088,
        128
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {
          "googleFileConversion": {
            "conversion": {
              "docsToFormat": "application/pdf"
            }
          }
        },
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "IPz4dCJVFC8uaoHw",
          "name": "Google Drive account 2"
        }
      },
      "typeVersion": 3
    }
  ],
  "pinData": {},
  "connections": {
    "087335ab-ae10-46c5-8608-eafa51d47ed7": {
      "main": [
        [
          {
            "node": "899b217d-9258-4fd6-be41-fdd5fe52c5d3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6b5e1a57-2c26-4bbe-b104-99ef776f867c": {
      "main": [
        [
          {
            "node": "2255b19e-1842-4e23-9fcf-0c69b036226b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ea66c7e3-1572-4824-8eae-a5b637e5df33": {
      "ai_languageModel": [
        [
          {
            "node": "53dbdfb5-0e9e-4e03-81d3-ed01714978ba",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "df2d7bc1-4628-4a08-8a55-6de9111eea4c",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "57f8e9fb-3175-4975-9775-e134e94eb6e4": {
      "main": [
        [
          {
            "node": "3b4b6746-99e0-4d6b-a620-fc8c89974eee",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "e0a4d380-edc6-48c0-b655-f7ffc2d11603": {
      "main": [
        [
          {
            "node": "37bb352f-14f9-4286-9a0b-9b3e3680f733",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "64cf332a-2691-4181-a244-4cc18f9a1b13": {
      "main": [
        [
          {
            "node": "ee8c0749-6302-420d-9fff-cb57dfef3b9e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0a211848-c56f-4602-a8f5-e0a63e9c0631": {
      "main": [
        [
          {
            "node": "53dbdfb5-0e9e-4e03-81d3-ed01714978ba",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c84f6d81-dec5-458d-b298-617752318f87": {
      "main": [
        [
          {
            "node": "e0a4d380-edc6-48c0-b655-f7ffc2d11603",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ee8c0749-6302-420d-9fff-cb57dfef3b9e": {
      "main": [
        [
          {
            "node": "cd20f833-a887-46c4-9702-94e53780552d",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "56635bec-8887-4b1d-90fd-a4cf35484f57",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "37bb352f-14f9-4286-9a0b-9b3e3680f733": {
      "main": [
        [
          {
            "node": "6ee6f742-ce91-4bdc-a3ea-769a06cf2512",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "95d4e4e5-63bd-4a2b-bc26-ea15144d76af",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "899b217d-9258-4fd6-be41-fdd5fe52c5d3": {
      "main": [
        [
          {
            "node": "ee8c0749-6302-420d-9fff-cb57dfef3b9e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3b4b6746-99e0-4d6b-a620-fc8c89974eee": {
      "main": [
        [
          {
            "node": "5c692947-9802-43d7-848a-61d9fa01f02a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "95d4e4e5-63bd-4a2b-bc26-ea15144d76af": {
      "main": [
        [
          {
            "node": "3b4b6746-99e0-4d6b-a620-fc8c89974eee",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e5ac2a2d-bbdd-4582-b019-d8ba5ba6c57c": {
      "main": [
        [
          {
            "node": "168334bc-97c8-490b-a1fc-0acb8066912d",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "f7b1385e-6a0a-470c-93cd-55ba1da56ee4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "825c2125-1914-4e4b-9d6e-b67a2e3b11ce": {
      "main": [
        [
          {
            "node": "3b4b6746-99e0-4d6b-a620-fc8c89974eee",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "6ee6f742-ce91-4bdc-a3ea-769a06cf2512": {
      "main": [
        [
          {
            "node": "087335ab-ae10-46c5-8608-eafa51d47ed7",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "3f93e040-46e2-4c71-b0b2-548bcfe04235",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "6b5e1a57-2c26-4bbe-b104-99ef776f867c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2255b19e-1842-4e23-9fcf-0c69b036226b": {
      "main": [
        [
          {
            "node": "ee8c0749-6302-420d-9fff-cb57dfef3b9e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "101a971e-3fae-445e-96ac-878650a6d14a": {
      "main": [
        [
          {
            "node": "df2d7bc1-4628-4a08-8a55-6de9111eea4c",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "57f8e9fb-3175-4975-9775-e134e94eb6e4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3f93e040-46e2-4c71-b0b2-548bcfe04235": {
      "main": [
        [
          {
            "node": "64cf332a-2691-4181-a244-4cc18f9a1b13",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "87bae272-a305-4573-b651-8a0428d13fce": {
      "main": [
        [
          {
            "node": "0a211848-c56f-4602-a8f5-e0a63e9c0631",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "825c2125-1914-4e4b-9d6e-b67a2e3b11ce",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "56635bec-8887-4b1d-90fd-a4cf35484f57": {
      "main": [
        [
          {
            "node": "3b4b6746-99e0-4d6b-a620-fc8c89974eee",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "f7b1385e-6a0a-470c-93cd-55ba1da56ee4": {
      "main": [
        [
          {
            "node": "3b4b6746-99e0-4d6b-a620-fc8c89974eee",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "53dbdfb5-0e9e-4e03-81d3-ed01714978ba": {
      "main": [
        [
          {
            "node": "101a971e-3fae-445e-96ac-878650a6d14a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "df2d7bc1-4628-4a08-8a55-6de9111eea4c": {
      "main": [
        [
          {
            "node": "e5ac2a2d-bbdd-4582-b019-d8ba5ba6c57c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5c692947-9802-43d7-848a-61d9fa01f02a": {
      "main": [
        [
          {
            "node": "803eb0cb-f941-44cb-89dc-3813ec26d3c9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "cd20f833-a887-46c4-9702-94e53780552d": {
      "main": [
        [
          {
            "node": "87bae272-a305-4573-b651-8a0428d13fce",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "416be5d3-78da-4837-b312-5edd184216b5": {
      "ai_outputParser": [
        [
          {
            "node": "53dbdfb5-0e9e-4e03-81d3-ed01714978ba",
            "type": "ai_outputParser",
            "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é - Création de contenu, 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œuds34
Catégorie2
Types de nœuds15
Description de la difficulté

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

Auteur
David Olusola

David Olusola

@dae221

I design enterprise-grade automation systems that eliminate bottlenecks, cut manual work by 70%+, and unlock millions in lost revenue opportunities. My clients — typically achieve 5–10x ROI within the first 90 days. Currently partnering with select high-growth companies ready to scale faster with AI automation. david@daexai.com

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34