AIによるGmailからAirtableへの履歴書き選考と応募者スコアリングの自動化
上級
これはHR, AI Summarization分野の自動化ワークフローで、16個のノードを含みます。主にSet, Merge, Airtable, GmailTrigger, ExtractFromFileなどのノードを使用。 GmailからAirtableへのアルバイト選考と応募者スコアリングをAIで自動化
前提条件
- •Airtable API Key
- •Googleアカウント + Gmail API認証情報
- •Google Gemini API Key
使用ノード (16)
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
"meta": {
"instanceId": "689fa22e68cd4198e4ae37f3cc44f498087edd235a867e22515be823bab694c7",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "ba543316-f00d-452d-bdcb-929d264e2c30",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
-464,
400
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.5-flash-preview-04-17"
},
"credentials": {
"googlePalmApi": {
"id": "oN60i7iTnOJLvzUZ",
"name": "said latihan"
}
},
"typeVersion": 1
},
{
"id": "7a05b84b-ed92-4e55-b932-390725dd9cb2",
"name": "Google Gemini Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
464,
400
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.5-flash-preview-04-17"
},
"credentials": {
"googlePalmApi": {
"id": "oN60i7iTnOJLvzUZ",
"name": "said latihan"
}
},
"typeVersion": 1
},
{
"id": "6cc4f324-dcfe-4e9f-8af3-34074306d37b",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
640,
416
],
"parameters": {
"jsonSchemaExample": "{\n\t\"score\": 100,\n\t\"fit_summary\": \"Los Angeles\"\n}"
},
"typeVersion": 1.2
},
{
"id": "b6b4e893-d011-43d8-9453-cb27fa1a54ab",
"name": "新規応募を監視",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-1280,
16
],
"parameters": {
"simple": false,
"filters": {
"q": "has:attachment OR has:document"
},
"options": {
"downloadAttachments": true,
"dataPropertyAttachmentsPrefixName": "CV_"
},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"id": "bz2ymQsAeALCEssA",
"name": "Ryan Google Credentials"
}
},
"typeVersion": 1.2
},
{
"id": "57948245-8761-4b3d-9493-7ec14bdcbfcb",
"name": "求人コードを抽出",
"type": "n8n-nodes-base.set",
"position": [
-624,
-224
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "4f8f7c3f-3f03-4b99-8332-c1131e7807b1",
"name": "=Job Code",
"type": "string",
"value": "={{ ($json.subject.match(/([A-Z]{2}-\\d{3})/) || [])[1] || null }}"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "026ad70e-f96a-4547-88cb-e95d07bb8d1a",
"name": "求人情報を検索",
"type": "n8n-nodes-base.airtable",
"position": [
-224,
-224
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "apppwpxrdT85fG31V",
"cachedResultUrl": "https://airtable.com/apppwpxrdT85fG31V",
"cachedResultName": "UMKM"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblLM8M41XkSaTLxw",
"cachedResultUrl": "https://airtable.com/apppwpxrdT85fG31V/tblLM8M41XkSaTLxw",
"cachedResultName": "Job Posts"
},
"options": {},
"operation": "search",
"filterByFormula": "={Job Code} = '{{ $json[\"Job Code\"] }}'"
},
"credentials": {
"airtableTokenApi": {
"id": "FKcJ1ogNuXHNGNcb",
"name": "Fahmi UMKM"
}
},
"typeVersion": 2.1,
"alwaysOutputData": true
},
{
"id": "31e468c3-3876-4789-bed7-ef9f274d4b0d",
"name": "履歴書(PDF)テキストを読み込み",
"type": "n8n-nodes-base.extractFromFile",
"position": [
-688,
272
],
"parameters": {
"options": {},
"operation": "pdf",
"binaryPropertyName": "CV_0"
},
"typeVersion": 1
},
{
"id": "995b95ca-ee4d-446a-886e-2500c34830c5",
"name": "AI履歴書パーサー",
"type": "@n8n/n8n-nodes-langchain.informationExtractor",
"position": [
-464,
272
],
"parameters": {
"text": "=CV Text: {{ $json.text }}\n\nEmail Subject: {{ $('Watch for New Applications').item.json.subject }}",
"options": {
"systemPromptTemplate": "=You are a professional CV parsing and information extraction agent, specialized in structured data extraction for job applications.\nYour task is to extract only the **relevant attributes** from the applicant's CV text. Return the extracted information in **structured JSON format**, using the keys provided below.\nIf an attribute is not found or not confidently identifiable, you may **omit** that key from the response.\n\n### Extract the following attributes (if available):\n* `job_code`: the code of the job from the Email Subject\n* `name`: Full name of the applicant\n* `email`: Email address\n* `phone`: Phone number\n* `address`: Location or city (optional)\n* `education`: Highest education or relevant qualifications\n* `experience_years`: Estimated total years of relevant work experience\n* `skills`: List of relevant skills\n* `last_position`: Most recent job title or role\n* `last_company`: Most recent company worked at\n* `language`: List of languages spoken (optional)\n* `certifications`: Relevant certificates or training (optional)\n\n### Output Rules:\n* Only include fields that are clearly present in the CV and Email Subject.\n* Format your response as a clean, valid JSON object.\n* Do not include any explanations or extra text—**only return JSON**."
},
"schemaType": "fromJson",
"jsonSchemaExample": "{\n \"job_code\": \"AB-001\",\n \"name\": \"Siti Nurhaliza\",\n \"email\": \"siti.nurhaliza@example.com\",\n \"phone\": \"+62 812-3456-7890\",\n \"address\": \"Jakarta Selatan, Indonesia\",\n \"education\": \"Sarjana Teknik Industri, Universitas Indonesia\",\n \"experience_years\": 3.5,\n \"skills\": [\n \"Meracik Kopi\",\n \"Latte Art\",\n \"Customer Service\",\n \"Manajemen Waktu\"\n ],\n \"last_position\": \"Barista Senior\",\n \"last_company\": \"Kopi Kita Coffeehouse\",\n \"language\": [\n \"Bahasa Indonesia\",\n \"Inggris\"\n ],\n \"certifications\": [\n \"Sertifikat Barista dari SCA\",\n \"Pelatihan Latte Art Profesional\"\n ]\n}"
},
"typeVersion": 1.1
},
{
"id": "d36f4b59-cffc-4fa9-bb92-070630555882",
"name": "求人情報と履歴書データを結合",
"type": "n8n-nodes-base.merge",
"position": [
32,
192
],
"parameters": {
"mode": "combine",
"options": {},
"advanced": true,
"mergeByFields": {
"values": [
{
"field1": "Job Code",
"field2": "output.job_code"
}
]
}
},
"typeVersion": 3.2
},
{
"id": "17a29a4a-c659-48ba-be25-2a38de28cc58",
"name": "AI候補者評価",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
448,
192
],
"parameters": {
"text": "=You are given the following job requirements and a candidate's CV data.\nPlease evaluate the match and return a score from 1 to 100, along with a brief summary of your reasoning.\n\n---\n\n Job Post Data:\n- Job Title: {{ $json['Job Title'] }}\n- Required Skills: {{ $json['Required Skills'].join(', ') }}\n- Minimum Experience: {{ $json['Minimum Experience (Years)'] }} years\n- Job Description: {{ $json['Job Description'] }}\n\n---\n Applicant CV Data:\n- Name: {{ $json.output.name }}\n- Email: {{ $json.output.email }}\n- Phone: {{ $json.output.phone }}\n- Education: {{ $json.output.education }}\n- Experience: {{ $json.output.experience_years }} years\n- Skills: {{ $json.output.skills.join(', ') }}\n- Last Position: {{ $json.output.last_position }}\n- Last Company: {{ $json.output.last_company }}\n- Language: {{ $json.output.language.join(', ') }}\n- Certifications: {{ $json.output.certifications }}",
"batching": {},
"messages": {
"messageValues": [
{
"message": "=You are a professional job application evaluator and recruitment assistant. Your role is to assess the suitability of job applicants based on their CV data and compare it with the job's requirements. You must return a structured JSON response with the following keys: - `score`: A number between 1–100 that reflects how well the applicant matches the job. - `fit_summary`: A short, clear explanation (max 2 sentences) of why you gave that score. Scoring is based primarily on: - Skill match (technical and soft skills) - Relevant experience (including job titles and industries) - Education or certification (if required) - Language and communication skills (optional) Be objective and consistent in your evaluations and use BAHASA INDONESIA. Only give high scores to applicants that strongly match the role requirements. Do not include any extra commentary — only return JSON."
}
]
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.7
},
{
"id": "ad1babe0-ccfb-4941-9b86-cf59ad6c77ca",
"name": "候補者情報を保存",
"type": "n8n-nodes-base.airtable",
"position": [
1136,
192
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "apppwpxrdT85fG31V",
"cachedResultUrl": "https://airtable.com/apppwpxrdT85fG31V",
"cachedResultName": "UMKM"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblkWxuaAvw0GmeCT",
"cachedResultUrl": "https://airtable.com/apppwpxrdT85fG31V/tblkWxuaAvw0GmeCT",
"cachedResultName": "Applications"
},
"columns": {
"value": {
"Notes": "={{ $json.output.fit_summary }}",
"Score": "={{ $json.output.score }}",
"Job Post": "={{ $('Combine Job & CV Data').item.json['Job Code'] }}",
"Email Address": "={{ $('Combine Job & CV Data').item.json.output.email }}",
"Applicant Name": "={{ $('Combine Job & CV Data').item.json.output.name }}",
"Years of Experience": 0
},
"schema": [
{
"id": "Application ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Application ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Job Post",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Job Post",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Applicant Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Applicant Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email Address",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Email Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "CV File",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "CV File",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Parsed Skills",
"type": "array",
"display": true,
"options": [],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Parsed Skills",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Years of Experience",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Years of Experience",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Score",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "options",
"display": true,
"options": [
{
"name": "Pending",
"value": "Pending"
},
{
"name": "Shortlisted",
"value": "Shortlisted"
},
{
"name": "Rejected",
"value": "Rejected"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Received At",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Received At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Raw Subject",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Raw Subject",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Notes",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Notes",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Auto ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Auto ID",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"id": "FKcJ1ogNuXHNGNcb",
"name": "Fahmi UMKM"
}
},
"typeVersion": 2.1
},
{
"id": "25eb8342-394c-4165-9696-3d15097beae2",
"name": "付箋1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2272,
-1104
],
"parameters": {
"width": 656,
"height": 1152,
"content": "## Automate CV Screening and Applicant Scoring from Gmail to Airtable with AI\n**This workflow automates the CV screening process using AI. It monitors a Gmail inbox for incoming applications, extracts and scores CVs based on job requirements stored in Airtable, and logs structured applicant data—saving hours of manual work.**\n\n### How It Works\n1. **Trigger**\n Watches for new emails with attachments in a Gmail label.\n2. **Extract Data**\n * Extracts job code from the email subject (e.g., `FN-001`)\n * Extracts raw text from the attached CV (PDF)\n3. **AI Parsing**\n Uses Google Gemini to parse the CV and extract:\n * Name\n * Email\n * Years of experience\n * Skills\n4. **Job Lookup**\n Uses the extracted job code to retrieve job details from Airtable.\n5. **AI Scoring**\n * Compares applicant data with job requirements\n * Scores from 1–100\n * Generates a brief reasoning summary (in Bahasa Indonesia)\n6. **Log to Airtable**\n Saves applicant data, score, and AI notes to the \"Applications\" table.\n\n### Setup Instructions\n1. **Prepare Airtable Base**\n * **Job Posts Table**\n * Columns: Job Code, Job Title, Required Skills, Minimum Experience, Job Description\n * **Applications Table**\n * Columns: Applicant Name, Email, Score, Notes\n * Include a linked field to the Job Posts table\n2. **Add Credentials in n8n**\n * Gmail\n * Google AI (Gemini)\n * Airtable\n3. **Configure Nodes**\n * **Trigger**: Set Gmail filter (e.g., `label:job-applications`)\n * **Extract Job Code**: Verify regex format, default is `([A-Z]{2}-\\d{3})`\n * **Airtable Nodes**: Select your base and table in:\n * \"Find Job Post...\"\n * \"Save Applicant...\"\n4. **Activate Workflow**\n * Save and enable the workflow\n * New applications will be processed automatically\n\n"
},
"typeVersion": 1
},
{
"id": "5782b22a-f17c-4dd3-bf59-c1929d3d70fe",
"name": "付箋",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1456,
-32
],
"parameters": {
"width": 368,
"height": 224,
"content": "## Watches for email with attachments"
},
"typeVersion": 1
},
{
"id": "7a32ee3d-51b3-48a5-88f6-6b1de399f318",
"name": "付箋2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-736,
-336
],
"parameters": {
"width": 688,
"height": 272,
"content": "## Fetch the Job Post In Airtable\nUses Regex to find a code like FN-001 in the email subject and use it to find the Job Post in Airtable\n\n\n"
},
"typeVersion": 1
},
{
"id": "17e071af-7f26-4c72-a528-9fa8cc026aca",
"name": "付箋3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-768,
176
],
"parameters": {
"width": 688,
"height": 352,
"content": "## Extract and Parse the CV Information\nGemini AI reads the CV text and extracts key info (name, skills, etc.) into structured JSON.\n\n\n"
},
"typeVersion": 1
},
{
"id": "8edcc4d8-58ec-422b-b6c2-df7b883f83cc",
"name": "付箋4",
"type": "n8n-nodes-base.stickyNote",
"position": [
368,
64
],
"parameters": {
"width": 448,
"height": 496,
"content": "## Score Applicant with AI\nCompares the CV to the job details and generates a score (1-100) and a summary.\n\n\n"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"995b95ca-ee4d-446a-886e-2500c34830c5": {
"main": [
[
{
"node": "d36f4b59-cffc-4fa9-bb92-070630555882",
"type": "main",
"index": 1
}
]
]
},
"026ad70e-f96a-4547-88cb-e95d07bb8d1a": {
"main": [
[
{
"node": "d36f4b59-cffc-4fa9-bb92-070630555882",
"type": "main",
"index": 0
}
]
]
},
"57948245-8761-4b3d-9493-7ec14bdcbfcb": {
"main": [
[
{
"node": "026ad70e-f96a-4547-88cb-e95d07bb8d1a",
"type": "main",
"index": 0
}
]
]
},
"31e468c3-3876-4789-bed7-ef9f274d4b0d": {
"main": [
[
{
"node": "995b95ca-ee4d-446a-886e-2500c34830c5",
"type": "main",
"index": 0
}
]
]
},
"17a29a4a-c659-48ba-be25-2a38de28cc58": {
"main": [
[
{
"node": "ad1babe0-ccfb-4941-9b86-cf59ad6c77ca",
"type": "main",
"index": 0
}
]
]
},
"d36f4b59-cffc-4fa9-bb92-070630555882": {
"main": [
[
{
"node": "17a29a4a-c659-48ba-be25-2a38de28cc58",
"type": "main",
"index": 0
}
]
]
},
"ba543316-f00d-452d-bdcb-929d264e2c30": {
"ai_languageModel": [
[
{
"node": "995b95ca-ee4d-446a-886e-2500c34830c5",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"6cc4f324-dcfe-4e9f-8af3-34074306d37b": {
"ai_outputParser": [
[
{
"node": "17a29a4a-c659-48ba-be25-2a38de28cc58",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"7a05b84b-ed92-4e55-b932-390725dd9cb2": {
"ai_languageModel": [
[
{
"node": "17a29a4a-c659-48ba-be25-2a38de28cc58",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"b6b4e893-d011-43d8-9453-cb27fa1a54ab": {
"main": [
[
{
"node": "57948245-8761-4b3d-9493-7ec14bdcbfcb",
"type": "main",
"index": 0
},
{
"node": "31e468c3-3876-4789-bed7-ef9f274d4b0d",
"type": "main",
"index": 0
}
]
]
}
}
}よくある質問
このワークフローの使い方は?
上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。
このワークフローはどんな場面に適していますか?
上級 - 人事, AI要約
有料ですか?
このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。
関連ワークフロー
Gemini AIとDecodoクローラーを使用して履歴書と職務を自動マッチング
Gemini AIとDecodoクローラーで履歴書を職位に自動一致させる
Set
Gmail
Merge
+
Set
Gmail
Merge
20 ノードFahmi Fahreza
人事
私のワークフロー3
AI、Gmail、Google Drive、Airtableを使用した自動 résumé スクリーニングとスコアリング
Set
Code
Merge
+
Set
Code
Merge
23 ノードusamaahmed
人事
第一轮 Telegram と LinkedIn 快速通道 AI 招聘アシスタント
AI候选人筛选流程:LinkedInへTelegram,統合Gemini与Apify
If
Set
Code
+
If
Set
Code
55 ノードDean Pike
人事
Decodo、GeminiでTrustpilotとSitejabberの感情分析をSheetsに保存
DecodoとGeminiでTrustpilotとSitejabberの感情分析をSheetsに保存
Set
Merge
Form Trigger
+
Set
Merge
Form Trigger
18 ノードFahmi Fahreza
市場調査
リジュームと職位説明書の一致
Gemini LLM、Gmail、Notion ジョブ アーカイブを使った自動再履歴スコアリング
Wait
Gmail
Merge
+
Wait
Gmail
Merge
22 ノードAgentick AI
人事
n8nノードの探索(可視化リファレンスライブラリ内)
n8nノードを可視化リファレンスライブラリで探索
If
Ftp
Set
+
If
Ftp
Set
113 ノードI versus AI
その他