【Google Apps Script】 그 21 지정 시간에 메시지를 자동 투고하는 Chatwork bot를 만든다

이 기사는 Google Apps Script를 실례로 섞어서 기초에서 자세하게 배운다 Advent Calendar 2017 21 일째 기사입니다.

본 어드벤트 캘린더는 @rt_p의 개인 프로젝트이지만, 필자는 Ateam Brides Inc. Advent Calendar 2017에도 참가하고 있습니다. 그쪽에서도 출장판 기사를 쓰고 있으므로, 들여다 주시면 기쁩니다.

소개



매일 10시에 메시지를 보내고 싶다.
매월 1일 12시에 메시지를 보내고 싶다.
등, 스케줄에 따른 메시지를 Chatwork에 보내고 싶은 것이 많네요.

오늘은 크론처럼 메시지 자동 게시 시스템을 소개합니다.





스프레드시트 준비



스프레드시트를 새로 만듭니다.
그리고 시트 이름(스프레드 시트 이름이 아님)을 타이머로 변경합니다.
그런 다음 A1 셀에 커서를 놓고 다음 내용을 복사합니다.



시간


요일
토, 일, 휴일
메시지 내용



*
*
*
*
*
0
테스트
[chatwork 방 ID]


[chatwork 방 ID]에 자동 게시할 방의 ID를 입력합니다.
※그 방에 Chatwork 토큰을 취득한 계정이 초대되어 있어야 합니다.



GAS 준비



스크립트 편집기를 열고 다음 코드로 바꾸고 실행합니다.
스크립트 편집기를 여는 방법과 승인이 필요합니다. 메시지가 나왔을 때 해결책을 모르는 경우
어드벤트 캘린더 첫날 Hello, world! 기사을 참조하십시오.

message_bot.gs
var token = 'YOUR_TOKEN'; // ここにトークンを入力
var ALL = '*';
var COLUMNS = ['minute', 'hour', 'day', 'month', 'week'];

function myFunction() {
  var sheet  = SpreadsheetApp.getActive().getSheetByName('タイマー');
  var values = sheet.getDataRange().getValues(); // 全メッセージリストを取得

  var currentTime = new Date();
  var holidayFlg = isHoliday(currentTime);

  var times  = {
    'minute':      Utilities.formatDate(currentTime, 'Asia/Tokyo', 'm'),
    'hour':        Utilities.formatDate(currentTime, 'Asia/Tokyo', 'H'),
    'day':         Utilities.formatDate(currentTime, 'Asia/Tokyo', 'd'),
    'month':       Utilities.formatDate(currentTime, 'Asia/Tokyo', 'M'),
    'week':        Utilities.formatDate(currentTime, 'Asia/Tokyo', 'u'),
    'holiday_flg': holidayFlg
  };

  for (var i = 1; i < values.length; i++) { // 1行目は説明行なので
    executeIfNeeded(values[i], times);
  }
}

// 実行すべきタイミングか判定し、必要であれば実行
function executeIfNeeded(value, times) {
  for (var i in COLUMNS) { // minute, hour, day, month, weekを順番にチェックして全て条件にマッチするか判定
    var timeType = COLUMNS[i];
    if (!isMatch(value[i], times[timeType])) {
      return false;
    }
  }

  // 土日休フラグの検証
  if (value[5] == 0 && times['holiday_flg']) {
    return false;
  }

  postToChatworkMessage(value[6], value[7]);
}

// 中身が*もしくは指定した数字と一致するか
function isMatch(time, currentTime) {
  return (time === ALL || time == currentTime);
}

// 祝日か判定
function isHoliday(today) {
  var week = Utilities.formatDate(today, 'Asia/Tokyo', 'u');
  if (week == 6 || week == 7) { // 土日判定
    return true;
  }

  var calendarId = "ja.japanese#[email protected]";
  var holidays = CalendarApp.getCalendarById(calendarId).getEventsForDay(today); // 休日の場合、日本の祝日カレンダーにイベントが登録されている
  return holidays.length > 0;
}

// chatworkにメッセージ投稿
function postToChatworkMessage(body, roomId) {
  var payload = {
    'body': body
  }
  var headers = {
    'X-ChatWorkToken': token
  }
  var options = {
    'method' : 'POST',
    'payload' : payload,
    'headers' : headers
  }
  var url = 'https://api.chatwork.com/v2/rooms/' + roomId + '/messages';
  UrlFetchApp.fetch(url, options);
}

그다지 바뀐 일은 하고 있지 않습니다만, 특필한다면 여기일까요.
  var calendarId = "ja.japanese#[email protected]";
  var holidays = CalendarApp.getCalendarById(calendarId).getEventsForDay(today);

Google 캘린더의 '일본 공휴일'을 받고 오늘 이벤트가 등록된 경우 휴일로 판단하여 true를 반환합니다.
  var token = 'YOUR_TOKEN'; // ここにトークンを入力

Chatwork 토큰을 얻는 방법은 16일째 기사을 참조하십시오.
myFunction() 실행하면 Chatwork에 메시지가 도착하면 성공합니다.

정기 실행 설정



스크립트 편집기에서 스톱워치 아이콘을 클릭하고 다음과 같이 설정합니다.



그러면 매분 다음과 같이 메시지가 도착합니다.



스프레드시트 조정



이제 매분 '테스트'가 게시되는 것을 확인할 수 있으면 나중에 원하는대로 설정하십시오.
Cron과 같이 쉼표로 구분하거나 범위 지정은 할 수 없지만(24일째 기사에서 언급할 예정입니다), *(별표)로 무조건 전달, 숫자 입력으로 지정 타이밍에 전달합니다.

또한 주말과 휴일은 크론에없는 자체 구현입니다.
업무로 사용하고 있으면 토일 휴일은 통지하고 싶지 않은 경우가 많기 때문에, 통지하지 않는 경우는 0을, 토일 휴일도 불문하고 통지하고 싶은 경우는 1을 설정해 주세요.

설정 예



매일 10시 0분, 평일만 게시하고 싶다면,
분의 열에 0시의 열에 10 다음은*(별표)를 입력, 토일요일 휴는 0을 설정합니다.

결론



오늘은 GAS만으로 메시지 자동 게시 bot을 만들었습니다.

스프레드시트로 관리하고 있으므로, 메시지의 등록·편집·삭제를 매우 용이하게 할 수 있어 비엔지니어에게도 접해지기 쉬운 시스템이 되고 있습니다.
(반면, 의도하지 않은 변경이나 입력에 주의)

내일



【Google Apps Script】 그 22 Google Analytics의 데이터를 끌어온다
됩니다.
Google 서비스 연계의 용이성을 활용하여 GA 데이터를 가져옵니다.

이전 기사
【Google Apps Script】 그 20 오늘의 예정을 Chatwork에 일괄 통지한다
다음 기사
【Google Apps Script】 그 22 Google Analytics의 데이터를 끌어온다

좋은 웹페이지 즐겨찾기