从 Excel 申请工作并跟踪申请状态
高级
这是一个Personal Productivity, Multimodal AI领域的自动化工作流,包含 24 个节点。主要使用 If, Set, Cron, Gmail, Filter 等节点。 基于 LinkedIn、Indeed 和 Google Sheets 的自动化职位申请与状态追踪
前置要求
- •Google 账号和 Gmail API 凭证
- •可能需要目标 API 的认证凭证
- •Google Sheets API 凭证
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"name": "从 Excel 申请工作并跟踪申请状态",
"tags": [
{
"id": "job-automation",
"name": "Job Automation",
"createdAt": "2025-01-15T00:00:00.000Z",
"updatedAt": "2025-01-15T00:00:00.000Z"
}
],
"nodes": [
{
"id": "template-overview",
"name": "📋 模板概览",
"type": "n8n-nodes-base.stickyNote",
"position": [
380,
160
],
"parameters": {
"color": 4,
"width": 389,
"height": 464,
"content": "## 🎯 工作申请自动化系统"
},
"typeVersion": 1
},
{
"id": "sheet-structure",
"name": "📊 表格结构",
"type": "n8n-nodes-base.stickyNote",
"position": [
820,
160
],
"parameters": {
"color": 7,
"width": 295,
"height": 284,
"content": "## 📊 Excel 表格结构"
},
"typeVersion": 1
},
{
"id": "setup-notes",
"name": "⚙️ 设置说明",
"type": "n8n-nodes-base.stickyNote",
"position": [
1180,
160
],
"parameters": {
"color": 6,
"width": 295,
"height": 224,
"content": "## 🔧 配置设置"
},
"typeVersion": 1
},
{
"id": "daily-trigger",
"name": "🕘 每日申请触发器",
"type": "n8n-nodes-base.cron",
"position": [
240,
480
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 9 * * 1-5"
}
]
}
},
"typeVersion": 1
},
{
"id": "configuration",
"name": "⚙️ 配置",
"type": "n8n-nodes-base.set",
"position": [
460,
480
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "spreadsheet-id",
"name": "spreadsheetId",
"type": "string",
"value": "REPLACE_WITH_YOUR_GOOGLE_SHEET_ID"
},
{
"id": "resume-url",
"name": "resumeUrl",
"type": "string",
"value": "https://drive.google.com/file/d/YOUR_RESUME_ID/view"
},
{
"id": "cover-letter",
"name": "coverLetterTemplate",
"type": "string",
"value": "Dear Hiring Manager,\n\nI am excited to apply for the {{position}} role at {{company}}. With my experience in software development and {{skills}}, I believe I would be a valuable addition to your team.\n\nI am particularly drawn to {{company}} because of your innovation in the tech industry. I would love to contribute to your continued success.\n\nBest regards,\nYour Name"
},
{
"id": "user-email",
"name": "userEmail",
"type": "string",
"value": "your-email@example.com"
}
]
}
},
"typeVersion": 3
},
{
"id": "read-jobs",
"name": "📖 读取工作表格",
"type": "n8n-nodes-base.googleSheets",
"position": [
680,
480
],
"parameters": {
"range": "A:J",
"keyRow": 1,
"dataMode": "autoMapInputData",
"sheetName": "Jobs",
"documentId": "={{ $json.spreadsheetId }}",
"requestMethod": "GET",
"authentication": "oAuth2"
},
"typeVersion": 4
},
{
"id": "filter-pending",
"name": "🎯 筛选待处理申请",
"type": "n8n-nodes-base.filter",
"position": [
900,
480
],
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "not-applied",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.Status }}",
"rightValue": "Not Applied"
},
{
"id": "has-url",
"operator": {
"type": "string",
"operation": "isNotEmpty"
},
"leftValue": "={{ $json.Job_URL }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "split-jobs",
"name": "🔄 逐个处理工作",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1120,
480
],
"parameters": {
"options": {
"reset": false
},
"batchSize": 1
},
"typeVersion": 3
},
{
"id": "prepare-data",
"name": "📝 准备申请数据",
"type": "n8n-nodes-base.set",
"position": [
1340,
480
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "job-platform",
"name": "platform",
"type": "string",
"value": "={{ $json.Job_URL.includes('linkedin.com') ? 'linkedin' : $json.Job_URL.includes('indeed.com') ? 'indeed' : 'generic' }}"
},
{
"id": "personalized-cover",
"name": "personalizedCoverLetter",
"type": "string",
"value": "={{ $('Configuration').first().json.coverLetterTemplate.replace('{{position}}', $json.Position).replace('{{company}}', $json.Company).replace('{{skills}}', 'relevant technical skills') }}"
},
{
"id": "application-date",
"name": "applicationDate",
"type": "string",
"value": "={{ $now.format('yyyy-MM-dd') }}"
},
{
"id": "resume-url",
"name": "resumeUrl",
"type": "string",
"value": "={{ $('Configuration').first().json.resumeUrl }}"
}
]
}
},
"typeVersion": 3
},
{
"id": "platform-router",
"name": "🔀 按平台路由",
"type": "n8n-nodes-base.switch",
"position": [
1560,
480
],
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "linkedin-check",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.platform }}",
"rightValue": "linkedin"
}
]
}
},
"typeVersion": 3
},
{
"id": "linkedin-apply",
"name": "💼 通过 LinkedIn 申请",
"type": "n8n-nodes-base.httpRequest",
"position": [
1780,
380
],
"parameters": {
"url": "https://api.linkedin.com/v2/jobs/applications",
"options": {
"retry": {
"enabled": true,
"maxTries": 3
},
"timeout": 30000
},
"sendBody": true,
"sendHeaders": true,
"requestMethod": "POST",
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "jobId",
"value": "={{ $json.Job_ID }}"
},
{
"name": "coverLetter",
"value": "={{ $json.personalizedCoverLetter }}"
},
{
"name": "resumeUrl",
"value": "={{ $json.resumeUrl }}"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"nodeCredentialType": "linkedInOAuth2Api"
},
"typeVersion": 4
},
{
"id": "indeed-apply",
"name": "🔍 通过 Indeed 申请",
"type": "n8n-nodes-base.httpRequest",
"position": [
1780,
580
],
"parameters": {
"url": "https://api.indeed.com/ads/applications",
"options": {
"retry": {
"enabled": true,
"maxTries": 3
},
"timeout": 30000
},
"sendBody": true,
"sendHeaders": true,
"requestMethod": "POST",
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "jobkey",
"value": "={{ $json.Job_ID }}"
},
{
"name": "message",
"value": "={{ $json.personalizedCoverLetter }}"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"nodeCredentialType": "indeedApi"
},
"typeVersion": 4
},
{
"id": "process-result",
"name": "📊 处理申请结果",
"type": "n8n-nodes-base.set",
"position": [
2000,
480
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "application-status",
"name": "applicationStatus",
"type": "string",
"value": "={{ $json.statusCode >= 200 && $json.statusCode < 300 ? 'Applied' : 'Failed' }}"
},
{
"id": "app-id",
"name": "applicationId",
"type": "string",
"value": "={{ $json.body?.applicationId || $json.body?.id || 'AUTO_' + $now.format('yyyyMMddHHmmss') }}"
},
{
"id": "status-notes",
"name": "statusNotes",
"type": "string",
"value": "={{ $json.statusCode >= 200 && $json.statusCode < 300 ? 'Application submitted successfully via ' + $('Prepare Application Data').first().json.platform : 'Application failed: ' + $json.statusCode }}"
},
{
"id": "job-data",
"name": "originalJobData",
"type": "object",
"value": "={{ $('Prepare Application Data').first().json }}"
}
]
}
},
"typeVersion": 3
},
{
"id": "update-status",
"name": "📝 更新工作状态",
"type": "n8n-nodes-base.googleSheets",
"position": [
2220,
480
],
"parameters": {
"range": "D{{ $json.originalJobData.row_index }}:H{{ $json.originalJobData.row_index }}",
"keyRow": 1,
"values": {
"values": [
[
"={{ $json.applicationStatus }}",
"={{ $json.originalJobData.applicationDate }}",
"={{ $json.originalJobData.applicationDate }}",
"={{ $json.applicationId }}",
"={{ $json.statusNotes }}"
]
]
},
"dataMode": "autoMapInputData",
"sheetName": "Jobs",
"documentId": "={{ $('Configuration').first().json.spreadsheetId }}",
"requestMethod": "UPDATE",
"authentication": "oAuth2",
"valueInputMode": "raw"
},
"typeVersion": 4
},
{
"id": "send-notification",
"name": "📧 发送申请通知",
"type": "n8n-nodes-base.gmail",
"position": [
2440,
480
],
"parameters": {
"email": "={{ $('Configuration').first().json.userEmail }}",
"message": "<h3>Application Status Update</h3>\n<p><strong>Company:</strong> {{ $json.originalJobData.Company }}</p>\n<p><strong>Position:</strong> {{ $json.originalJobData.Position }}</p>\n<p><strong>Status:</strong> {{ $json.applicationStatus }}</p>\n<p><strong>Date:</strong> {{ $json.originalJobData.applicationDate }}</p>\n<p><strong>Platform:</strong> {{ $json.originalJobData.platform }}</p>\n<p><strong>Notes:</strong> {{ $json.statusNotes }}</p>\n<p><strong>Application ID:</strong> {{ $json.applicationId }}</p>",
"subject": "Job Application: {{ $json.originalJobData.Company }} - {{ $json.originalJobData.Position }}",
"operation": "sendEmail",
"emailFormat": "html"
},
"typeVersion": 2
},
{
"id": "status-tracking-info",
"name": "📊 状态跟踪信息",
"type": "n8n-nodes-base.stickyNote",
"position": [
380,
740
],
"parameters": {
"color": 7,
"width": 329,
"height": 204,
"content": "## 📈 状态跟踪工作流"
},
"typeVersion": 1
},
{
"id": "status-trigger",
"name": "🕐 状态检查触发器",
"type": "n8n-nodes-base.cron",
"position": [
240,
980
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 10 */2 * *"
}
]
}
},
"typeVersion": 1
},
{
"id": "read-applied",
"name": "📖 读取已申请工作",
"type": "n8n-nodes-base.googleSheets",
"position": [
460,
980
],
"parameters": {
"range": "A:J",
"keyRow": 1,
"dataMode": "autoMapInputData",
"sheetName": "Jobs",
"documentId": "={{ $('Configuration').first().json.spreadsheetId }}",
"requestMethod": "GET",
"authentication": "oAuth2"
},
"typeVersion": 4
},
{
"id": "filter-applied",
"name": "🎯 筛选已申请工作",
"type": "n8n-nodes-base.filter",
"position": [
680,
980
],
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "applied-filter",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.Status }}",
"rightValue": "Applied"
}
]
}
},
"typeVersion": 2
},
{
"id": "split-status",
"name": "🔄 逐个检查状态",
"type": "n8n-nodes-base.splitInBatches",
"position": [
900,
980
],
"parameters": {
"options": {
"reset": false
},
"batchSize": 1
},
"typeVersion": 3
},
{
"id": "mock-status-check",
"name": "🔍 模拟状态检查",
"type": "n8n-nodes-base.set",
"position": [
1120,
980
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "mock-status",
"name": "newStatus",
"type": "string",
"value": "={{ ['Applied', 'Under Review', 'Interview Scheduled', 'Rejected'][Math.floor(Math.random() * 4)] }}"
},
{
"id": "check-date",
"name": "checkDate",
"type": "string",
"value": "={{ $now.format('yyyy-MM-dd') }}"
},
{
"id": "status-notes",
"name": "statusNotes",
"type": "string",
"value": "Status checked automatically via API"
}
]
}
},
"typeVersion": 3
},
{
"id": "status-changed",
"name": "🔄 检查状态是否变更",
"type": "n8n-nodes-base.if",
"position": [
1340,
980
],
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "status-changed",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $json.Status }}",
"rightValue": "={{ $json.newStatus }}"
}
]
}
},
"typeVersion": 2
},
{
"id": "update-changed",
"name": "📝 更新变更状态",
"type": "n8n-nodes-base.googleSheets",
"position": [
1560,
980
],
"parameters": {
"range": "D{{ $json.row_index }}:F{{ $json.row_index }}",
"keyRow": 1,
"values": {
"values": [
[
"={{ $json.newStatus }}",
"={{ $json.Applied_Date }}",
"={{ $json.checkDate }}"
]
]
},
"dataMode": "autoMapInputData",
"sheetName": "Jobs",
"documentId": "={{ $('Configuration').first().json.spreadsheetId }}",
"requestMethod": "UPDATE",
"authentication": "oAuth2",
"valueInputMode": "raw"
},
"typeVersion": 4
},
{
"id": "send-status-update",
"name": "📧 发送状态更新",
"type": "n8n-nodes-base.gmail",
"position": [
1780,
980
],
"parameters": {
"email": "={{ $('Configuration').first().json.userEmail }}",
"message": "<h3>Application Status Changed</h3>\n<p><strong>Company:</strong> {{ $json.Company }}</p>\n<p><strong>Position:</strong> {{ $json.Position }}</p>\n<p><strong>Previous Status:</strong> {{ $json.Status }}</p>\n<p><strong>New Status:</strong> {{ $json.newStatus }}</p>\n<p><strong>Last Checked:</strong> {{ $json.checkDate }}</p>\n<p><strong>Notes:</strong> {{ $json.statusNotes }}</p>",
"subject": "Status Update: {{ $json.Company }} - {{ $json.Position }}",
"operation": "sendEmail",
"emailFormat": "html"
},
"typeVersion": 2
}
],
"settings": {
"executionOrder": "v1"
},
"updatedAt": "2025-01-15T00:00:00.000Z",
"versionId": "1",
"staticData": null,
"connections": {
"⚙️ Configuration": {
"main": [
[
{
"node": "📖 Read Jobs Sheet",
"type": "main",
"index": 0
}
]
]
},
"📖 Read Jobs Sheet": {
"main": [
[
{
"node": "🎯 Filter Pending Applications",
"type": "main",
"index": 0
}
]
]
},
"🔍 Apply via Indeed": {
"main": [
[
{
"node": "📊 Process Application Result",
"type": "main",
"index": 0
}
]
]
},
"📖 Read Applied Jobs": {
"main": [
[
{
"node": "🎯 Filter Applied Jobs",
"type": "main",
"index": 0
}
]
]
},
"📝 Update Job Status": {
"main": [
[
{
"node": "📧 Send Application Notification",
"type": "main",
"index": 0
}
]
]
},
"🔀 Route by Platform": {
"main": [
[
{
"node": "💼 Apply via LinkedIn",
"type": "main",
"index": 0
}
],
[
{
"node": "🔍 Apply via Indeed",
"type": "main",
"index": 0
}
]
]
},
"🔍 Mock Status Check": {
"main": [
[
{
"node": "🔄 Check if Status Changed",
"type": "main",
"index": 0
}
]
]
},
"💼 Apply via LinkedIn": {
"main": [
[
{
"node": "📊 Process Application Result",
"type": "main",
"index": 0
}
]
]
},
"🎯 Filter Applied Jobs": {
"main": [
[
{
"node": "🔄 Check Status One by One",
"type": "main",
"index": 0
}
]
]
},
"🕐 Status Check Trigger": {
"main": [
[
{
"node": "📖 Read Applied Jobs",
"type": "main",
"index": 0
}
]
]
},
"📝 Update Changed Status": {
"main": [
[
{
"node": "📧 Send Status Update",
"type": "main",
"index": 0
}
]
]
},
"🔄 Check Status One by One": {
"main": [
[
{
"node": "🔍 Mock Status Check",
"type": "main",
"index": 0
}
]
]
},
"🔄 Check if Status Changed": {
"main": [
[
{
"node": "📝 Update Changed Status",
"type": "main",
"index": 0
}
]
]
},
"🔄 Process Jobs One by One": {
"main": [
[
{
"node": "📝 Prepare Application Data",
"type": "main",
"index": 0
}
]
]
},
"📝 Prepare Application Data": {
"main": [
[
{
"node": "🔀 Route by Platform",
"type": "main",
"index": 0
}
]
]
},
"🕘 Daily Application Trigger": {
"main": [
[
{
"node": "⚙️ Configuration",
"type": "main",
"index": 0
}
]
]
},
"📊 Process Application Result": {
"main": [
[
{
"node": "📝 Update Job Status",
"type": "main",
"index": 0
}
]
]
},
"🎯 Filter Pending Applications": {
"main": [
[
{
"node": "🔄 Process Jobs One by One",
"type": "main",
"index": 0
}
]
]
}
},
"triggerCount": 2
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - 个人效率, 多模态 AI
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
来自多个招聘网站的求职自动化
使用 5 个招聘平台和 AI 简历生成器自动化求职与申请
If
Set
Code
+14
34 节点Gerald Denor
个人效率
每日WhatsApp摘要与群组级别控制
WhatsApp群组摘要工作流
If
Set
Code
+13
39 节点Luís Philipe Trindade
个人效率
WordPress博客自动化专业版(深度研究)v2.1市场
使用GPT-4o、Perplexity AI和多语言支持自动化SEO优化的博客创建
If
Set
Xml
+27
125 节点Daniel Ng
内容创作
AI潜在客户挖掘智能体
使用Apify、AI和Gmail的自动化潜在客户生成与冷邮件发送
If
Set
Wait
+11
20 节点Rakin Jakaria
潜在客户开发
自动化本地线索查找与冷邮件发送
使用 Apify、AI 和 Gmail 自动查找本地线索并发送冷邮件
If
Set
Wait
+10
18 节点Meak
内容创作
LinkedIn和X病毒内容自动引擎
使用AI生成和发布自动创建LinkedIn和X的病毒内容
If
Set
Wait
+26
156 节点Diptamoy Barman
内容创作