본문 바로가기
프로그램 (PHP,Python)

Google Calendar 중복 이벤트 처리 및 자동 등록 n8n 워크플로우 구축

by 날으는물고기 2025. 2. 7.

Google Calendar 중복 이벤트 처리 및 자동 등록 n8n 워크플로우 구축

n8n의 강력한 워크플로우 엔진과 Google Calendar 노드를 활용하여, 여러 개의 일정 데이터를 효과적으로 처리하고 중복 등록 없이 자동으로 이벤트를 생성하는 방법입니다. 다양한 조건 비교와 추가 최적화 팁까지 포함하여, 전문가의 관점에서 워크플로우 구성 방법입니다.


1. 워크플로우 개요

이번 워크플로우의 주요 목적은 다음과 같습니다.

  • 데이터 소스 노드: 다양한 소스(Spreadsheet, HTTP Request 등)로부터 여러 개의 일정 데이터를 배열 형태로 가져오기
  • Google Calendar 검색 노드: 각 일정에 대해 Google Calendar API를 사용해 이미 등록된 이벤트가 있는지 중복 여부 확인
  • IF 노드: 검색 결과에 따라 이벤트 등록 여부를 분기 처리
  • Google Calendar 일정 등록 노드: 중복이 없을 경우에만 새로운 이벤트 생성

전체 흐름은 아래와 같이 구성됩니다.

Start 
  → Data Source (여러 일정) 
    → Google Calendar (Get Events)
       ↘ IF (중복 여부 확인)
            ├─ [true: 이미 있음] → (추가 작업 없음)
            └─ [false: 등록 필요] → Google Calendar (Create Event)

2. 데이터 소스 노드 설정

여러 개의 일정 데이터를 외부 소스(예: Spreadsheet File, HTTP Request 등)에서 가져옵니다.
데이터는 배열 형태로 처리되며, 각 항목(row)마다 개별 일정 데이터(제목, 시작 시간, 종료 시간, 설명, 참석자 등)를 포함해야 합니다.

 

예시 데이터

{
  "title": "팀 회의",
  "startTime": "2024-11-29T09:00:00Z",
  "endTime": "2024-11-29T10:00:00Z",
  "description": "매주 팀 회의",
  "attendees": [
    { "email": "user1@example.com" },
    { "email": "user2@example.com" }
  ]
}

3. Google Calendar 검색 노드 설정

Google Calendar 노드를 추가하여 작업을 Get Events로 설정합니다.
이 노드를 통해 각 일정의 중복 여부를 확인할 수 있습니다.

필터 조건 설정

  • Time Min: 등록하려는 일정의 시작 시간
    (예: {{$node["Data Source"].json["startTime"]}})
  • Time Max: 등록하려는 일정의 종료 시간
    (예: {{$node["Data Source"].json["endTime"]}})
  • Query: 일정 제목이나 설명 등 중복 확인에 활용할 키워드
    (예: {{$node["Data Source"].json["title"]}})

n8n은 각 row마다 기본적으로 반복 실행되므로, 각 일정 데이터를 동적으로 처리할 수 있습니다.


4. IF 노드와 Google Calendar 일정 등록 노드 설정

IF 노드: 중복 여부 판단

검색 결과를 기반으로 중복 여부를 판단합니다.
예를 들어, 검색된 이벤트의 수가 0이면 새 일정 등록이 필요한 것으로 처리합니다.

 

조건 예시

{{ $json["events"].length === 0 }}

또는, 제목을 기준으로 필터링할 경우

{{ $json["events"].filter(event => event.summary === $node["Data Source"].json["title"]).length === 0 }}

Google Calendar 일정 등록 노드

중복이 없다고 판단된 경우에만, Google Calendar 노드를 추가하여 작업을 Create Event로 설정합니다.

필수 필드에 동적 데이터를 연결합니다.

  • Summary: {{$node["Data Source"].json["title"]}}
  • Start DateTime: {{$node["Data Source"].json["startTime"]}}
  • End DateTime: {{$node["Data Source"].json["endTime"]}}

이렇게 하면, 조건에 부합할 때만 새 이벤트가 등록됩니다.


5. 검색 결과가 여러 개인 경우의 상세 처리

Google Calendar 검색 시, 특정 일정과 관련된 여러 이벤트가 반환되는 경우가 있습니다. 이를 효과적으로 처리하기 위해 추가 로직을 구성할 수 있습니다.

5.1 검색 결과 병합 및 조건 확인

  • 결과 배열 처리: 검색 결과가 배열 형태로 반환되므로, IF 노드에서 filter() 함수를 활용하여 등록하고자 하는 일정과 중복되는 항목을 세밀하게 비교합니다.
    {{ $json["events"].filter(event => event.summary === $node["Data Source"].json["title"]).length === 0 }}
  • 다중 조건 비교: 단순 제목 비교 외에도 시간, 설명, 참석자 등 여러 속성을 기준으로 중복 여부를 확인할 수 있습니다.

5.2 추가 로직 구성 방법

  1. Merge 노드 활용
    Google Calendar 검색 결과와 등록할 일정 데이터를 병합한 후, 세부 조건을 추가하여 중복 여부를 판단할 수 있습니다.
  2. Set 노드 활용
    검색 결과에서 필요한 필드(예: 날짜, 제목, ID 등)만 추출하여 이후 로직에서 활용할 수 있습니다.
  3. Function 노드 활용
    JavaScript 코드를 사용하여 더욱 정밀한 조건 비교를 수행합니다.

    예시 코드 – 제목 비교
    const events = $json["events"];
    const targetTitle = $node["Data Source"].json["title"];
    const isDuplicate = events.some(event => event.summary === targetTitle);
    return isDuplicate ? null : $json;
    예시 코드 – 시간, 설명, 참석자 비교
    const events = $json["events"];
    const targetStartTime = new Date($node["Data Source"].json["startTime"]);
    const targetEndTime = new Date($node["Data Source"].json["endTime"]);
    const targetDescription = $node["Data Source"].json["description"];
    const targetAttendees = $node["Data Source"].json["attendees"] || [];
    
    const isDuplicate = events.some(event => {
      const eventStartTime = new Date(event.start.dateTime || event.start.date);
      const eventEndTime = new Date(event.end.dateTime || event.end.date);
      const eventDescription = event.description || "";
      const eventAttendees = event.attendees || [];
    
      // 시간, 설명, 참석자 비교
      return (
        (targetStartTime < eventEndTime) &&
        (targetEndTime > eventStartTime) &&
        (eventDescription.includes(targetDescription)) &&
        targetAttendees.every(attendee => eventAttendees.some(ea => ea.email === attendee.email))
      );
    });
    
    return isDuplicate ? null : $json;

6. 예제: 중복 조건 처리 및 이벤트 등록

6.1 입력 데이터 예시

{
  "title": "팀 회의",
  "startTime": "2024-11-29T09:00:00Z",
  "endTime": "2024-11-29T10:00:00Z",
  "description": "매주 팀 회의",
  "attendees": [
    { "email": "user1@example.com" },
    { "email": "user2@example.com" }
  ]
}

6.2 Google Calendar 검색 결과 예시

[
  { 
    "summary": "팀 회의",
    "start": { "dateTime": "2024-11-29T09:30:00Z" },
    "end": { "dateTime": "2024-11-29T10:30:00Z" },
    "description": "매주 팀 회의",
    "attendees": [
      { "email": "user1@example.com" },
      { "email": "user3@example.com" }
    ]
  }
]

6.3 IF 조건 평가

  • 시간 겹침 여부: 등록하려는 일정의 시작 및 종료 시간이 기존 이벤트와 겹치는지 확인
  • 제목 비교: event.summary와 등록하려는 title 비교
  • 설명, 참석자 등 추가 비교: 세밀한 비교를 통해 중복 여부 판단

조건이 모두 만족하지 않으면(즉, 중복이 없으면) 다음 노드로 진행되어 이벤트가 등록됩니다.


7. 추가 팁 및 최적화 방법

  1. 병렬 처리
    일정 데이터의 양이 많을 경우, Batch 노드를 사용해 일정 수를 조정하고 워크플로우의 안정성을 확보하세요.
  2. Slack 알림
    새로운 일정 등록 시 Slack 노드를 추가하여 알림을 보낼 수 있습니다. 중복 이벤트가 발견되거나 등록 성공/실패 시에도 유용합니다.
  3. 에러 핸들링
    Catch 노드를 활용하여 실패한 일정 데이터를 로깅하거나 별도로 처리할 수 있도록 구성하세요.
  4. 시간 오차 허용
    시간 비교 시 몇 분의 오차를 허용하는 로직을 추가하여, 시간대 미세 조정에 따른 오차를 보완할 수 있습니다.
  5. 유사 이벤트 탐지
    제목이나 설명 등이 정확히 일치하지 않더라도, 자연어 비교 알고리즘을 활용해 유사 이벤트를 탐지하는 방법도 고려해보세요.

n8n과 Google Calendar 노드를 활용하면, 여러 일정 데이터를 자동으로 처리하면서 중복 이벤트 등록을 효과적으로 방지할 수 있습니다.

  • 데이터 소스에서 일정 데이터를 불러오고,
  • Google Calendar 검색 노드로 중복 여부를 확인한 뒤,
  • IF 및 Function 노드를 통해 조건에 따른 분기를 구성하고,
  • Google Calendar 등록 노드를 통해 필요한 경우에만 이벤트를 생성합니다.

추가로, 병렬 처리, Slack 알림, 에러 핸들링 등의 최적화 방안을 적용하면 더욱 견고한 워크플로우를 구현할 수 있습니다.

이 가이드를 참고하여 여러분의 업무 자동화에 n8n과 Google Calendar 통합을 적극 활용해 보시기 바랍니다.

728x90

댓글