문제해결 이야기1) 구글 앱스크립트 사용해보기

Supabase/Redash <> Spreadsheet와 실시간 연동하기,. 업무자동화의 첫삽
Sep 12, 2024
문제해결 이야기1) 구글 앱스크립트 사용해보기
근래들어 나의 문제해결력이 늘었다고 생각하는 부분이 있는데 가장 도움을 준 것은 바로 AI. SQL도, Spreadsheet도, 간단한 업무자동화 개발도 적당히 할 수 있지만, 요즘엔 직접 수식을 쓰거나 코드를 작성하지 않는다. 요구사항을 잘 정리하고 적절한 피드백만 주면 GPT, Claude가 너무 잘해줌. 내가 꽤 아끼면서 키우고 있는 인턴(?) ㅎㅎ 앞으로 종종 블로그에 업무자동화에 도움이된 팁들을 나눠보고자 합니다..ㅎ..
 
 

Background

유학 플랫폼의 비전을 린하게 실행하기 위해 반기정도 Data Collection Project를 진행했다. B2B 파트너사에게 유학을 갈 가능성이 있는 사람들의 정보를 제공하는 것이 목표였다. 따라서, 제품팀의 목표는 B2B 리드 정보를 최대한 많이 획득하고, 이 리드의 최종 전환율(유학을 가고 싶게끔)을 높이는 것이었다.

Lead Generation (리드 생성)

  1. 개인정보 수집: 최대한 많은 Flow를 만들어 필요한 개인정보를 수집했다. (당연히 개인정보 활용동의도 정책상으로 정의해서 받아야했고)
  1. 컨설팅 신청 유도: 사용자가 유학 관련 상담을 받을 수 있도록 컨설팅 신청을 유도하는 전략을 세웠다.

Lead Nurturing (리드 육성)

  1. 컨설턴트 신뢰 구축: 컨설턴트가 팔로업을 할 때 사용자가 신뢰를 갖고 컨설팅에 참여할 수 있도록 파트너사에 대한 정보를 충분히 제공하고자 했다.
 
프로젝트 진행 중 1 → 2 → 3 단계로 퍼널을 나누어 전환율을 개선하는 데 집중했다. 이와 더불어, 제품팀은 파트너사가 필요로 하는 정보에 맞춰 DB 설계 및 다양한 기획과 개선 작업을 진행했다.
 
 

Problem

하지만, 이 과정에서 작업을 빠르게 진행하다 보니 Supabase와 Django DB로 이원화되어 리드정보가 관리되게 되었다. 문제는, 컨설팅 과정에서 신속한 리드정보 전달이 중요한데, 2개의 DB에서 데이터를 조회, 전달하는 작업을 진행해주시던 담당자분이 장기 부재하시면서, 나에게 이 일이 넘어오게 되었다. 이에 따라 자동화가 필요하다는 문제의식이 생겼다. 😖
 
 

Solution

해결 방안으로 앱 스크립트를 사용해 Supabase와 Redash 데이터를 각각 스프레드시트로 연동하고, 이를 자동으로 업데이트하는 트리거를 설정해 데이터를 관리했다. 그 결과, 데이터를 손쉽게 병합하고, 이를 날짜순으로 정리해 파트너사에 전달할 수 있게 되었다.

1) Supabase <> Spreadsheet 연동

TF팀을 하면서 알게된 Supabase는 정말 유익한 BaaS이다(!) 현재 조직에서는 변경사항이 잦거나 백엔드 리소스가 부족할 때는 DB를 Supbase를 적극적으로 사용하고 있다. 이전에는 n8n, Zapier같은 유료 툴을 사용하여 Supabase를 Spreadsheet와 연동했으나, API key를 사용하면 구글 앱스크립트로 간단하게 연동을 진행할 수 있다.
  1. Supabase API key 확인:
    1. notion image
      • Supabase > 프로젝트 설정 > API
      • Project URL 및 Public API Key를 확인
  1. 스프레드시트 생성 및 Apps Script 작성:
      • 스프레드시트에서 데이터를 가져오는 Apps Script를 작성하고 트리거를 설정했다.
function syncSupabaseToSheet() { var supabaseUrl = '**{project URL}**'; var supabaseKey = '**{project API keys (anon public)}**'; var response = UrlFetchApp.fetch(supabaseUrl + '/rest/v1/**{table name}**?select=*', { headers: { 'apikey': supabaseKey, 'Authorization': 'Bearer ' + supabaseKey } }); var data = JSON.parse(response.getContentText()); var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('**{spread sheet 이름}**'); var lastRow = sheet.getLastRow(); var existingData = (lastRow > 1) ? sheet.getRange(2, 1, lastRow - 1, sheet.getLastColumn()).getValues() : []; var existingIds = existingData.map(function(row) { return row[0]; }); var headers = Object.keys(data[0]); var newData = data.filter(function(row) { return existingIds.indexOf(row['id']) === -1; }); if (newData.length > 0) { var newValues = newData.map(function(row) { return headers.map(function(header) { return row[header]; }); }); sheet.getRange(lastRow + 1, 1, newValues.length, headers.length).setValues(newValues); } }
 

2) Redash <> Spreadsheet 연동

  • Redash에서 SQL 쿼리를 작성해 필요한 데이터를 추출하고, 그 결과를 CSV 형식 URL로 가져와 스프레드시트에서 importdata 함수를 사용해 데이터를 불러왔다. 데이터추출용 SQL 작성 → Show API Key → Results in CSV format URL을 가져오면 된다.
    • notion image
  • 다만, 이 방식으로 불러온 데이터는 실시간 업데이트가 되지 않으므로, 앱 스크립트를 통해 데이터를 자동으로 갱신하는 트리거를 설정했다.
    • javascript Copy code function refreshdata() { var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('A1').setValue(''); spreadsheet.getActiveRange().setFormula('=importdata("**{redash API URL}**")'); }
 

3) 두 시트의 데이터를 합치기

  • 이제 SupabaseDjango 두 DB에서 수집된 리드 데이터를 날짜순으로 정렬해 합쳤다.
  • 각 DB에서 같은 필드명으로 같은 정보를 수집하면 바로 합칠 수 있지만, 일부 데이터는 약간의 가공이 필요했다. 이를 파트너사가 요청한 포맷에 맞춰 데이터를 처리했다.
  • 합친 후에는 수집된 날짜를 기준으로 정렬해 데이터를 정리했다.
 
 

Result

이 작업을 통해 번거로웠던 파트너사에 리드 전달 작업을 자동화하여 시간과 리소스를 절약했다. 하루 10분 정도 소요되던 작업이 자동화되었고, 한 달 기준 약 3시간의 시간을 절약할 수 있었다. 또한, 공휴일이나 부재 시에도 데이터를 수집 및 전달할 수 있어, 누락 없이 정확한 정보를 제공할 수 있게 되었다.
 
 
 
Share article
RSSPowered by inblog