8
n8n 中文网amn8n.com

使用AI自动化从Gmail到Airtable的简历筛选和申请人评分

高级

这是一个HR, AI Summarization领域的自动化工作流,包含 16 个节点。主要使用 Set, Merge, Airtable, GmailTrigger, ExtractFromFile 等节点。 使用AI自动化从Gmail到Airtable的简历筛选和申请人评分

前置要求
  • Airtable API Key
  • Google 账号和 Gmail API 凭证
  • Google Gemini API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "meta": {
    "instanceId": "689fa22e68cd4198e4ae37f3cc44f498087edd235a867e22515be823bab694c7",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "ba543316-f00d-452d-bdcb-929d264e2c30",
      "name": "Google Gemini 聊天模型",
      "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聊天模型1",
      "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": "结构化输出解析器",
      "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": "## 使用 AI 自动化从 Gmail 到 Airtable 的简历筛选和申请人评分"
      },
      "typeVersion": 1
    },
    {
      "id": "5782b22a-f17c-4dd3-bf59-c1929d3d70fe",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1456,
        -32
      ],
      "parameters": {
        "width": 368,
        "height": 224,
        "content": "## 监控带有附件的邮件"
      },
      "typeVersion": 1
    },
    {
      "id": "7a32ee3d-51b3-48a5-88f6-6b1de399f318",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -736,
        -336
      ],
      "parameters": {
        "width": 688,
        "height": 272,
        "content": "## 在 Airtable 中获取职位发布"
      },
      "typeVersion": 1
    },
    {
      "id": "17e071af-7f26-4c72-a528-9fa8cc026aca",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -768,
        176
      ],
      "parameters": {
        "width": 688,
        "height": 352,
        "content": "## 提取和解析简历信息"
      },
      "typeVersion": 1
    },
    {
      "id": "8edcc4d8-58ec-422b-b6c2-df7b883f83cc",
      "name": "便签说明4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        368,
        64
      ],
      "parameters": {
        "width": 448,
        "height": 496,
        "content": "## 使用 AI 为申请人评分"
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "AI CV Parser": {
      "main": [
        [
          {
            "node": "Combine Job & CV Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Find Job Post": {
      "main": [
        [
          {
            "node": "Combine Job & CV Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Job Code": {
      "main": [
        [
          {
            "node": "Find Job Post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read CV (PDF) Text": {
      "main": [
        [
          {
            "node": "AI CV Parser",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Applicant Scorer": {
      "main": [
        [
          {
            "node": "Save Applicant",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine Job & CV Data": {
      "main": [
        [
          {
            "node": "AI Applicant Scorer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI CV Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Applicant Scorer",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "AI Applicant Scorer",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Watch for New Applications": {
      "main": [
        [
          {
            "node": "Extract Job Code",
            "type": "main",
            "index": 0
          },
          {
            "node": "Read CV (PDF) Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级 - 人力资源, AI 摘要总结

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量16
分类2
节点类型10
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

作者
Fahmi Fahreza

Fahmi Fahreza

@fahmiiireza

Backend Developer turns to AI Automation Developer

外部链接
在 n8n.io 查看

分享此工作流