8
n8n 中文网amn8n.com

从 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)可能需要您自行付费。

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

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

外部链接
在 n8n.io 查看

分享此工作流