본문 바로가기

Develop/Tool

Slack , Google spreadsheet 활용하여 업무 효율성 높이는 방법 🤪

일을 하다보면 

이력 관리에 중요성을 정말 많이 깨닫게 된다.

보고용 자료를 만들 경우에도 전에 일하던 사람 업무를 이어 받을 경우에도.. 유지보수 할 때도 마찬가지다 😂

분명 작성 당시에는 번거로움이 있을 순 있어도 필요한 시점에 이력이 없으면 입이 대빨 튀어 나오게 된다 😑 

 

이미 사내에서 협업도구로 트렐로를 이용하고 있지만 

트렐로는 타 부서에서 요청 시 이력을 관리하고 있는 것으로 보여졌다.

팀 내부에서는 간단하게 메신저로만 주고 갈 뿐 제대로 기록 되지 않아 

기획자분들이 개발자분들에게 전달할 때  누락되거나 잘못 와전되는 경우도 허다 했다.

기존에 구글 시트를 많이 이용하고 있는 것을 보고

구글 스크립트와 슬랙을 엮어보면 어떨까? 하고 간단하게 만들어 보았다 😩

 

 

자 그럼 본격적으로 슬랙과 구글을 연동하도록 하자 😀


 

준비 🛠

1. 슬랙 워크스페이스 개설 , 채널 개설

2. 슬랙 app 준비(추천) or Incoming Webhook (필자는 슬랙 app을 추천한다 이유는 

인커밍 웹훅은 퇴사하면 끊어져버리는 경우가 생길 수 있으므로..)

3. 구글 시트 준비

4. 구글 스크립트 작성

5. 확인

 

https://api.slack.com/ 에서 

슬랙 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

 

'구글 스프레드시트'로 '슬랙 리마인더 봇' 만들기

모두가 고객과 직접 대화하기 식스샵에선 서비스 운영팀 분들 외에도 모든 구성원이 고객 상담 업무에 참여하고 있다. 이는 창업 초반 Wufoo의 공동 창업자 Kevin Hale이 ' How to build products users love '

sonujung.com

https://techblog.lotteon.com/%EB%A1%AF%EB%8D%B0e%EC%BB%A4%EB%A8%B8%EC%8A%A4-slack-bot-%ED%99%9C%EC%9A%A9%EA%B8%B0-273be23489ed

 

Slack bot을 통한 업무 활용스토리 #1

Slack 도입이 가져온 롯데e커머스의 변화 🎁

techblog.lotteon.com

https://api.slack.com/reference/messaging/attachments

 

Reference: Secondary message attachments

Another way to attach content to messages is the old attachments system. We prefer Block Kit now.

api.slack.com

 

반응형