저는 직장인들이 함께 공부하는 커뮤니티 모여공 (모여공 커뮤니티 소개 링크)을 Slack을 통해 운영하고 있습니다. 모여공을 운영하며 멤버들의 공부를 더욱 효과적으로 돕기 위해, 두 가지 목적을 달성할 수 있는 슬랙봇이 필요했습니다.
공부 횟수와 환급 금액 공유 📢
모여공은 챌린지 기반 보증금 차감제 방식으로 운영되기 때문에, 멤버들이 자신의 공부 횟수와 환급 금액을 쉽게 확인할 수 있도록 돕는 것이 중요해요,
공부일지 공유 ✍️
공부 시작과 종료 시 작성하는 공부일지를 공유하여 학습 목표를 점검하고, 보다 체계적으로 공부할 수 있도록 지원하는 시스템이 필요했어요.
이전 글에서는 개인화 메시지를 보내기 위한 데이터를 어떻게 적재했는지 데이터파이프라인을 만든 과정을 소개했는데요 ('커뮤니티 운영에 데이터 활용하기 2편 : 데이터를 수집하고 커뮤니티 운영에 활용한 과정 소개' 링크)
어떻게 메시지를 보냈는지도 소개드리면 좋을 것 같아서 3편을 추가로 쓰게 됐습니다! 이번 글에서는 Google Apps Script를 사용하여 Google Spreadsheet 데이터를 읽고, Slack API를 통해 슬랙봇으로 멤버들에게 개인화된 메시지를 보내는 방법을 소개합니다🤗
이 글은 Google Apps Script를 활용해 스프레드시트 데이터를 슬랙봇으로 메시지 보내고 싶은 분들에게 도움이 될 거예요!
1️⃣ 공부일지 제출 & 2️⃣ 집계 테이블 생성
슬랙봇은 각 멤버들에게 두가지 정보(공부 횟수와 환급 금액, 공부일지)를 공유해주면 됩니다. 멤버들에게 공유해줄 정보는 멤버들이 제출한 공부일지를 활용하여 python으로 구글 스프레드시트에 집계 테이블을 만들어 둬서 두 테이블을 활용했습니다.
여러분도 활용하고자 하시는 데이터를 스프레드시트에 시트로 만들어두시면 전송할 준비는 끝났습니다!
3️⃣ Google Apps Script와 4️⃣ 슬랙봇으로 메시지 전송 을 위해선 아래 방법대로 진행하시면 됩니다!
개인화 메시지를 보내줄 슬랙 봇을 세팅하는 과정입니다! ①먼저 앱 관리에서 구축 버튼을 클릭하여 앱을 만들어줍니다!
② Incoming Webhook on 설정하고 App Home에서 DisplayName 설정합니다. Incoming Webhook을 on으로 설정하는 이유는 외부 시스템(ex. Google Apps Script)에서 슬랙 채널로 메시지를 전송할 수 있도록 하기 위해서입니다. Google Apps Script에서 API 호출을 통해 이 URL로 데이터를 보내면, 해당 데이터가 지정된 Slack 채널이나 User에게 메시지를 보내는 기능을 구현할 수 있습니다!
③ OAuth & Permissions에서 Bot Token Scopes에서 슬랙봇 권한을 추가해줍니다. 저는 im:write 권한을 설정해줄 건데요. 슬랙봇이 슬랙의 멤버에게 개인 메시지를 보낼 수 있도록 허용하는 권한입니다! 만약 슬랙 채널에 메시지를 보내는 기능을 구현하고 싶다면 chat:write 권한을 추가해주시면 됩니다. 그 외에 다양한 권한을 활용하고 싶으시면 slack api의 scope 공식 문서(링크)를 참고해보세요!
④ Basic Information에서 Display Information 작성 후, Install App 하여 token확인합니다. 권한 설정을 완료했다면, 이제 슬랙봇의 이미지와 설명을 작성한 뒤 앱을 설치하면 세팅이 완료됩니다! 설치 후 확인할 수 있는 token은 Google Apps Script에서 Slack API를 호출할 때, 요청을 인증하고 권한을 부여하는 역할을 합니다. 이 token은 Google Apps Script 코드에서 활용될 예정이며, Slack API 요청을 인증하는 중요한 보안 키이므로 외부에 유출되지 않도록 주의해야 합니다!
Slack API token을 확인했으니, Google App Script를 세팅해봅시다. ① 스프레드시트 확장프로그램에서 App Script를 열어주세요!
② Google App Script를 통해 스프레드시트 데이터를 읽고, Slack API를 호출해서 슬랙봇으로 메시지를 전송하는 코드도 작성해주면 되는데요! 코드 작성을 위해 스프레드시트 ID와 멤버들에게 개인 메시지를 보내기 위해 필요한 슬랙ID(user_id)를 확인해야합니다 확인하는 방법은 아래 이미지에 설명해뒀으니 참고해주세요. 사용한 코드도 주석을 통해 설명해뒀으니 여러분이 보내고 싶은 형태로 변경하셔서 사용하시면 됩니다. 슬랙은 슬랙메시지 블록을 통해 다양한 템플릿과 형의 메시지를 전송할 수 있는데요. 더 다양한 블록 예시는 slack block-kit 공식 홈페이지(링크)에서 참고 후 활용해보세요!
function sendMessages() {
// Google 스프레드시트 ID 입력
const spreadsheetId = '스프레드시트ID작성';
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
// 각 시트를 불러오기
const feeSheet = spreadsheet.getSheetByName('시트명작성');
const studySheet = spreadsheet.getSheetByName('시트명작성');
// 시트 데이터 가져오기
const feeData = feeSheet.getDataRange().getValues(); // 환급 관련 데이터
const studyData = studySheet.getDataRange().getValues(); // 공부 기록 데이터
for (let i = 1; i < feeData.length; i++) {
const feeRow = feeData[i];
// 사용자의 슬랙 ID 및 학습 데이터 가져오기
const user_id = feeRow[0]; // 사용자 Slack ID
const user_name = feeRow[2]; // 사용자 이름
const standard_fee_cnt = feeRow[3]; // 기준 환급 금액
const standard_study_cnt = feeRow[4]; // 기준 공부 횟수
const present_study_cnt = feeRow[5]; // 현재까지 공부한 횟수
const present_study_need_cnt = feeRow[6]; // 추가로 필요한 공부 횟수
const present_fee_cnt = feeRow[7]; // 현재 환급 예정 금액
const present_date = feeRow[8]; // 날짜
const present_time = feeRow[9]; // 시간
// 슬랙 메시지 블록을 구성 (사용자에게 보낼 메시지 템플릿)
let blocks = [
{
"type": "header",
"text": {
"type": "plain_text",
"text": `안녕하세요, ${user_name}님! 현재 공부 현황을 공유드립니다.`
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": `👉 ${present_date} ${present_time} 기준으로 ${present_study_cnt}번의 공부를 하셨습니다!\n`
}
}
];
// 목표 공부 횟수를 달성한 경우
if (present_study_need_cnt == 0) {
blocks.push({
"type": "section",
"text": {
"type": "mrkdwn",
"text": `*🥳 ${standard_study_cnt}번 이상 공부를 달성하셔서 ${standard_fee_cnt}원 전액 환급 예정입니다!*\n- 목표 달성을 위해 모여공을 정말 잘 활용하고 계신 것 같아요. 최고예요🎉\n- 퇴근 후와 휴일에도 꾸준히 공부하는 모습이 정말 멋져요👏\n`
}
});
} else {
// 목표 미달성한 경우
blocks.push({
"type": "section",
"text": {
"type": "mrkdwn",
"text": `*🙏 현재 ${present_fee_cnt}원을 환급 받을 수 있어요. 전액 환급을 위해서는 ${present_study_need_cnt}번의 추가 공부가 필요합니다.*\n- 2주 동안 꾸준히 공부 약속을 잡고 목표를 달성해보세요!\n- 작은 노력들이 큰 성과로 이어질 거예요. 끝까지 파이팅!💪\n`
}
});
}
// 해당 사용자의 공부 기록 가져오기
const userStudyInfo = studyData.filter(row => row[1] === user_id);
// 공부 기록이 있는 경우 멤버들이 작성한 공부일지 정보 제공
if (userStudyInfo.length > 0) {
blocks.push({
"type": "section",
"text": {
"type": "mrkdwn",
"text": `*✍️ ${user_name}님의 최근 공부 기록입니다.*\n- 공부한 내용을 돌아보고, 앞으로 어떻게 개선할 수 있을지 고민해보세요.`
}
});
blocks.push({ "type": "divider" });
// 각 공부 일지를 메시지 블록에 추가
userStudyInfo.forEach(studyRow => {
blocks.push({
"type": "section",
"text": {
"type": "mrkdwn",
"text": `*📚 ${studyRow[3]}회차 공부 일지:*\n` +
` - *일시*: ${studyRow[4]} ~ ${studyRow[7]}\n` +
` - *목표*: ${studyRow[5]} \n` +
` - *달성 결과*: ${studyRow[8]} \n` +
` - *목표 시간*: ${studyRow[6]} \n` +
` - *달성 시간*: ${studyRow[9]} \n` +
` - *공부 달성률*: ${studyRow[10]}\n` +
` - *(Keep) 잘한 점*: ${studyRow[11]}\n` +
` - *(Problem) 아쉬운 점*: ${studyRow[12]}\n` +
` - *(Try) 다음에 반영할 점*: ${studyRow[13]}\n`
}
});
blocks.push({ "type": "divider" });
});
} else {
blocks.push({ "type": "divider" });
blocks.push({
"type": "section",
"text": {
"type": "mrkdwn",
"text": `\n😂 ${user_name}님의 공부 일지 정보가 없습니다.\n`
}
});
}
// 사용자에게 슬랙 메시지 전송
sendSlackMessage(user_id, blocks);
}
}
// 슬랙 API를 통해 메시지를 보내는 함수
function sendSlackMessage(user_id, blocks) {
const token = '슬랙API토큰 입력'; // 슬랙 API 토큰 (보안 주의)
const url = 'https://slack.com/api/chat.postMessage';
// 전송할 데이터 구성
const payload = {
channel: user_id, // 슬랙 사용자 ID (DM으로 메시지 전송)
blocks: blocks // 위에서 만든 메시지 블록
};
// HTTP 요청 옵션 설정
const options = {
method: 'post',
contentType: 'application/json',
headers: {
'Authorization': 'Bearer ' + token // API 요청 인증
},
payload: JSON.stringify(payload) // JSON 데이터 변환
};
// 슬랙 API 호출
UrlFetchApp.fetch(url, options);
}
③코드 작성을 완료했다면 실행버튼을 눌러 테스트를 진행해보세요! 전체 멤버 ID가 담긴 시트로 테스트를 진행하면, 모두에게 테스트 메시지가 전송될 수 있으니 반드시 test시트를 만들어서 관리자 본인의 ID만 작성해서 진행하세요!
'실행이 완료됨'이 뜨고 슬랙 DM메시지가 왔다면 성공입니다🥳
저는 1~2개월의 짧은 기간동안 운영되는 커뮤니티여서 실행하기를 통해 일회성으로 메시지를 보냈는데요. ④구글 앱스크립트에는 트리거 기능이 있어 특정 시간대나 날짜에 자동으로 메시지를 보내거나 특정 이벤트(예: 스프레드시트 업데이트) 발생 시 실행되도록 설정할 수 있습니다. 또한 배포를 통해 웹 애플리케이션 또는 API로 스크립트를 외부에서 호출도 할 수 있으니 참고해주세요!
이번 글에서는 Google Spreadsheet 데이터를 사용하여 Google Apps Script와 Slack API를 활용해 슬랙봇으로 멤버들에게 개인화된 메시지를 보내는 방법을 소개했습니다. 방법이 간단하니, 직접 해보시며 업무나 커뮤니티 운영에 도움이 되는 슬랙봇을 만들어보시길 바랍니다😊
이번 글까지 총 4편에 걸쳐 사이드프로젝트를 진행하는 과정을 소개했는데요. 사이드프로젝트를 해야겠다고 생각만 하다가 실행에 옮기고, 그 실행 경험을 바탕으로 4개의 글을 작성하게 될 줄은 상상도 못했던 것 같습니다! 무엇이든 생각만 하지 말고 '그냥 하면 된다'는 마음으로 실행에 옮기면, 그 과정에서 많은 것을 배우고, 배운 것을 글로 쓰면 경험을 나눌 수 있다는 것을 알게 됐습니다! 정말 감사한 경험이었어요! 여러분의 실행도 응원합니다💪