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アプリを作れば同じようなことができそうな感じがするのですが、そちらは難しそうだったので手軽な方式で実現してみました。
また便利そうな連携を思いついたらトライしてみます。
この記事が気に入ったらサポートをしてみませんか?