๐ฅ AI ๊ธฐ๋ฐ HR ์ํฌํ๋ก: Gmail์์ Sheets๋ก์ ์ด๋ ฅ์ ๋ถ์ ๋ฐ ํ๊ฐ - ๋น๋์ค
์ด๊ฒ์HR, AI Summarization๋ถ์ผ์์๋ํ ์ํฌํ๋ก์ฐ๋ก, 18๊ฐ์ ๋ ธ๋๋ฅผ ํฌํจํฉ๋๋ค.์ฃผ๋ก Switch, GmailTool, GoogleDrive, GmailTrigger, GoogleSheets ๋ฑ์ ๋ ธ๋๋ฅผ ์ฌ์ฉํ๋ฉฐ. GPT-4o-mini๋ฅผ ์ฌ์ฉํ ์ด๋ ฅ์ ์คํฌ๋ฆฌ๋ ์๋ํ: Gmail์์ Google Sheets๋ก์ ์ธ์ ์์ ํ๊ฐ ์์คํ
- โขGoogle ๊ณ์ ๋ฐ Gmail API ์ธ์ฆ ์ ๋ณด
- โขGoogle Drive API ์ธ์ฆ ์ ๋ณด
- โขGoogle Sheets API ์ธ์ฆ ์ ๋ณด
- โขOpenAI API Key
์ฌ์ฉ๋ ๋ ธ๋ (18)
{
"id": "z7quMO0WgEu3Kkyv",
"meta": {
"instanceId": "a2b23892dd6989fda7c1209b381f5850373a7d2b85609624d7c2b7a092671d44",
"templateCredsSetupCompleted": true
},
"name": "๐ฅ AI-Powered HR Workflow: CV Analysis and Evaluation from Gmail to Sheets - vide",
"tags": [],
"nodes": [
{
"id": "2ebf8f4d-1000-4c40-8d5f-e31fa0ada941",
"name": "๋ฉ๋ชจ์ง",
"type": "n8n-nodes-base.stickyNote",
"position": [
2540,
-240
],
"parameters": {
"width": 920,
"height": 400,
"content": "# ๐ก Step 1 โ Detect and Process New CV from Email"
},
"typeVersion": 1
},
{
"id": "175a65ff-d1c4-404e-bab1-7805123a0ce9",
"name": "๋ฉ๋ชจ์ง1",
"type": "n8n-nodes-base.stickyNote",
"position": [
2540,
200
],
"parameters": {
"color": 3,
"width": 920,
"height": 500,
"content": "# ๐ด Step 2 โ Extract and Store Candidate Data\n"
},
"typeVersion": 1
},
{
"id": "1061bc84-9cb8-4391-a057-04e7d1aac10e",
"name": "๋ฉ๋ชจ์ง2",
"type": "n8n-nodes-base.stickyNote",
"position": [
3520,
200
],
"parameters": {
"color": 6,
"width": 920,
"height": 500,
"content": "# ๐ฃ Step 3 โ Evaluate and Qualify the Candidate\n"
},
"typeVersion": 1
},
{
"id": "a6395a4c-3c06-4175-8927-3f80bde21bcc",
"name": "๋ฉ๋ชจ์ง3",
"type": "n8n-nodes-base.stickyNote",
"position": [
3520,
-240
],
"parameters": {
"width": 920,
"height": 400,
"content": " ## AI-Powered HR Workflow: CV Analysis and Evaluation from Gmail to Sheets\n\n### ๐ Before you get started, make sure you have:\n\n- โ
[n8n installed](https://www.hostg.xyz/SHHOJ) *(self-hosted required for Gmail + OpenAI + Google integrations)*\n- โ
[OpenAI API Key](https://platform.openai.com/api-keys)\n- โ
[Google Sheets API enabled](https://console.cloud.google.com/apis/api/sheets.googleapis.com/overview) in Google Cloud Console\n- โ
[Google Drive API enabled](https://console.cloud.google.com/apis/api/drive.googleapis.com/overview) in Google Cloud Console\n- โ
[OAuth 2.0 Client ID and Secret](https://console.cloud.google.com/apis/credentials) created in Google Cloud (required for Gmail, Drive, and Sheets nodes)\n\n> Make sure youโve authorized n8n to access these services using the credentials above before running the workflow.\n"
},
"typeVersion": 1
},
{
"id": "3575cc8d-18b8-436d-a026-b022814fbd3d",
"name": "Gmail: ์ ์ด๋ ฅ์ ํ์ธ",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
2640,
-140
],
"parameters": {
"simple": false,
"filters": {
"q": "has:attachment",
"labelIds": [
"UNREAD"
],
"readStatus": "unread"
},
"options": {
"downloadAttachments": true
},
"pollTimes": {
"item": [
{
"mode": "everyHour",
"minute": 1
}
]
}
},
"credentials": {
"gmailOAuth2": {
"id": "rKxQHWZ2F5XLJmwF",
"name": "Gmail account"
}
},
"typeVersion": 1.2
},
{
"id": "e1d682f8-9723-4dd6-ad45-e8959a273d32",
"name": "์ด๋ฉ์ผ ์ ํ ๋ถ๋ฅ",
"type": "@n8n/n8n-nodes-langchain.textClassifier",
"position": [
2860,
-140
],
"parameters": {
"options": {
"systemPromptTemplate": "Classify the user's text into one of the following categories: {categories}.\nFollow the formatting instructions provided below exactly.\nDo not include any explanation โ output only the final JSON result."
},
"inputText": "={{ $json.text }}",
"categories": {
"categories": [
{
"category": "Doesn't apply",
"description": "The candidate is not a job application"
},
{
"category": "Apply",
"description": "This is a job application submitted by a candidate applying for a position at our organization, included as an attached file."
}
]
}
},
"typeVersion": 1
},
{
"id": "5f241a19-c30a-4cc4-a2c0-7e9d97711c78",
"name": "OpenAI ๋ชจ๋ธ โ ์ด๋ฉ์ผ ๋ถ๋ฅ๊ธฐ",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
2860,
20
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "6h3DfVhNPw9I25nO",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "848188ac-52fa-43b7-953f-b2cd45c727f1",
"name": "๊ฑด๋๋ฐ๊ธฐ (์ฑ์ฉ ์ง์์๊ฐ ์๋ ๊ฒฝ์ฐ)",
"type": "n8n-nodes-base.noOp",
"position": [
3280,
-140
],
"parameters": {},
"typeVersion": 1
},
{
"id": "fe0e8d5c-e3f6-4098-891b-0fb3594b71c8",
"name": "์ด๋ ฅ์ ํ
์คํธ ์ถ์ถ (PDF)",
"type": "n8n-nodes-base.extractFromFile",
"position": [
2900,
520
],
"parameters": {
"options": {},
"operation": "pdf",
"binaryPropertyName": "attachment_0"
},
"typeVersion": 1
},
{
"id": "49107c53-eb76-4082-9d52-88d3fc391153",
"name": "์ด๋ ฅ์๋ฅผ Google Drive์ ์ ์ฅ",
"type": "n8n-nodes-base.googleDrive",
"position": [
2900,
300
],
"parameters": {
"name": "={{ $('Gmail: Watch for new CV').item.json.from.value[0].address }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive",
"cachedResultUrl": "https://drive.google.com/drive/my-drive",
"cachedResultName": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1G0KjVS_NAnqbqzYlV93KpX3498G5J8b1",
"cachedResultUrl": "https://drive.google.com/drive/folders/1G0KjVS_NAnqbqzYlV93KpX3498G5J8b1",
"cachedResultName": "CV - HR"
},
"inputDataFieldName": "=attachment_0"
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "gzeHMd64HAz6HBIe",
"name": "Google Drive account"
}
},
"typeVersion": 3
},
{
"id": "b5d472bf-4acf-4e86-aeb7-5d1604ded5ff",
"name": "์ฑ์ฉ ๊ณต๊ณ ์ธ๋ถ ์ ๋ณด ์กฐํ (Google Sheets)",
"type": "n8n-nodes-base.googleSheets",
"position": [
3280,
520
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "id",
"value": "="
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "="
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "51us92xkOlrvArhV",
"name": "Google Sheets account"
}
},
"typeVersion": 4.6,
"alwaysOutputData": true
},
{
"id": "9b09d2ba-7669-4f64-8a77-ee5ff5280d72",
"name": "AI ์์ด์ ํธ: ์ด๋ ฅ์ ํ๊ฐ",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
3620,
300
],
"parameters": {
"text": "=Here is the resume:\n{{ $('Extract Resume Text (PDF)').item.json.text }}\n\nAnalyze the current information from the received candidate and score between 0 to 10 the said candidate, 0 meaning not a good fit for the position, 10 being outstanding for the job.\n\nJob Tile : {{ $json['Title offer'] }}\nJob Description: {{ $json.Description }}\n\nReply by Email : \nSend a reply to the candidate to confirm that we have received their application and that we will get back to them as soon as possible.",
"options": {
"systemMessage": "=You are an invaluable assistant. You were given a resume. You have to help me analyze the resume and give it a score based on the details available in the resume. Also, extract the name, email, phone, location and LinkedIn profile from the resume.\n\nReply by Email : \nSend a reply to the candidate to confirm that we have received their application and that we will get back to them as soon as possible."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.8
},
{
"id": "85edf215-bfa3-4b93-8f4f-7cede1132797",
"name": "OpenAI ๋ชจ๋ธ โ ์ด๋ ฅ์ ์ ์ ๋งค๊ธฐ๊ธฐ",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
3580,
540
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "o4-mini",
"cachedResultName": "o4-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "6h3DfVhNPw9I25nO",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "90da624b-9653-444f-a36b-9bfe6df4922a",
"name": "ํ์ธ ์ด๋ฉ์ผ ์ ์ก",
"type": "n8n-nodes-base.gmailTool",
"position": [
3760,
540
],
"webhookId": "b56651a5-a82e-4550-ae4e-ffea0304cd52",
"parameters": {
"sendTo": "={{ $('Gmail: Watch for new CV').item.json.from.value[0].address }}",
"message": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Message', ``, 'string') }}",
"options": {},
"subject": "Application Received"
},
"credentials": {
"gmailOAuth2": {
"id": "rKxQHWZ2F5XLJmwF",
"name": "Gmail account"
}
},
"typeVersion": 2.1
},
{
"id": "119808cc-82fb-43d2-931f-351f8e2e3267",
"name": "์ด๋ ฅ์ ํ๊ฐ ๊ฒฐ๊ณผ ํ์ฑ",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
3900,
540
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"name\": {\n\t\t\t\"type\": \"string\"\n\t\t},\n \"email\": {\n\t\t\t\"type\": \"string\"\n\t\t},\n \"linkedin\": {\n\t\t\t\"type\": \"string\"\n\t\t},\n \"score\": {\n\t\t\t\"type\": \"string\"\n\t\t},\n \"Phone\": {\n\t\t\t\"type\": \"string\"\n\t\t},\n \"Location\": {\n\t\t\t\"type\": \"string\"\n\t\t}\n\t\t\n\t}\n}"
},
"typeVersion": 1.2
},
{
"id": "e9d2dfb0-0202-422c-a1f1-8d25a19bacc3",
"name": "์ ์๋ฅผ Google Sheets์ ์ ์ฅ",
"type": "n8n-nodes-base.googleSheets",
"position": [
4120,
300
],
"parameters": {
"columns": {
"value": {
"Name": "={{ $json.output.name }}",
"Email": "={{ $('Gmail: Watch for new CV').item.json.from.value[0].address }}",
"Phone": "='{{ $json.output.Phone }}",
"Score": "={{ $json.output.score }}",
"LinkedIn": "={{ $json.output.linkedin }}",
"Location": "={{ $json.output.Location }}",
"Resume text": "={{ $('Extract Resume Text (PDF)').item.json.text }}"
},
"schema": [
{
"id": "Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "LinkedIn",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "LinkedIn",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Phone",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Location",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Location",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Score",
"type": "string",
"display": true,
"required": false,
"displayName": "Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Resume text",
"type": "string",
"display": true,
"required": false,
"displayName": "Resume text",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Link CV",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Link CV",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Email"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"useAppend": true
},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "id",
"value": "="
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "="
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "51us92xkOlrvArhV",
"name": "Google Sheets account"
}
},
"typeVersion": 4.5
},
{
"id": "c931b4a0-a1a4-4c59-85b8-9099064a74d0",
"name": "์ค์์น",
"type": "n8n-nodes-base.switch",
"position": [
2640,
400
],
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e9debd3b-3fa3-425a-bd61-6bf23a3a652b",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "attachment_0",
"rightValue": ""
}
]
}
},
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "f0eabfca-ff5e-4e5d-9b4e-f3f80c7fa5b4",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "attachment_0",
"rightValue": ""
}
]
}
}
]
},
"options": {
"allMatchingOutputs": true
}
},
"typeVersion": 3.2
},
{
"id": "260dae6d-9234-4bab-bb79-d15b4923d801",
"name": "์ด๋ ฅ์๋ฅผ Google Sheets์ ์ ์ฅ",
"type": "n8n-nodes-base.googleSheets",
"position": [
3280,
300
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $('Gmail: Watch for new CV').item.json.from.value[0].address }}",
"Link CV": "={{ $('Save Resume to Google Drive').item.json.webViewLink }}"
},
"schema": [
{
"id": "Name",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "LinkedIn",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "LinkedIn",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Phone",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Location",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Location",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Score",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Resume text",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Resume text",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Link CV",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Link CV",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"useAppend": true
},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "id",
"value": "="
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "="
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "51us92xkOlrvArhV",
"name": "Google Sheets account"
}
},
"typeVersion": 4.5
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "07121905-4a3c-4301-b88e-e1db76c119e3",
"connections": {
"c931b4a0-a1a4-4c59-85b8-9099064a74d0": {
"main": [
[
{
"node": "49107c53-eb76-4082-9d52-88d3fc391153",
"type": "main",
"index": 0
}
],
[
{
"node": "fe0e8d5c-e3f6-4098-891b-0fb3594b71c8",
"type": "main",
"index": 0
}
]
]
},
"e1d682f8-9723-4dd6-ad45-e8959a273d32": {
"main": [
[
{
"node": "848188ac-52fa-43b7-953f-b2cd45c727f1",
"type": "main",
"index": 0
}
],
[
{
"node": "c931b4a0-a1a4-4c59-85b8-9099064a74d0",
"type": "main",
"index": 0
}
]
]
},
"9b09d2ba-7669-4f64-8a77-ee5ff5280d72": {
"main": [
[
{
"node": "e9d2dfb0-0202-422c-a1f1-8d25a19bacc3",
"type": "main",
"index": 0
}
]
]
},
"3575cc8d-18b8-436d-a026-b022814fbd3d": {
"main": [
[
{
"node": "e1d682f8-9723-4dd6-ad45-e8959a273d32",
"type": "main",
"index": 0
}
]
]
},
"90da624b-9653-444f-a36b-9bfe6df4922a": {
"ai_tool": [
[
{
"node": "9b09d2ba-7669-4f64-8a77-ee5ff5280d72",
"type": "ai_tool",
"index": 0
}
]
]
},
"260dae6d-9234-4bab-bb79-d15b4923d801": {
"main": [
[]
]
},
"fe0e8d5c-e3f6-4098-891b-0fb3594b71c8": {
"main": [
[
{
"node": "b5d472bf-4acf-4e86-aeb7-5d1604ded5ff",
"type": "main",
"index": 0
}
]
]
},
"49107c53-eb76-4082-9d52-88d3fc391153": {
"main": [
[
{
"node": "260dae6d-9234-4bab-bb79-d15b4923d801",
"type": "main",
"index": 0
}
]
]
},
"119808cc-82fb-43d2-931f-351f8e2e3267": {
"ai_outputParser": [
[
{
"node": "9b09d2ba-7669-4f64-8a77-ee5ff5280d72",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"85edf215-bfa3-4b93-8f4f-7cede1132797": {
"ai_languageModel": [
[
{
"node": "9b09d2ba-7669-4f64-8a77-ee5ff5280d72",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"5f241a19-c30a-4cc4-a2c0-7e9d97711c78": {
"ai_languageModel": [
[
{
"node": "e1d682f8-9723-4dd6-ad45-e8959a273d32",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"b5d472bf-4acf-4e86-aeb7-5d1604ded5ff": {
"main": [
[
{
"node": "9b09d2ba-7669-4f64-8a77-ee5ff5280d72",
"type": "main",
"index": 0
}
]
]
}
}
}์ด ์ํฌํ๋ก์ฐ๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์?
์์ JSON ๊ตฌ์ฑ ์ฝ๋๋ฅผ ๋ณต์ฌํ์ฌ n8n ์ธ์คํด์ค์์ ์ ์ํฌํ๋ก์ฐ๋ฅผ ์์ฑํ๊ณ "JSON์์ ๊ฐ์ ธ์ค๊ธฐ"๋ฅผ ์ ํํ ํ, ๊ตฌ์ฑ์ ๋ถ์ฌ๋ฃ๊ณ ํ์์ ๋ฐ๋ผ ์ธ์ฆ ์ค์ ์ ์์ ํ์ธ์.
์ด ์ํฌํ๋ก์ฐ๋ ์ด๋ค ์๋๋ฆฌ์ค์ ์ ํฉํ๊ฐ์?
๊ณ ๊ธ - ์ธ์ฌ, AI ์์ฝ
์ ๋ฃ์ธ๊ฐ์?
์ด ์ํฌํ๋ก์ฐ๋ ์์ ํ ๋ฌด๋ฃ์ด๋ฉฐ ์ง์ ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ง, ์ํฌํ๋ก์ฐ์์ ์ฌ์ฉํ๋ ํ์ฌ ์๋น์ค(์: OpenAI API)๋ ์ฌ์ฉ์ ์ง์ ๋น์ฉ์ ์ง๋ถํด์ผ ํ ์ ์์ต๋๋ค.
๊ด๋ จ ์ํฌํ๋ก์ฐ ์ถ์ฒ
Dr. Firas
@drfirasAutomation expert and certified trainer. I create hands-on courses to master automation with n8n. Contact me to access my exclusive training and start building powerful workflows today. ๐
์ด ์ํฌํ๋ก์ฐ ๊ณต์