스킬 매트릭스 추출기
이것은Miscellaneous, AI Summarization, Multimodal AI분야의자동화 워크플로우로, 17개의 노드를 포함합니다.주로 Code, GoogleDrive, GoogleSheets, ManualTrigger, Agent 등의 노드를 사용하며. Google Drive와 GPT-4o를 사용하여 기술 행렬을 Google 스프레드시트에 추출
- •Google Drive API 인증 정보
- •Google Sheets API 인증 정보
- •OpenAI API Key
{
"id": "I2RxYTHy30vIWRmh",
"meta": {
"instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
"templateCredsSetupCompleted": true
},
"name": "Skill matrix extractor",
"tags": [],
"nodes": [
{
"id": "7119286f-4f1b-41ac-9aa0-8e0ba5e9a2be",
"name": "워크플로 실행 시",
"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": "이력서 검색",
"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": "이력서 다운로드",
"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": "파일에서 내용 추출",
"type": "n8n-nodes-base.extractFromFile",
"position": [
672,
0
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "fdece73f-e3a0-4678-bd79-733f91ac38f3",
"name": "스킬 분석기",
"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": "구문 분석 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": "스티키 노트",
"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": "스티키 노트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": "스티키 노트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": "스티키 노트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": "스티키 노트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": "스티키 노트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": "스티키 노트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": "스티키 노트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": "스티키 노트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": "스킬 매트릭스로 시트 업데이트",
"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
}
]
]
}
}
}이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 기타, AI 요약, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
Rahul Joshi
@rahul08Rahul 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.
이 워크플로우 공유