Activepieces로 활동 로깅 자동화 flow 만들고, 자주 활용할 수 있는 개인화 요소 추가하기!

소개

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

매일 일상/업무 내용과 감정 변화를 기록하고자
구글 캘린더를 기반으로 한 자동 데일리 로그 시스템을 만들고자 했습니다!
(Hero님의 가이드북 왕창 참고✨)

< 기본적인 구조 > - Activepieces / Google(forms, Calendar) / Discord 활용

  • 워크플로우 1 : 시간별 알림 발송

    고객에게 메시지를 보내는 방법을 보여주는 순서도


  • 워크플로우 2 : 응답 처리 및 저장

    다양한 유형의 로고가 포함된 웹사이트의 스크린샷

< 추가 사항(개인화) >

1) 🌡️날씨/의상 추천 알림 : 하루 2번은 날씨와 의상 추천을 하도록 추가했습니다!
첫 기록이 시작되는 아침 8시에는 오늘의 날씨를, 마지막 기록을 안내하는 알림에는
내일의 날씨를 알려주는 내용을 추가하고자 했습니다. (좀 더 알림을 찾아보도록 하기 위해!)

2) 📝기록 알림 : 시간마다 기록을 할 수 있도록 디스코드로 알림을 보내고,
이 내용을 요약해서 다시 안내해주도록 설계하고자 했습니다. (매일 8시 - 22시, 1시간에 1번씩!)
>> 요약 시에는 어제 대비 오늘 총 몇번 작성을 했는지 추가하고자 했습니다.

진행 방법

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

Tip: 사용한 프롬프트 전문을 꼭 포함하고, 내용을 짧게 소개해 주세요.

Tip: 활용 이미지나 캡처 화면을 꼭 남겨주세요.

Tip: 코드 전문은 코드블록에 감싸서 작성해주세요. ( / 을 눌러 '코드 블록'을 선택)

  • Activepieces (자동화 툴)

    1) 시간별 활동 로깅 알림 flow (빨간 네모가 개인화 영역)

    프로젝트의 흐름을 보여주는 흐름도



    2) (응답 완료 시) 기록 요약 안내 Flow 지렁이 주의🪱

    흐름도를 보여주는 웹사이트의 스크린샷
    구글 AdWords 캠페인의 스크린샷
Google Analytics 사용 방법을 보여주는 흐름도

  • 날씨 안내 : wttr.in 날씨 API (용산구 기반 날씨 정보) - (경도, 위도 값 필요)
    >> https://api.weatherapi.com/v1/forecast.json

    (요약)
    1. Cron (08:00 / 22:00)

    2. Code (현재 시간 구하기)

    3. Router (시간이 8시냐? 22시냐?)

    Branch A → 아침용 메시지

    Branch B → 밤용 메시지
    Otherwise → 일상 메시지


    1) 오전 8시, 밤 22시에만 안내하기 위해 먼저 시간 확인(한국) + Router로 시간분류

    export const code = async () =>
      const nowUtc = new Date();
      const koreaTime = new Date(nowUtc.getTime() + 9  60  60 * 1000);
      return {
        hour: koreaTime.getHours(),
        date: koreaTime.toISOString().split("T")[0]
      };
    };


    2) weather[1,2]와 hourly(1~24) 구조 기반, 아침은 오늘 날씨 / 밤은 내일 날씨 정보 추출

    날씨 API 키
    한국사이트 스크린샷


    http 보내기 요청 페이지의 스크린샷
    코드 블록이 강조표시된 웹페이지의 스크린샷


    3) 추출한 날씨정보와 매핑되는 Code 생성 (기온 안내 / 의상추천)

    export const code = async (inputs) => {  
    const body = inputs.weather; // HTTP(weather) 스텝의 body 전체
      const forecast = body.forecast.forecastday;
      const targetHour = 8; // 08시 기준
      const findHour = (day) => {
        const byTime = day.hour.find(
          (h) => new Date(h.time).getHours() === targetHour
        );
        return byTime || day.hour[8]; // 없으면 8번째 인덱스(보통 08시 근처)
      };
      const buildTodaySection = (day, hour) => {
        const max = day.day.maxtemp_c;
        const min = day.day.mintemp_c;
        const nowTemp = hour.temp_c;
        const feels = hour.feelslike_c ?? nowTemp;
        const desc = hour.condition.text;
        const willRain =
          hour.will_it_rain === 1 || day.day.daily_will_it_rain === 1;
        const chanceRain =
          Number(hour.chance_of_rain ?? day.day.daily_chance_of_rain ?? 0);
        const willSnow =
          hour.will_it_snow === 1 || day.day.daily_will_it_snow === 1;
        const chanceSnow = Number(hour.chance_of_snow ?? 0);
        const wind = hour.wind_kph;
        // 👗 의상 추천
     let outfitEmoji = "☀️";
    let outfitText = "간단한 니트나 가벼운 아우터 정도면 괜찮아요.";
    if (feels <= -5) {
      outfitEmoji = "🥶";
      outfitText = "한파 경보급! 두꺼운 패딩 + 방한모 + 목도리 + 장갑 필수!";
    } else if (feels <= 3) {
      outfitEmoji = "🧊";
      outfitText = "몹시 추워요. 패딩이나 두꺼운 코트 + 히트텍 꼭 입으세요.";
    } else if (feels <= 8) {
      outfitEmoji = "🧣";
      outfitText = "쌀쌀한 날씨! 코트/패딩 + 목도리 있으면 딱 좋아요.";
    } else if (feels <= 15) {
      outfitEmoji = "🧥";
      outfitText = "조금 선선해요. 가벼운 코트나 니트에 얇은 이너 추천!";
    } else if (feels <= 22) {
      outfitEmoji = "👕";
      outfitText = "활동하기 좋은 날씨! 가벼운 상의나 셔츠면 충분해요.";
    } else if (feels <= 27) {
      outfitEmoji = "🌞";
      outfitText = "약간 더워요. 반팔이나 얇은 셔츠로 시원하게 입어주세요.";
    } else if (feels > 27) {
      outfitEmoji = "🥵";
      outfitText = "폭염 주의! 최대한 얇게, 통풍 잘되는 옷 + 수분 섭취 필수!";
    }
        // ☔ 우산
        let rainLine = "비 예보 없음! 우산은 괜찮아요.";
        if (willRain || chanceRain >= 80) {
          rainLine = "** 비 예보 있음! 우산 꼭 챙기세요.**";
        }
        // ❄ 눈
        let snowLine = "";
        if (willSnow || chanceSnow >= 80) {
          snowLine = "**\n       ☃️ 눈이 와요! 🥾 길이 미끄러울 수 있어요!**";
        }
        // 💨 바람
        let windLine = "바람은 약한 편이에요.";
        if (wind >= 30) {
          windLine = "**강한 바람! 모자나 목도리 단단히 챙겨요.**";
        } else if (wind >= 15) {
          windLine = "바람 약간 있음! 바람막이나 아우터가 있으면 좋아요.";
        }
        return `**< 출근 전 참고하세요! >**
      👚 의상 추천 : ${outfitEmoji}  ${outfitText}
      🌡 현재 기온 : ${nowTemp.toFixed(1)}℃ (체감 기온 ${feels.toFixed(1)}℃)
            🔺 최고 기온 : ${max.toFixed(1)}℃
            🔻 최저 기온 : ${min.toFixed(1)}℃
      ☁️ 날씨 현황 : ${desc}
           ☔  ${rainLine}
           🍃  ${windLine}${snowLine}`;
      };
      const today = forecast[0];
      const todayHour = findHour(today);
      const message = buildTodaySection(today, todayHour);
      return {
        text: message,
      };
    };


    4) 디스코드 안내 메일

    - 아침 (당일 아침 기준 날씨알림 + 의상 추천)

    한국어 문자 메시지 스크린샷



    - 저녁 22시 (다음날 아침 기준 날씨알림 + 의상 추천)

    한국어 문자 메시지 스크린샷


    - 일상

    한국어로 된 메시지 스크린샷

  • Discord Webhook (알림 발송)

    다음으로는 오늘/어제 작성한 캘린더 횟수를 불러옵니다!

    1) Get all Events으로 값 불러오고 Code 작성으로 구체화!

    구글캘린더 - 한국어

    export const code = async (inputs) => {
      const items = inputs.inputs || [];  
      const count = items.length; 
      return { count };
    
    };

    2) Discord로 안내! (어제 대비 오늘 총 몇번 작성하였는지 포함)

    한국어로 된 메시지 스크린샷

결과와 배운 점

배운 점과 나만의 꿀팁을 알려주세요.

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

도움이 필요한 부분이 있나요?

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


Flow를 제작하면서 앱과 API 기반 연동을 통해 자동화를 진행하는 방법을 알게되었습니다!

1) API 연동은 처음이라 날씨 API의 특정 시간을 추출하는 부분에서 시행착오를 겪었습니다.
"url": "https://wttr.in/용산구?format=j1",

한국어로 된 날씨 앱 스크린샷


2) 초반에 트리거의 시간을 추출하여 조건을 구성하려 했는데, 트리거 시간 기반 조건 추출이 되지 않는다는 것을 깨닫고 좌절했습니다.. 대신 어제 작성된 횟수와 오늘 작성 횟수를 추출하여 안내하고 어제보다 오늘 더 많이 작성하도록 독려하는 방식으로 방향을 틀어 잘해결하였습니다. 다만, 시간을 지정할 때 양식( T.. +09:00 .. 등등) 조건이 까다로워서 어려웠습니다.

3) 이번에는 어떻게 하면 좀 더 알림을 들여다보고, 자주 기록할 수 있을지에 대한 고민을 했던 한주였습니다. (좀 더 마케팅 적인 관점 이었다면) 다가오는 주에는 해당 기록 결과를 활용하여 분석 등 다양한 시도를 해볼 수 있었으면 좋겠씁니다.

도움 받은 글 (옵션)

참고한 지피터스 글이나 외부 사례를 알려주세요.

  • Hero님의 가이드북 : 자동화 하는 가이드북 뿐만 아니라, 다양한 앱들의 활용방법이 담긴 가이드북까지 정말 너무 잘 활용하고 참고하였습니다! (매번 글로만 남기지만 ㅜㅜ) 정말 감사합니다 ㅎㅎ

  • GPT에게 무료 API 주소나 오류가 생기는 부분등 짜잘한 내용을 많이 물어보고 참고했습니다!

1
4개의 답글

👉 이 게시글도 읽어보세요