슬랙 봇을 활용한 일별 KPI 달성률 알림 받기
팀으로 일하다보면 'KPI 진척률에 대해 신경 쓰는 사람이 나뿐인가?' 싶을 때가 있습니다 .
어떤 방식으로 동기부여를 하고, 그를 통해 팀원들이 스스로 KPI를 체크하는 습관을 만드는 것 역시 중요하지만 직접 연관성이 낮은 인원들의 경우 무심해지기 쉽기도 하고, 싫은 소리를 해야하는 팀장이나 그 이야기를 듣는 팀원이나 불편한 마음이 생기기 쉽죠.
KPI(Key Performance Indicator, 핵심 성과 지표)는 팀의 성과를 측정하고 목표 달성 여부를 판단하는 데 중요한 역할을 합니다. 팀장 및 실무자들은 매일 팀원들의 KPI 달성률을 확인하여 프로젝트 진행 상황을 파악하고, 필요한 조치를 취할 수 있습니다. 이 글에서는 스프레드시트의 데이터를 슬랙 봇을 통해 매일 오전 팀원들에게 자동으로 전달받는 방법을 소개합니다.
먼저 완성된 예시를 보여드리겠습니다.
Google 스프레드시트
Slack 워크스페이스
Slack API 토큰
Google Apps Script
(있으면 좋음) 기본적인 프로그래밍 지식
먼저, 팀의 KPI 데이터를 저장할 Google 스프레드시트를 준비합니다. 목표, 현재 달성률 등의 데이터를 포함한 테이블을 생성합니다.
이미 운영중인 시트가 있다면 그대로 사용해도 무방합니다.
Google Apps Script를 사용하여 스프레드시트에서 데이터를 추출하고, Slack 봇을 통해 메시지를 전송하는 스크립트를 작성합니다.
빨간색 영역은 각자 환경에 맞게 수정하여 사용하면 됩니다.
- var sheetId = "시트 id";
사용할 스프레드 시트 url에서 https://docs.google.com/spreadsheets/d/~ 에서 /d/ 이후 출력되는 값이 스프레드 시트의 id 값이 됩니다.
- var sheetName = "탭이름";
해당 시트에서 어떤 탭을 사용할 것인지 지정해주시면 됩니다.
- var dates = sheet.getRange("A2:A").getValues().flat().filter(String);
날짜를 참고하는 열입니다. 실제 열 값에 맞춰 수정해주세요.
- var currentMonthSales = sheet.getRange("CU2:CU").getValues().flat();
이번 달 매출에 해당하는 열을 지정해주세요.실제 열 값에 맞춰 수정해주세요.
- var targetSales = sheet.getRange("CP2:CP").getValues().flat();
타겟에 해당하는 열을 지정해주세요. 실제 열 값에 맞춰 수정해주세요.
- var slackWebhookUrl = "슬랙 웹 훅 url";
슬랙 웹 훅 url ( 아래에서 슬랙 웹 훅 받는 방법을 안내드릴 예정입니다. )
코드
function sendDailySalesProgress() {
// 스프레드시트 ID와 시트 이름 설정
var sheetId = "시트 id";
var sheetName = "탭이름";
// 스프레드시트와 시트 가져오기
var spreadsheet = SpreadsheetApp.openById(sheetId);
if (!spreadsheet) {
Logger.log('Spreadsheet not found with ID: ' + sheetId);
return;
}
var sheet = spreadsheet.getSheetByName(sheetName);
if (!sheet) {
Logger.log('Sheet not found with name: ' + sheetName);
return;
}
// 열 값 가져오기
var dates = sheet.getRange("A2:A").getValues().flat().filter(String);
var currentMonthSales = sheet.getRange("CU2:CU").getValues().flat();
var targetSales = sheet.getRange("CP2:CP").getValues().flat();
// 문자열로 변환 및 숫자 파싱
currentMonthSales = currentMonthSales.map(value => {
value = value.toString().replace(/,/g, '');
return isNaN(parseInt(value, 10)) ? 0 : parseInt(value, 10);
});
targetSales = targetSales.map(value => {
value = value.toString().replace(/,/g, '');
return isNaN(parseInt(value, 10)) ? 0 : parseInt(value, 10);
});
// 오늘 날짜와 당월 계산
var today = new Date();
var currentMonth = today.getMonth() + 1; // 월은 0부터 시작하므로 +1 필요
var currentYear = today.getFullYear();
var currentDate = Utilities.formatDate(today, Session.getScriptTimeZone(), "yyyy-MM-dd");
// 당월 타겟 매출 계산
var monthlyTargetSales = 0;
var cumulativeSales = 0;
var onpaceSales = 0;
for (var i = 0; i < dates.length; i++) {
var date = new Date(dates[i]);
if (date.getFullYear() === currentYear && date.getMonth() + 1 === currentMonth) {
monthlyTargetSales += targetSales[i];
if (date < today) {
cumulativeSales += currentMonthSales[i];
onpaceSales += targetSales[i];
}
}
}
// 누적 매출 달성률 계산
var achievementRate = monthlyTargetSales ? (cumulativeSales / monthlyTargetSales * 100) : 0;
var onpaceRate = monthlyTargetSales ? (onpaceSales / monthlyTargetSales * 100) : 0;
var differenceRate = (onpaceSales / monthlyTargetSales) - (cumulativeSales / monthlyTargetSales);
// 슬랙 메시지 생성
var message = `
*오늘의 매출 진척률입니다.*
*- ${currentMonth}월 타겟 매출*
${monthlyTargetSales.toLocaleString()}원 (IN.VAT)
*- 온페이스 매출*
${onpaceSales.toLocaleString()}원 (IN.VAT)
*- 전일까지 누적 매출 *
${cumulativeSales.toLocaleString()}원 (IN.VAT) 달성률 ${achievementRate.toFixed(2)}% (온페이스 대비 ${(differenceRate * 100).toFixed(2)}% 미달)
`;
// 슬랙 웹훅 URL
var slackWebhookUrl = "슬랙 웹 훅 url";
// 슬랙 메시지 전송
var payload = JSON.stringify({text: message});
var options = {
method: "post",
contentType: "application/json",
payload: payload
};
UrlFetchApp.fetch(slackWebhookUrl, options);
}
function createTrigger() {
// 매일 오전 9시에 sendDailySalesProgress 함수 실행
ScriptApp.newTrigger('sendDailySalesProgress')
.timeBased()
.atHour(9)
.everyDays(1)
.create();
}
이제 스크립트를 매일 오전에 자동으로 실행되도록 트리거를 설정합니다. Google Apps Script 편집기에서 'Triggers' 메뉴로 이동하여 새로운 트리거를 추가합니다.
함수 선택: sendDailySalesProgress
이벤트 소스: 시간 기반
시간 기반 트리거 유형: 일별
시간: 원하는 시간(예: 오전 9시)
Slack API에서 봇 토큰을 발급받아야 합니다. Slack 앱 디렉토리에서 새로운 앱을 생성하고, 필요한 권한(예: chat )을 부여한 후 봇 사용자 토큰을 발급받습니다.
https://api.slack.com/apps 해당 페이지에서 봇 토큰 발급이 가능합니다.
From scratch를 선택하여 앱을 생성하면 됩니다.
봇 설정 + 앱 세팅하는 부분은 내용이 길어질 듯하여 개별 포스트로 다루겠습니다.
6. 스프레드시트와 슬랙 연동 테스트
모든 설정이 완료되었으면 스프레드시트의 데이터를 수정하여 스크립트가 올바르게 동작하는지 테스트합니다.
**스크립트 편집기에서 sendDailySalesProgress 함수를 수동으로 실행하여 슬랙 채널에 KPI 달성률 메시지가 정상적으로 전송되는지 확인합니다.
축하드립니다!
위 과정을 통해 팀장 및 실무자들은 매일 아침 슬랙을 통해 팀원들의 KPI 달성률을 자동으로 받아볼 수 있습니다. 원본이 되는 매출 데이터는 누군가 업데이트 해줘야하지만, 이를 통해 팀의 성과를 실시간으로 모니터링하고, 필요에 따라 신속하게 대응할 수 있습니다. (raw 데이터도 가능하다면 데일리 업데이트를 자동화 해두면 더 좋겠죠? )