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": "Apply to Jobs from Excel and Track Application Status",
  "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": "## 🎯 Job Application Automation System\n\n**What it does:**\n- Reads job listings from Google Sheets\n- Automatically applies to jobs with personalized cover letters\n- Tracks application status every 2 days\n- Sends email notifications for updates\n- Maintains complete application history\n\n**Who's it for:**\n- Job seekers wanting to automate repetitive applications\n- Recruiters managing bulk applications\n- Career coaches tracking client progress\n\n**Requirements:**\n- Google Sheets with job data\n- Gmail account for notifications\n- Resume stored online (Google Drive recommended)\n- Job platform API access (LinkedIn, Indeed)\n\n**Setup Instructions:**\n1. Create Google Sheet with required columns\n2. Configure your spreadsheet ID in 'Configuration' node\n3. Set up Google Sheets and Gmail credentials\n4. Update email addresses in notification nodes\n5. Test with 1-2 jobs before full automation\n\n**⚠️ Important:** Replace mock HTTP requests with actual job platform APIs. Current implementation is for demonstration purposes."
      },
      "typeVersion": 1
    },
    {
      "id": "sheet-structure",
      "name": "📊 시트 구조",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        820,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 295,
        "height": 284,
        "content": "## 📊 Excel Sheet Structure\n\nRequired columns:\n- Job_ID: Unique identifier\n- Company: Company name\n- Position: Job title\n- Status: Not Applied, Applied, etc.\n- Applied_Date: Application date\n- Last_Checked: Last status check\n- Application_ID: Platform reference\n- Notes: Additional info\n- Job_URL: Direct job link\n- Priority: High, Medium, Low"
      },
      "typeVersion": 1
    },
    {
      "id": "setup-notes",
      "name": "⚙️ 설정 참고사항",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1180,
        160
      ],
      "parameters": {
        "color": 6,
        "width": 295,
        "height": 224,
        "content": "## 🔧 Configuration Setup\n\n1. Replace 'YOUR_GOOGLE_SHEET_ID' with actual ID\n2. Add your resume URL (Google Drive link)\n3. Customize cover letter template\n4. Update email addresses\n\n**Security Note:** Never hardcode API keys!\nUse n8n's credential store for all auth."
      },
      "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": "📖 Jobs 시트 읽기",
      "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": "## 📈 Status Tracking Workflow\n\nThis section runs every 2 days to:\n- Check status of applied jobs\n- Update the spreadsheet\n- Send notifications for changes\n\n**Note:** Replace mock status checks with actual API calls to job platforms for real status updates."
      },
      "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",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "read-jobs": {
      "main": [
        [
          {
            "node": "filter-pending",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "indeed-apply": {
      "main": [
        [
          {
            "node": "process-result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "read-applied": {
      "main": [
        [
          {
            "node": "filter-applied",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "update-status": {
      "main": [
        [
          {
            "node": "send-notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "platform-router": {
      "main": [
        [
          {
            "node": "linkedin-apply",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "indeed-apply",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "mock-status-check": {
      "main": [
        [
          {
            "node": "status-changed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "linkedin-apply": {
      "main": [
        [
          {
            "node": "process-result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "filter-applied": {
      "main": [
        [
          {
            "node": "split-status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "status-trigger": {
      "main": [
        [
          {
            "node": "read-applied",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "update-changed": {
      "main": [
        [
          {
            "node": "send-status-update",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "split-status": {
      "main": [
        [
          {
            "node": "mock-status-check",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "status-changed": {
      "main": [
        [
          {
            "node": "update-changed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "split-jobs": {
      "main": [
        [
          {
            "node": "prepare-data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "prepare-data": {
      "main": [
        [
          {
            "node": "platform-router",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "daily-trigger": {
      "main": [
        [
          {
            "node": "configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "process-result": {
      "main": [
        [
          {
            "node": "update-status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "filter-pending": {
      "main": [
        [
          {
            "node": "split-jobs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "triggerCount": 2
}
자주 묻는 질문

이 워크플로우를 어떻게 사용하나요?

위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.

이 워크플로우는 어떤 시나리오에 적합한가요?

고급 - 개인 생산성, 멀티모달 AI

유료인가요?

이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.

워크플로우 정보
난이도
고급
노드 수24
카테고리2
노드 유형10
난이도 설명

고급 사용자를 위한 16+개 노드의 복잡한 워크플로우

외부 링크
n8n.io에서 보기

이 워크플로우 공유

카테고리

카테고리: 34