일을 하다보면
이력 관리에 중요성을 정말 많이 깨닫게 된다.
보고용 자료를 만들 경우에도 전에 일하던 사람 업무를 이어 받을 경우에도.. 유지보수 할 때도 마찬가지다 😂
분명 작성 당시에는 번거로움이 있을 순 있어도 필요한 시점에 이력이 없으면 입이 대빨 튀어 나오게 된다 😑
이미 사내에서 협업도구로 트렐로를 이용하고 있지만
트렐로는 타 부서에서 요청 시 이력을 관리하고 있는 것으로 보여졌다.
팀 내부에서는 간단하게 메신저로만 주고 갈 뿐 제대로 기록 되지 않아
기획자분들이 개발자분들에게 전달할 때 누락되거나 잘못 와전되는 경우도 허다 했다.
기존에 구글 시트를 많이 이용하고 있는 것을 보고
구글 스크립트와 슬랙을 엮어보면 어떨까? 하고 간단하게 만들어 보았다 😩
자 그럼 본격적으로 슬랙과 구글을 연동하도록 하자 😀
준비 🛠
1. 슬랙 워크스페이스 개설 , 채널 개설
2. 슬랙 app 준비(추천) or Incoming Webhook (필자는 슬랙 app을 추천한다 이유는
인커밍 웹훅은 퇴사하면 끊어져버리는 경우가 생길 수 있으므로..)
3. 구글 시트 준비
4. 구글 스크립트 작성
5. 확인
슬랙 app을 만들 수 있다.
간단하게 정보 입력 후 Incoming Webhooks 메뉴 진입 후 활성화 하고
화면 하단에 Add New Webhook to Workspace 버튼을 클릭 하여
웹 훅을 받을 채널을 선택하면 된다.
이후에 url을 카피해서 메모해두고
구글 시트로 들어가서
상단 탭에 확장프로그램 - Apps Script 클릭
sendSlackMessageIfEmptyEColumn 함수는
알림 발송 시 알림이 나갈 함수이고
dailyReport 함수는 트리거를 이용하여
매일 아침 10시에 집계하여 자동으로 슬랙 채널에 전송해주는 함수이다.
// Slack 웹훅 URL 설정
const slackWebhookUrl = "";
function sendSlackMessageIfEmptyEColumn() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName("일정관리");
// D5:D1000 범위에서 값 확인
var dataRange = sheet.getRange("D5:D1000");
var dataValues = dataRange.getValues();
var lastRow = dataRange.getLastRow();
// Slack 메시지 전송 함수
function sendSlackMessage(m0,m1,m2,m3) {
var currentTime = Math.floor(new Date().getTime() / 1000);
var payload = {
"channel": "ABCDEBF1",
"attachments":
[
{
"mrkdwn_in": "",
"color": "#36a64f",
"pretext": "[" + m0 + "] 업무를 확인해주세요.",
"title": "구글 시트 확인하기",
"title_link": "타이틀 선택 시 이동 될 링크",
"text": m1 + "\n담당자는 일자를 입력해주세요.\n검수자는 최종 확인 후 상태 값을 완료 또는 반려로 변경해주세요.",
"fields":
[
{
"title": "담당자",
"value": m2,
"short": true
},
{
"title": "검수자",
"value": m3,
"short": true
}
],
"thumb_url": "http://placekitten.com/g/200/200",
"footer": "footer",
"footer_icon": "https://platform.slack-edge.com/img/default_application_icon.png",
"ts": currentTime
}
]
};
var options = {
method: "post",
payload: JSON.stringify(payload),
contentType: "application/json"
};
UrlFetchApp.fetch(slackWebhookUrl, options);
}
// D5:D1000 범위 반복 및 E열 값 확인
for (var i = 0; i < lastRow - 4; i++) {
var cValue = sheet.getRange(5 + i, 3).getValue();
var dValue = dataValues[i][0];
var eValue = sheet.getRange(5 + i, 5).getValue();
var gValue = sheet.getRange(5 + i, 7).getValue();
var hValue = sheet.getRange(5 + i, 8).getValue();
var lValue = sheet.getRange(5 + i, 11).getValue();
Logger.log("lValue 값: " + lValue);
if (cValue !== "" && dValue !== "" && eValue !== "" && lValue !== "🙆♂️🙆♀️") {
sendSlackMessage(cValue,dValue,gValue,hValue);
sheet.getRange(5 + i, 12).setValue("🙆♂️🙆♀️");
} else if (dValue === "" && eValue === "" && lastRow > 0) {
break;
}
}
}
function dailyReport(){
// 스프레드시트 및 시트 설정
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName("일정관리"); // 시트 이름을 업데이트하세요.
// D5:D1000 범위에서 값 확인
var dataRange = sheet.getRange("D5:D1000");
var lastRow = dataRange.getLastRow();
// E열 및 K열에서 "완료", "보류", "접수", "반려" 갯수를 세기 위한 변수 초기화
var countCompletedE = 0;
var countPendingE = 0;
var countAcceptedE = 0;
var countCompletedK = 0;
var countRejectedK = 0;
var forFlag = false;
// D5:D1000 범위 반복 및 E열과 K열 값 확인
for (var i = 0; i < lastRow - 4; i++) {
var eValue = sheet.getRange(5 + i, 5).getValue(); // E열 값 가져오기
var kValue = sheet.getRange(5 + i, 11).getValue(); // K열 값 가져오기
if (eValue === "완료") {
countCompletedE++;
} else if (eValue === "보류") {
countPendingE++;
} else if (eValue === "접수") {
countAcceptedE++;
}
if (kValue === "완료") {
countCompletedK++;
} else if (kValue === "반려") {
countRejectedK++;
}
if(eValue === "" && kValue === ""){
forFlag = true;
break;
}
}
if(forFlag){
// to do 다음 행이 비어 있을 경우 처리
}
// Slack 메시지 생성
var slackMessage = "데일리 보고:\n담당자 확인 집계: 완료-" + countCompletedE + ", 보류-" + countPendingE + ", 접수-" + countAcceptedE +
"\n검토자 확인 집계: 완료-" + countCompletedK + ", 반려-" + countRejectedK;
// Slack 메시지 전송
var payload = {
"channel": "YOUR_CHANNEL_ID", // Slack 채널 ID를 업데이트하세요
"text": slackMessage
};
var options = {
method: "post",
payload: JSON.stringify(payload),
contentType: "application/json"
};
UrlFetchApp.fetch(slackWebhookUrl, options);
}
알림발송 버튼을 누르면
참고 레퍼런스
Incoming Webhook 을 이용하게 된다면 이분이 잘 정리한거 같다 😃
https://sonujung.com/slack-reminder-with-google-spread-sheets
https://api.slack.com/reference/messaging/attachments