-
[GAS] 구글 앱스 스크립트를 이용해 구글 설문 결과 슬랙 알람을 만들어보자(Feat. django)Dev 2021. 1. 12. 01:52
안녕하세요.
오늘은 구글 앱스 스크립트(GAS)를 이용하여 구글 설문 콜백을 통해 알람을 구현해보겠습니다.
구글 설문의 제출 결과를 구글 스프레드시트에 연동하는 것은 아주 간단하지만, 그러면 꼭 시트를 주기적으로 확인해봐야 모니터링할 수 있다는 단점이 있었습니다. Gmail로도 연동도 가능하나, 저희 팀에서는 슬랙을 공용 업무 툴로 사용하고 있기 때문에 업무 쓰레드를 통일시키기 위해 슬랙 알람으로 메시지를 보내도록 구현해보았습니다.
🧐 GAS란?
Google Apps Script는 Google Workspace 플랫폼(스프레드시트, 워드 등등)에서 사용하기 위해 사이드 프로젝트로 개발한 스크립팅 플랫폼입니다. 경량화된 앱을 만들기 위해 많은 기능을 제공하고 자체 서버에서 Event, Trigger 처리를 돌려주기 때문에 데이터를 관리하기 더 쉽다는 장점도 있습니다. 100% 무료이기 때문에 MS Excel보다는 좀 더 쉽게 스크립트 개발을 할 수 있다는 장점이 있습니다. 특히 Javascript를 기반으로 한 언어이기 때문에 러닝커브가 낮다는 장점도 있습니다. 어쩌다보니 몇몇 시각화를 위한 데이터 관리는 구글 스프레드시트를 통해 하고 있고, 자바스크립트를 사용한다는 점에 끌려서 채택하게 되었습니다.
자세한 내용은 레퍼런스를 참고해보세요.
developers.google.com/apps-script/api
실제 개발에 들어가봅시다. 저희 서버는 장고를 이용하고 있기 때문에, 장고에서 API를 만들고 GAS 서버에서 설문이 도착했을 때 해당 API를 호출하는 식으로 구현하기로 하였습니다.
✉️ 1. 슬랙 API 만들기
슬랙 API는 레퍼런스가 아주 잘 되어 있는 편에 속합니다. 다른 앱과의 Intergration로 많이 지원하지만 바로 구글 스프레드시트 설문 콜백과 연결하는 것은 찾지 못하여 알람 API를 찾아봅시다. 특히 고유 앱을 이용하여 특정 채널에 메시지를 보내는 기능은 아주 간단합니다. 장고에서는 Slacker라는 것을 install해주면 아주 간단하게 사용할 수 있습니다.
$ pip install slacker
(저는 slacker 0.14.0 버전을 사용중입니다)
Slacker가 설치되었다면 API를 만들어보겠습니다.
send_slack.py
from slacker import Slacker Token = '고유 Slack 토큰' def slack_msg(slack_channel, slack_message): try: slack = Slacker(TOKEN) slack.chat.post_message(slack_channel, slack_message) except Exception as e: print(e)
아주 간단하죠? 고유 슬랙 Workspace가 있다면, 앱을 제작하여 고유 토큰을 받을 수 있습니다. (사용하는 멤버쉽에 따라)
그 토큰을 Slacker에 넣어주기만 하면 바로 사용이 가능합니다. post_message를 통하여 원하는 채널, 원하는 메시지를 String 형태로 전송할 수 있습니다. 놀랍게도 이게 끝입니다. 이제 API를 만들어 이 slack_msg 함수를 호출해주기만 하면 되겠습니다.
View를 하나 만들어보겠습니다.
views.py
class SlackAlertAjaxView(View): def post(self, request, *args, **kwargs): try: slack_msg = request.POST.get('msg') slack_channel = request.POST.get('channel') if slack_msg and slack_channel: slack_msg(slack_channel, slack_msg) return HttpResponse(status=200) return HttpResponse(status=400) except Exception as e: print(e)
msg와 channel을 파라미터로 갖는 POST 요청을 생성해줍니다. 그리고 간단한 예외처리만 한 후 배포해주었습니다.
이제 구글 설문이 도착하면 콜백으로 해당 API를 호출하여 알람을 보내주면 되겠습니다.
📞 2. 트리거 연결하여 API 호출하기
이제 GAS를 본격적으로 사용해봅시다. 사용하는 시트에서 도구 -> 스크립트 편집기를 들어가면 바로 코드를 작성할 수 있는 에디터가 나옵니다.
GAS 레퍼런스를 참조해보면 아주 많은 트리거를 제공하고 있습니다.
developers.google.com/apps-script/guides/triggers
그중에서도 '양식이 제출되었을 때' 발동되는 onFormSubmit()을 사용해보겠습니다. 레퍼런스를 참고하니 구현은 간단했습니다.
function Initialize() { var triggers = ScriptApp.getProjectTriggers(); for (var i in triggers) { ScriptApp.deleteTrigger(triggers[i]); } ScriptApp.newTrigger("sendSlack") .forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet()) .onFormSubmit() .create(); } function sendSlack(e) { var API_HOST = 'API url' var data = { "msg" : "설문이 도착했어요!" "channel" : "test_alert", } var payload = JSON.stringify(data); var options = { "method" : "POST", "payload" : payload }; var response = UrlFetchApp.fetch(API_HOST, options); }
Initialize 함수에서는 sendSlack을 사용하는 Trigger를 등록해줍니다.
이때 forSpreadsheet은 어떤 스프레드시트에 대하여 트리거를 적용할지에 대해서 묻습니다. 따라서 현재 들어온 시트를 불러와주는 함수인 getActiveSpreadsheet() 를 호출합니다.
그리고 onFormSubmit()이벤트를 연결해주고 생성합니다.
sendSlack()에서는 아까 만들어놓은 API를 호출합니다. 신기한 방식을 사용하는데, 이것은 GAS에서 HTTP 통신을 위해 만들어놓은 UrlFetchApp을 사용하는 방식입니다. 신기한 방식이긴 하지만 다른 API 호출 방식과 여간 다른 것이 없습니다.
이렇게 구현을 마치고 저장하면 따로 웹앱 배포를 하지 않아도 트리거가 설정되어 알아서 구글 자체 서버에서 이벤트를 돌려주기 시작합니다.
😎 실제로 사용하기
트리거가 제대로 설정되었는지 확인해 봅시다.
물론 그전에 API가 정상적으로 호출되는지부터 살펴야겠죠?
새 편집기가 나왔으나 잘 모르고 구 편집기로 진행했습니다.ㅠㅠ
자체 에디터에서 다음과 같이 실행/디버깅을 제공합니다. Log App을 활용하면 로그도 찍어보면서 확인할 수 있습니다. 정상 작동이 확인되면 다음 버튼을 눌러 트리거 페이지로 진입해줍시다.
현재 등록된 트리거에 대하여 리스트가 나옵니다. 오류율과 실사용 현황이 조회되기 때문에 제대로 트리거가 작동하고 있는지 검증이 가능합니다. 이렇게 설정이 끝났습니다!
이제 구글 설문을 작성하고 결과가 제출되면, 해당 스프레드시트에 기록되고 트리거에 의하여 슬랙에 알람이 오게 될 것입니다!
📚 출처
- 구글 앱스 스크립트
developers.google.com/apps-script/reference/script/form-trigger-builder?hl=en
- Slack API
'Dev' 카테고리의 다른 글
[CSS] transform scale을 이용한 Image Zoom 애니메이션 넣기 (2) 2020.12.29 내 사이트 이미지 로딩속도는 왜 느릴까? (1) 2020.12.22 내 맘대로 추천하는 프론트엔드/리액트 개발자를 위한 편리한 VSCode Extension(확장 프로그램) 모음 (0) 2020.12.15 [django] shell 스크립트를 이용해 배포 자동화하기 (0) 2020.11.30 웹 개발에서 svg 형식의 이미지 파일을 활용해보자 (0) 2020.10.04