yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

この記事は3年以上前に書かれた記事で内容が古い可能性があります

Google Apps Scriptを使ってタスクをSlackにポストする2(User変数などGAS側の設定からSlackに投稿するまで)

2018-11-23

Google Apps Scriptを使ってタスクをSlackにポストする1(Slack Appを作成するまで)の続き

GASでコードの貼り付けまで

まずは、Google Spread Sheetで、このようなタスクシートを作成する。内容は適当に。

「Tools」>「Script editor」をクリック。

このような画面に飛ぶので、もともと記載のあるfunctionは全て消してしまう。

そして、以下のコードを貼り付ける。
<>内の変数は適宜変更ください。
slack tokenの変数名は適当に名前をつけてください。
日付の計算が難しく、冗長になってしまった。。

// メインスクリプト
function mainFunction(){
  var targetSheet = SpreadsheetApp.openById('<spreadsheetのID>').getSheetByName('<シート名>');
  var targetSheetUrl = '<spreadsheetのURL>';
  
  var dateColNo = <期限のColum番号>;
  var summaryColNo = <概要のColum番号>; 
  var assigneeColNo =  <担当者のColum番号>;
  var issueNoColNo = <課題番号のColumの番号>;
  var statusColNo = <ステータスのColumの番号>;
  
  var token = UserProperties.getProperty('<slack tokenの変数名>');
  
  postSlack(':speaker: `Reminder`\n\<'+ targetSheetUrl +'\>',token);
  getListissues(targetSheet,dateColNo,getToday(),getNextweek(),summaryColNo,assigneeColNo,issueNoColNo,targetSheetUrl,statusColNo,token);
}


// 今から一週間後の日付を取得する
function getNextweek(){  
  var nextWeek = new Date();
  nextWeek.setDate(nextWeek.getDate()+7);
  return nextWeek;
}


// 今日の日付を取得する
function getToday(){
  var date1 = new Date();
  return date1;
}


// 日付変換 (string->date object)
function toDate(date1){
  if(typeof date1 == 'string'){
    date1 = new Date(date1+' 00:00:00')
  };
  return date1;
}


// 日付比較
function compareDate(date1,date2){
  
  // 計算できる形に変換する
  date1 = toDate(date1);
  date2 = toDate(date2);

  if(date1.getYear()-date2.getYear()==0 && date1.getMonth()-date2.getMonth()==0 && date1.getDate()-date2.getDate()==0){  //同じ日
    return 'same';
   
  }else if(date1.getYear()-date2.getYear()>0){
    return 'new';
  }else if(date1.getYear()-date2.getYear()<0){
    return 'old';
    
  }else if(date1.getYear()-date2.getYear()==0){  //年が一緒だった場合の比較
    if(date1.getMonth()-date2.getMonth()>0){
      return 'new';
    }else if(date1.getMonth()-date2.getMonth()<0){
      return 'old';
      
    }else if(date1.getMonth()-date2.getMonth()==0){  //月が一緒だった場合の比較
      if(date1.getDate()-date2.getDate()>0){
        return 'new';
      }else if(date1.getDate()-date2.getDate()<0){
        return 'old';      
      }else{
        return false; // 上の'same'の条件と同じ
      } 
      }
    }
}


// 1週間以内に期限がくる課題をslackにポストする
function getListissues(targetSheet,dateColNo,toDay,nextWeek,summaryColNo,assigneeColNo,issueNoColNo,targetSheetUrl,statusColNo,token){
  var c = 0;
  for(var targetRowNo=1; targetRowNo<=targetSheet.getLastRow();targetRowNo++){
    var targetDate = targetSheet.getRange(targetRowNo,dateColNo).getValue();
    var issueNoVal = targetSheet.getRange(targetRowNo,issueNoColNo).getValue();
    var assigneeVal = targetSheet.getRange(targetRowNo,assigneeColNo).getValue();
    var summaryVal = targetSheet.getRange(targetRowNo,summaryColNo).getValue();
    
    targetDate = toDate(targetDate);
    Logger.log(targetDate);
    var targetDateFmt = Utilities.formatDate(targetDate, 'Asia/Tokyo', 'yyyy/MM/dd');

    if(compareDate(targetDate,nextWeek)=='old' && targetSheet.getRange(targetRowNo,statusColNo).getValue()==''){
        var message = '*課題No.' + issueNoVal +' '+ assigneeVal +' '+ targetDateFmt +'*\n```'+ summaryVal +'```';
        postSlack(message,token);
        c ++;
    }
  }
  if(c==0){
    postSlack('直近課題なし',token)
  }
}


// slackにポストする
function postSlack(message,token) {
    var url        = 'https://yt-room.slack.com/api/chat.postMessage'; 
    var token      = token;
    var channel    = '<slack channel ID>';
    var message    = message;
    var username   = 'task_reminder';
    var parse      = 'full';
    var icon_emoji = ':woman-tipping-hand:';
    var method     = 'post';
    var pretext    = 'test';
    var text       = 'text';
  
    var payload = {
        'token'      : token,
        'channel'    : channel,
        'text'       : message,
        'username'   : username,
        //'parse'      : parse,
        'icon_emoji' : icon_emoji,
    };
 
    var params = {
        'method' : method,
        'payload' : payload
    };
 
    var response = UrlFetchApp.fetch(url, params);
}

slack token変数設定

貼り付けたら、先ほどのslack tokenの変数名の設定をする。
パスワード系の変数は、コードに直接書きたくないので、User変数として定義する。
「File」>「Project properties」をクリック。

変数定義する前に、project名をつけろと言われたら設定する。

「User properties」>「Add row」とクリック。

先ほど定義した変数と、tokenの値を入力して「Save」。

実行許可

実行関数「mainFunction」を選択する。

「Authorization required」と言われるので許可をする。

許可するアカウントを選んで進めていく。

実行

slackのポストするチャンネルで、作成したBotをinviteする。(「/invite 【ボット名】)

GASのページの三角マーク(▶︎)より実行する。

無事に、未完了の直近タスク(1週間後までのタスクのうち「done」が付いていないタスク)だけがslackにポストされる。

以上