Google Form - Google App Script 활용하기

업무를 하거나 편리함을 위하여 구글에서 제공하는 다양한 서비스(ex. Drive, Email, Calendar etc) 를 사용하는게 일상화 되어있다. 이러한 도구들을 활용할 수 있도록 구글에서는 앱 스크립트 기능을 제공하고 있는데, 실제 업무에 도입하여 활용할 수 있을 부분들에 대하여 정리하고 공유하려 한다. 그중 실제 업무에 적용하여 서비스를 좀 더 효율적으로 사용했던 부분들에 대하여 정리하고 공유하여 이 글을 보는 사람들에게 도움이 되었으면 한다.

Google Form 서비스

설문을 작성하면 구글 시트 문서에 응답내용을 자동으로 기록되는 기능을 사용하는데, 응답내용을 관리하는 작업 담당자에게 일일히 알림이 전달되지는 않는다.(크롬 웹스토어에서 관련 기능을 대신 제공해주는 서비스를 다운받아 쓰는 방법이 있기는 하지만 꼭 필요한 기능과 연계하려면 결국 필요한 작업을 추가해 줘야 한다.) 업무에 실제 사용하는 다른 도구들과 연계할 수 있으면 좋을 것으로 생각되어 Form 서비스와 연계할 수 있는 Feature List 와 이를 실제 어떻게 스크립트를 작성하여 쓸 수 있을지 정리해보았다. 설문지 작성 제출 시 데이터를 활용하는 방안과 그 알림을 좀 더 효율적으로 관리하는데 고민하였으며 그것을 적용하여 사용하였다.

설문 제출 시 Trigger 설정
Slack에 알림 보내기
설문 내용을 이메일로 공유하기
시간 정보를 활용하여 캘린더에 일정 추가하기

구글 폼 문서에서 스크립트를 작성하려면 ‘메뉴 - 스크립트 편집기’ 에 접근하여 작업을 진행하면 된다.(구글 문서들도 모두 동일하다.) 하나의 문서에는 해당 문서의 스크립트 문서가 생성되도록 되어있다. 선택하게 되면 새로운 창으로 스크립트 작성이 가능한 창이 오픈된다. 해당 메뉴는 브라우저의 창 사이즈가 일정 이상이 되어야 표시된다.

스크립트 메뉴


# 설문 제출 시 Trigger 설정

아래와 같이 작성하여 설문 제출 시 호출될 함수를 먼저 작성한다.

function onFormSubmit(e) { 
  var email = e.response.getRespondentEmail();
  var responseList = e.response.getItemResponses();
  
  var questions = new Array(responseList.length);
  var answers = new Array(responseList.length);
  for(var i=0; i<questions.length; i++) {
    questions[i] = responseList[i].getItem().getTitle();
    answers[i] = responseList[i].getResponse();
  }

  Logger.log("Form was submitted from " + email);
}

응답으로 전달받는 파라미터는 Forms 객체 정보이다. 해당 정보를 통해서 실제 응답에 대한 정보를 읽어들여 활용할 수 있다. 위 코드는 설문 조사의 질문 및 응답을 추출하고, 설문을 제출한 사용자의 이메일 주소를 로그 출력하였다. 설문 제출 시 특정 함수를 호출 시키기 위하여 Trigger를 설정하면 된다. 스크립트 편집기 화면에서 ‘수정-모든 트리거보기’ 에서 새로운 트리거를 추가하면 된다. 트리거 설정 시 알림 설정 (실패에 대한)은 반드시 하자.

트리거 설정

로그 출력이 되었으면 설문 제출 시 정상적으로 트리거 설정이 완료 된 것이다. 여기서 주의해야 할 점은 구글 폼 문서 - 스크립트 문서는 쌍으로 존재하지만 같은 함수를 여러사람이 트리거로 설정하게 되면 각 트리거가 모두 실행된다는 점이다. 심지어 각 실행된 트리거는 같은 스크립트라고 해도 실제 설정한 계정의 권한에 따라 다르게 동작할 수 있으니 주의해야 한다. 예를들어, 캘린더에 일정을 등록하는 스크립트에 대하여 A계정은 해당 캘린더에 대한 접근권한이 없을 경우 정상적으로 스크립트가 동작하지 않지만, B계정은 해당 캘린더에 대한 접근권한이 있다면 정상적으로 스크립트가 동작하게 된다.

# Slack에 알림 보내기

슬랙을 업무에 활용중이라면 설문 응답 시 알림을 슬랙으로 받아볼 수 있을 경우 편리해진다. 이를 스크립트로 처리할 경우 슬랙에서 제공하는 Incoming Webhook API 를 활용할 수 있다. API 에서 제공되는 JSON형식으로 메시지를 Webhook URL로 던지면 해당 채널에 Slack 메시지를 보낼 수 있다. 어느정도 메시지 형식 커스터마이징도 가능하다.

Slack-Incoming WebHook

Add Configuration을 선택하고 알림을 받을 채널을 설정한다. 채널은 새로 만들 수도 있고, 개인 DM으로 연결도 가능하다. 설정 시 Webhook URL을 잘 챙겨두자. 스크립트 작성시 해당 URL에 JSON메시지를 구성해서 POST 전송하면 된다.

function sendSlackMessage(email, questions, answers) {
  var POST_URL = "https://hooks.slack.com/[webhook_url]";
  
  // 응답 항목으로 메시지를 만든다.
  var sendMessage = "[설문 제출 응답 내용 메시지]";
  var payload = { 
    "payload": '{"attachments":[{ "fallback":"새로운 응답이 있습니다.", "pretext":"새로운 응답이 있습니다.", "color":"#D00000","fields":[{ "title": "' + email + '", "value": "' + sendMessage + '", "short" : false }]}, ]}' 
  }
  
  var options = {
    "method" : "post",
    "payload": payload
  };
  
  UrlFetchApp.fetch(POST_URL, options);  
}

슬랙에 전송될 메시지 형식은 API에서 제공되는 내용을 참조하여 구성하면 된다.

# 설문 내용을 이메일로 공유하기

슬랙을 사용하지 않는다면 이메일로 알림을 전달해도 좋다. Gmail API를 활용하여 전송하는데, 중요한 것은 트리거로 설정하는 계정을 이용하여 메일이 발송된다는 것이다. 보통 이메일로 일일히 사용하지 않고 대표 그룹 (ex. all@wantedlab.com … ) 계정에 메일을 보낼 수 있도록 사용하는데, 해당 스크립트를 트리거로 설정한 계정이 만약 해당 그룹 계정에 대한 권한이 없을 경우 메일이 발송되지 않을 수 있으므로 주의가 필요하다.

function sendEmail(questions, answers) {  
  var title = "[메일 제목]"; // 응답 내용으로 만들기
  var body = "[메일 본문]";  // 응답 내용으로 만들기
  var to = "all@wantedlab.com";
  MailApp.sendEmail(to, title, body);
}

설문 항목 및 응답 내용을 html컨텐츠로 잘 만들어서 보내면 좀 더 이쁘게 활용 할 수 있다.

# 시간 정보를 활용하여 캘린더에 일정 추가하기

응답항목의 날짜 정보를 활용하여 캘린더에 직접 이벤트를 추가하는 것도 활용할 수 있는 방법이다. 실제 설문 응답으로 전달받는 데이터는 ‘yyyy-MM-dd’ 의 문자열 형태로 응답을 받는데, 먼저 Date formate 으로 변경할 필요가 있다.

function convertDate(dateString) {
  var year = dateString.substring(0, 4);
  var month = dateString.substring(5, 7);
  var day = dateString.substring(8, 10);
  var date = new Date(year, month-1, day);
  return date;
}

function createEvent(subject, dateString) {
  var date = convertDate(dateString);
  var calendarId = "all@wantedlab.com"; // Your calendar Id
  var calendar = CalendarApp.getCalendarById(calendarId);
  
  // create 
  calendar.createAllDayEvent(subject, date);
}

Date객체를 활용하여 Google Calendar API 의 Event 생성 API 를 활용하면 된다. Calendar Id 는 Calendar 서비스에 접속하여 이벤트를 생성시킬 Calendar settings 메뉴에서 확인할 수 있다. 마찬가지로 Calendar 에 이벤트 추가 / 삭제 등의 행위는 Form 문서에 Trigger 를 설정한 계정이 해당 캘린더에 대하여 수정 권한이 있어야 정상 동작된다. 공휴일에 일정을 등록하지 않는 등의 추가 처리를 하려면 아래와 같이 체크 로직을 추가하여 활용한다.

function isKoreanHoliday(dateString) {   
  var date = convertDate(dateString);
  // korean holiday calendar
  var calendarId = "en.south_korea#holiday@group.v.calendar.google.com"; 
  
  var cal=CalendarApp.getCalendarById(calendarId);
  var holidays = cal.getEventsForDay(date);

  return holidays.length != 0; 
}

마치며

정리한 내용들은 모두 Google Form을 좀 더 활용하기 위한 방법이고, 기능적으로 다양하게 추가하고 싶다면 Google App Script를 한번 쯤 필요한 기능을 위하여 코드를 작성해보면 개발자라면 손쉽게 작성이 가능하다. 위에 나열한 기본적인 기능들만 활용하여도 업무에 효율적으로 사용할 수 있는 다양한 기능들을 적용할 수 있을 것으로 생각한다.


참조