자동화 : 노션 업데이트 텔레그램 챗방 알림 (실패기)

소개

시도하고자 했던 것과 그 이유를 알려주세요.

NOTION DB UPDATE 각 팀원 작성 시 '작성자 본인'만 인지, 팀원은 인지하기 어려움

다른 숫자를 보여주는 Google 스프레드 시트의 스크린 샷

진행 방법

어떤 도구를 사용했고, 어떻게 활용하셨나요?

  1. N8N 기본 세팅

  2. 그록, 제미나이, 클로드 등에 "워크 플로우 설계" 질문

  3. 워크 플로우

  4. TRIGGER : 매일 아침 10시 (9시 출근하여 작성할 수도 있으니)

  5. LOAD LASTRUN : 전날 오전 9시~금일 오전 9시 기준

    1. 이 코드는 워크플로우의 마지막 실행 시각을 기록하고 관리하는 간단한 스크립트입니다.


      주요 기능

      • 현재 시각 기록: 코드가 실행되는 현재 시각을 now 변수에 저장합니다.

      • 이전 실행 시각 로드: workflowStaticData.lastRun을 통해 이전 워크플로우 실행 시각을 불러옵니다. workflowStaticData는 워크플로우 전체에서 공유되고 지속되는 데이터를 저장하는 공간입니다.

      • 첫 실행 여부 판단: lastRun 값이 없으면 (즉, 이전 실행 기록이 없으면) 첫 실행으로 판단합니다.

      • 마지막 실행 시각 업데이트: 현재 시각을 workflowStaticData.lastRun에 새로 저장하여, 다음 번 워크플로우 실행 시 이 시각이 '이전 실행 시각'이 되도록 업데이트합니다.

      • 결과 출력: 다음 정보들을 JSON 형태로 출력합니다.

        • lastRun: 이전 실행 시각 (첫 실행이라면 현재 시각)

        • isFirstRun: 첫 실행 여부 (true/false)

        • currentTime: 현재 실행 시각

  6. 노션 DB페이지 아이디 연결

  7. COMPUTE DIFF 코드 노드 : 전날 오전 9시~금일 오전 9시 기준

    1. 변경된 내용을 찾아

    2. 변경 전 --> 변경 후 데이터 표시 ex) 제안 전 --> 제안 완료

      컴퓨터에서 코드 편집기의 스크린 샷
    3. 주요 기능

      • 이전 데이터 저장 및 활용: nodeStaticData.prevData를 사용하여 이전 워크플로우 실행 시점의 노션 데이터를 저장하고, 이를 현재 데이터와 비교하는 데 사용합니다.

      • 데이터 초기화: 처음 실행되거나 이전 데이터가 없을 경우, 현재 노션 데이터를 prevData에 저장하고 변경사항은 보고하지 않습니다.

      • 동적인 필드 감지: 코드에 필드를 미리 지정할 필요 없이, 현재 데이터와 이전 데이터에서 노션의 기본 시스템 필드(id, created_time 등)를 제외한 모든 사용자 정의 필드를 자동으로 찾아냅니다. 덕분에 노션 데이터베이스 스키마가 변경되어도 유연하게 작동할 수 있습니다.

      • 데이터 정규화: 노션 데이터는 복잡하고 중첩된 구조를 가질 수 있습니다. normalizeData 함수를 사용하여 다양한 노션 속성 타입(예: 리치 텍스트, 숫자, 선택 옵션)을 비교 가능한 문자열 형태로 변환합니다. 이를 통해 데이터의 내부 구조가 조금 달라도 정확한 비교가 가능합니다.

      • 변경사항 감지 (Diff):

        • 각 노션 항목에 대해 현재 버전(cur)과 prevData에 저장된 이전 버전(old)을 비교합니다.

        • 감지된 모든 필드를 반복하며 normalizeData 함수를 사용해 값을 비교합니다.

        • 필드에서 차이점이 발견되면 해당 필드 이름, 이전 값, 현재 값을 기록합니다.

      • 결과 출력:

        • 항목에서 변경사항이 감지되면 해당 항목의 id와 변경된 내용(diffs)을 포함하는 출력을 생성하여 outputs 배열에 추가합니다.

        • 모든 항목에서 변경사항이 없으면, 변경사항이 없다는 메시지와 함께 디버그 정보를 반환합니다.

      • 영구 데이터 업데이트: 모든 현재 항목을 처리한 후, nodeStaticData.prevData를 최신 항목 버전으로 업데이트하여 다음 실행을 준비합니다.

      • 디버깅 및 로깅: 코드에는 디버깅을 위한 console.log 문이 풍부하게 포함되어 있어, 데이터 비교 과정, 감지된 필드, 변경사항 등을 상세히 확인할 수 있습니다.


      결론적으로, 이 스크립트는 노션 데이터베이스의 수정사항을 추적하여 실제 데이터 변경이 발생했을 때만 후속 작업

  8. genernate message 코드 노드

    코드 편집기의 스크린 샷
    1. 워크플로우의 실행 상태와 관련된 상세한 디버그 정보를 포함하는 메시지를 만듭니다.

    2. 포함될 수 있는 정보는 다음과 같습니다:

      • 오류 메시지 ($json.error)

      • 일반 상태 메시지 ($json.message)

      • 처리된 아이템 수, 이전 데이터가 있던 아이템 수, 새로운 아이템 수 ($json.processedItems)

      • 확인된 필드 목록 ($json.fieldsChecked)

      • 현재 확인 시각

    3. 변경사항 알림 메시지 생성:

      • 입력 데이터 $jsondiffs 배열이 존재하고 내용이 있는 경우 (즉, 변경사항이 감지된 경우) 이 모드로 진입합니다.

      • 노션 항목에서 어떤 필드가 어떻게 변경되었는지를 명확하게 보여주는 메시지를 생성합니다.

      • 변경사항 목록은 "필드: 이전 값 -> 현재 값" 형식으로 구성됩니다.

      • 메시지에는 "노션 행사 정보가 업데이트되었습니다!"와 같은 안내 문구와 함께 변경된 내용, 그리고 확인 시각이 포함됩니다.

  9. 텔레그램 메시지

결과와 배운 점

과정 중에 어떤 시행착오를 겪었나요?

cursor ai 와 100 번은 싸웠으나 결론은.... 속았습니다.

  1. 안될 것 같은데, 계속 코드를 수정하는데.. 몇 가지 패턴으로 '뫼비우스 띠' 무한 반복.

  2. notion db 전체를 변경 전 vs 변경 후 저장을 하고, 비교를 해야 : 저장을 위한 기능 부재!!

  3. 3일 정도 코드 수정 --> 테스트 --> 수정 --> 테스트 하다 깨달음. "저장"을 못하는데, 저 1개라도 기억하고 알려준게 용하다. 5~6개를 수정하면, 1개 정도만 용캐 기억해서 알려주는 수준

앞으로의 계획이 있다면 들려주세요.

  1. 팀원분들의 의견 : 꼭 변경 전, 변경 후 정보 불필요할 수도... 요일별로 정보 가져오게 수정하기로

  2. 만약 위 기능을 고수해야 한다면

    1. DB를 일자별로 구글 시트 등에 자동 저장 시키고, 비교하게 만들자 (1안)

    2. 노션 유료 모델에서는 뭐가 변했는지 알려주는 것이 가능. 이를 활용하여 기획 (2안)

  3. 1번. '요일별 '제안' 정보 & '비정기 제안' 내용 : 오전 10시, 오후 3시 노티를 텔레그램 대화방에 알려주는 방향으로 다시 개발해 보기로...

2
10개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요