おじさんのブログ

おじさんになってからPython、GAS、SEOなどを学習した内容をアウトプットするブログです。

GASでスプレッドシートのステータス変更をslackへ投稿するのに参考にした記事

GASが全くわからない状態から、GASを使って進捗を管理しているスプレッドシートに変更があった際にslackへ通知するということをできるようになるまでに参考にした記事のリスト。業務で使うことを優先したので結局コピペになってしまったので、うまく動かなったのはなぜかや応用を効かせる際に見返すために。

slackとスプレッドシート連携の参考にしたページ

SlackのWebhook URL取得手順 - Qiita

具体的なコードの参考にしたページ

スプレッドシートで作ったtodoリストでステータスを変更するとslackに流す - Qiita

まずは動くモノをということを優先した結果、↑をコピペさせていただくことに…。 これをベースに応用を効かせることを目指そう。

今回うまくいかなかったページ

Slackにスプレッドシートの変更がある度に内容を通知する方法 | ビジネスチャットマスター|働き方を変えるビジネスチャットに関する情報をお届けします

GASを使って、スプレッドシート更新時にSlack通知を飛ばしてくれるbotを作ってみた - Qiita

これも今回やりたかったことに近いはずなのに、どうにもエラーを解決することができなかった…。 後で見返すために。

ちゃんと理解する必要がありそうな内容

Google Apps Scriptで値の変更をトリガーにしつつ変更されたセルの行番号と列番号を知る

スプレッドシートの内容をトリガーにするにはこの理解が必要(だけど今回は…)。 勉強のために買ったGASの本『詳解! Google Apps Script完全入門』の著者の方のWebサイトのようで、他にもGASを学習するなら参考になる内容がたくさんあるっぽい。

最終的なコード(完全コピペ)

var postUrl = "***";
var postChannel = "#***";

function myOnEdit()
{
  var keywordCol = 8;         // ステータス列idx
  var inChargePersonCol = 7;  // 担当者列idx
  var dataStartCol = 2;       // データが開始する列のidx
  var taskContentCol = 2;     // タスク内容列idx

  var colOffset = 1;  // A列はoffset

  var dataColNum = 8;  // データの列数
  var range = SpreadsheetApp.getActiveRange();
  var rowidx = range.getRow();
  var colidx = range.getColumn();
  if(colidx != keywordCol){ return ; }
  var sheet = SpreadsheetApp.getActiveSheet();

  // ステータスに変更のあったtodo1行
  var aLine = sheet.getRange(rowidx, dataStartCol, 1, dataColNum);
  if(!aLine){
    return;
  }

  // ステータスセルの値
  var status = aLine.getCell(1,keywordCol-colOffset).getValue();

  // 担当者セルの値
  var username = aLine.getCell(1, inChargePersonCol-colOffset).getValue();
  if(!username){
    username = "unknown";
  }

  // タスクの内容
  var taskContent = aLine.getCell(1, taskContentCol-colOffset).getValue();  
  if(!taskContent){
    return;
  }

  // ステータスを変更した人の名前(googleのアカウント名) 
  // todo: めんどくさそうなので一旦なしで
  // var editor = Session.getActiveUser().

  var message = username;
  message += "さんが、タスク「";
  message += taskContent;  
  message += "」のステータスを";

  if( status == '完了' ){
    aLine.setBackgroundColor("#efefef");
    aLine.setFontColor('black');
    message += "【完了】";

  }
  else if(status == '未着手' || !status){
    aLine.setBackgroundColor('white');
    message += "【未着手】";
  }
  else if(status == '入力中'){
    aLine.setBackgroundColor('#fce5cd');
    message += "【入力中】";
  }

  message += "にしました";

  sendHttpPost(message, "TODOテスト");
}

function test()
{
  sendHttpPost("上様が、タスク「ほげほげほげ」のステータスを【進行中】にしました", "TODOテスト");
}

function sendHttpPost(message, username)
{
  var jsonData =
  {
     "channel" : postChannel,
     "username" : username,
     "text" : message
  };
  var payload = JSON.stringify(jsonData);
  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}