Spreadsheet에서 관리하는 TODO를 GAS를 사용하여 슬랙에 리마인드

개요



매월 1 개 정도는 기사 책이라든지, 유급이 능숙하게 잡히지 않아 기한이 오기 전에 정리해 버터 버터 잡으면 힘들기 때문에 매월 1회는 취하자-라든지
정기적으로하지 않으면 안되지만 잊어 버리는 경향이나 설문지
리마인드해도 리마인드하는 것조차 잊어 버리므로, 팀 모두 정리해 리마인드 하는 스크립트를 만들었습니다.

스프레드시트로 관리하는 것으로, 자신만이 아니고 다른 누군가가 알아차리고 추가할 수 있어 운용할 수 있다는 것이 꽤 좋다고 생각하고 있다.
그리고 개인적으로 ○○씨는 이미 끝나고 있는지 말하는 몰입이 효과가 있다.

TODO 관리할 Spreadsheet 형식



다음 형식으로 TODO 라는 이름으로 만들어 스크립트 편집기에 소스 코드를 붙이면 아마 움직입니다.


소스 코드



gas
var SPREADSHEET = SpreadsheetApp.getActiveSpreadsheet();
var SHEET = SPREADSHEET.getSheetByName('TODO');
var SLACK_WEB_HOOK_URL = 'ここにウェブフックのURL';
var TODO_SHEET = 'TODOが管理されてるシートのURL';

function main() {
  const today = new Date();
  // 営業日以外はおとなしくしとく。
  if (!isBusinessDay(today)) {
    return;
  }

  const message = getReminderMessage()
  if (message.length) {
    message += "\n\n対応お願いします。"
    message += "\n" + TODO_SHEET
    postSlack(message)
  }
}

function getReminderMessage() {
  const range = SHEET.getRange('3:1001');
  const today = new Date();

  var message = []
  range.getValues().forEach(function(row, rowIndex){
    const notCompatible = []
        if (typeof(row[1]) == 'object' && row[1].getTime() < today.getTime()) {
          row.forEach(function(e, index) {
            if (e == '未対応') {
              notCompatible.push(getName(index+1))
            }
          })

          if (notCompatible.length) {
            message.push(row[0] + "の期日です。")
            message.push(notCompatible.map(function(e) { return "<@" + e + ">" }).join(" "))
          }
      }
  })

  if (message.length) {
    message.push("\n\n対応お願いします。")
    message.push("\n" + TODO_SHEET)
  }
  return message.join("\n")
}

// 2行目に書いてるslackID取得するやつ
function getName(index) {
  const slackIdRow = '2'
  const range = SHEET.getRange(wmap_column_convert(index) + slackIdRow);
  return range.getValue()
}

//列番号のアルファベット列名変換
function wmap_column_convert(colmun_number) {
  var result = SHEET.getRange(1, colmun_number);
  result = result.getA1Notation();
  result = result.replace(/\d/,'');

  return result;
}

// 営業日かどうか
function isBusinessDay(date){
  if (date.getDay() == 0 || date.getDay() == 6) {
    return false;
  }
  var calJa = CalendarApp.getCalendarById('ja.japanese#[email protected]');
  return calJa.getEventsForDay(date).length === 0
}

function postSlack(message) {
  var jsonData =
  {
    "link_names" : 1,
    "text" : message
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(SLACK_WEB_HOOK_URL, options);  
}

slack의 사용자 ID를 얻는 방법



사용자의 상세 화면을 내고 메뉴 같은 곳을 누르면 복사 할 수있는 것 같습니다.


참고



Google Apps Script에서 영업일을 결정하여 트리거를 만드는 방법
스프레드시트에서 관리하는 작업을 Slack에 리마인드하는 방법

좋은 웹페이지 즐겨찾기