Slackでスターを付けたメッセージをTrelloの指定リストにカード追加する【GAS + Slack + Trello】

Slack + GAS関連第3段です。今回のは結構実用的かも。普段タスク管理はTrelloを利用しているのですが、Slackでの依頼をTrelloにワンクリックで簡単に集約できないのかなと考えてた所、EventAPIのstar_added Eventの存在を教えてもらったのでこれを使ってみました。

処理の流れは、Slackでスターを付ける→GASでstar_added Eventをキャッチ→GASでTrello APIを利用して投稿、です。

Slack APIとGASの初期設定は私の前の投稿をご参考ください。

今回は下記サイトを参照させていただきました。



SlackAPIのサイトにて初期設定作業します。Permission Scopesにstars:readとstars:writeを追加します。(追記20180914:stars:writeは不要でした。)

Event SubscriptionsのSubscribe to Workspace Eventsにstar_addedを追加します。

ここから先はGASのスクリプトエディタでの作業です。

まず最初にプロパティと全ソース貼ってからハマった部分のみ解説します。

function doPost(e){
  var params = JSON.parse(e.postData.getDataAsString());
  var SLACK_USER_ID_KOMORI = PropertiesService.getScriptProperties().getProperty('SLACK_USER_ID_KOMORI');
  
  if(params.event.user == SLACK_USER_ID_KOMORI){
    addCard(params.event.item.message.text);
  }
  
  //バリデーション用
  var params = JSON.parse(e.postData.getDataAsString());
  return ContentService.createTextOutput(params.challenge);
}

function doGet(e){
  doPost(e);
}

function addCard(cardname){
  var TRELLO_BOARD_ID = PropertiesService.getScriptProperties().getProperty('TRELLO_BOARD_ID');
  var TRELLO_KEY = PropertiesService.getScriptProperties().getProperty('TRELLO_KEY');
  var TRELLO_TOKEN = PropertiesService.getScriptProperties().getProperty('TRELLO_TOKEN');
  var TRELLO_LIST_ID = PropertiesService.getScriptProperties().getProperty('TRELLO_LIST_ID');

  var url = 'https://api.trello.com/1/cards/?key=' + TRELLO_KEY + '&token=' + TRELLO_TOKEN;
  var options = {
    'method' : 'post',
    'muteHttpExceptions' : true,
    'payload' : {
      'name'      : cardname,
      'desc'      : '',
      'due'       : '',
      'idList'    : TRELLO_LIST_ID,
      'urlSource' : ''
    }
  }
  Logger.log(UrlFetchApp.fetch(url, options));
}

//Trello ボードID取得用
function getBoardList(){
  var TRELLO_USERNAME = PropertiesService.getScriptProperties().getProperty('TRELLO_USERNAME');
  var TRELLO_KEY = PropertiesService.getScriptProperties().getProperty('TRELLO_KEY');
  var TRELLO_TOKEN = PropertiesService.getScriptProperties().getProperty('TRELLO_TOKEN');
  
  var url = 'https://api.trello.com/1/members/' + TRELLO_USERNAME + '/boards?key=' + TRELLO_KEY + '&token=' + TRELLO_TOKEN + '&fields=name';
  var options = {
    'method' : 'get',
    'muteHttpExceptions' : true
  }
  Logger.log(UrlFetchApp.fetch(url, options));
}

//Trello リストID取得用
function addList(){
  var TRELLO_BOARD_ID = PropertiesService.getScriptProperties().getProperty('TRELLO_BOARD_ID');
  var TRELLO_KEY = PropertiesService.getScriptProperties().getProperty('TRELLO_KEY');
  var TRELLO_TOKEN = PropertiesService.getScriptProperties().getProperty('TRELLO_TOKEN');
  
  var url = 'https://api.trello.com/1/boards/' + TRELLO_BOARD_ID + '/lists/?key=' + TRELLO_KEY + '&token=' + TRELLO_TOKEN;
  var options = {
    'method' : 'post',
    'muteHttpExceptions' : true,
    'payload' : {
      'name' : 'SlackStar',
      'pos' : 'top'
    }
  }
  Logger.log(UrlFetchApp.fetch(url, options));
}

doPostから。

if(params.event.user == SLACK_USER_ID_KOMORI){
    addCard(params.event.item.message.text);
  }

Workspace Eventのstaradd Eventをすべて拾ってきてしまうので(ユーザの権限によって動作が異なる?未確認)ユーザを絞り込んでいます。params.event.userの値は事前にLogから取得した値をスクリプトプロパティ「SLACK_USER_ID_KOMORI」に指定しています。あと返却されるJSONデータがよくわからなかったので色々調べたら下記にEventの中身はevent.〜始まってました。下記にはitemからしか書いてなかったので、params.item.〜って書いてしまっていてちょっとハマりました。

function getBoardList()とfunction addList()はIDを取得するために一時的にしか使っていません。下記サイトを参考して、TrelloKey、TrelloToken、TrelloボードID、TrelloリストIDを取得しました。既存のボード、リストからIDを逆引きする方法はありそうな気がしますが、今回はプログラムから取得しています。

Slack Actionsアプリを作れば同じようなことができそうな感じがするのですが、そちらは難しそうだったので手軽な方式で実現してみました。

また便利そうな連携を思いついたらトライしてみます。


この記事が気に入ったらサポートをしてみませんか?