Help us understand the problem. What is going on with this article?

GoogleAppsScript(GAS)を使ってTrelloのカード枚数を毎日GoogleスプレッドシートとSlackに記入する

More than 1 year has passed since last update.

私は毎日のタスク管理をTrelloで行っています。よくあるカンバン方式です。
そこで思ったのは、

「毎日のタスク個数計測したいけど、いちいち数えて記録するのめんどい」

みなさん当然思いますよね。そこで、

・GoogleAppsScript(GAS)からTrelloのAPI(json)経由でリスト内のカード枚数を取得
・Googleスプレッドシートに整形して投稿
・Slackに整形して投稿

を、自動的にできるようにしました。
解説および全ソースコードを掲載しましたので、適宜変更してご使用ください。

画面構成

Trello

WS000002.JPG
分かりやすいようにChrome拡張でカード枚数を表示しています。

Googleスプレッドシート

WS000003.JPG
Trelloのカード枚数を逐一記録します。

Slack

WS000001.JPG
アイコンはかんばんっぽくしています。リストごとのカード枚数を記録しています。

プログラム作成

GoogleAppsScript(GAS)からTrelloのAPI(json)経由でリスト内のカード枚数を取得

TrelloAPIの使い方は記事参照。Trello API を叩いてカードを作成する方法(curl利用)
APIを叩いてカードを取得。TOKEN/KEY等はScriptPropertiesで隠蔽しています。
List内のカード枚数を知るには、Trello Listのjsonファイルを取得し、lengthを叩きます。

    var cardListURL = 'https://api.trello.com/1/lists/' + TRELLO_List_IDs[i] + '/cards'
    + '?key=' + scriptProp.TRELLO_API_KEY
    + '&token=' + scriptProp.TRELLO_API_TOKEN
    + '&fields=id,name,dateLastActivity,shortUrl,desc';
    var response = UrlFetchApp.fetch(cardListURL);
    var json_card = JSON.parse(response.getContentText("UTF-8"));

    TrelloCardNum[i]  = json_card.length;
    TrelloCardOutputtext[i] = json_Board[i].name + ":" + json_card.length;
    totalNum_Card    += json_card.length;

Googleスプレッドシートに整形して投稿

リスト最下端の枚数は、COUNTA関数を使用。
日付を取得し、参照キーとして活用。あとはうまくsetRange/setValueします。

  sheet.getRange(lastrow+1,1).setValue(PlainDate);  
  for (var i=0; i<TrelloCardNum.length; i++){
    sheet.getRange(lastrow+1,i+2).setValue(TrelloCardNum[i]);  
  }

Slackに整形して投稿

Slackbotを作ります。投稿できるようになるまでは下記を参照しました。
Slack botをGASでつくる方法で一番楽そうなやつ

API経由で取得したリスト内カード枚数の数値を整形します。
整形したテキストをslackに渡すだけです。ほとんど上記のサンプルコード通りです。

function postSlack(text){
  var options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
    "payload" : '{"text":"' + text + '"}'
  };
  UrlFetchApp.fetch(urlSlack, options);
}

毎日投稿

GASのトリガーを利用する。
WS000004.JPG

ソースコード

var TrelloCardNum        = [];
var TrelloCardOutputtext = [];

var scriptProp      = PropertiesService.getScriptProperties().getProperties();
var TRELLO_List_IDs = [scriptProp.TRELLO_LIST_Inbox_ID,
                       scriptProp.TRELLO_LIST_InboxPrivate_ID,
                       scriptProp.TRELLO_LIST_Today_ID,
                       scriptProp.TRELLO_LIST_Done_ID,
                       scriptProp.TRELLO_LIST_Other_ID];
var urlSlack        = scriptProp.SLACK_WEBHOOKURL;

function WriteRowfromTrello(){
  //一番左のシートを配列のindex"0"で指定する
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];             

  //シートの最終行を取得
  var lastrow       = sheet.getRange("G1").getValue();
  var totalNum_Card = GetCardNumfromTrello();

  var PlainDate     = new Date();
  var formatDate    = Utilities.formatDate(PlainDate,'Asia/Tokyo', 'yyyy年M月d日(EEE)');

  //Googleスプレッドシートに書き込み
  sheet.getRange(lastrow+1,1).setValue(PlainDate);  
  for (var i=0; i<TrelloCardNum.length; i++){
    sheet.getRange(lastrow+1,i+2).setValue(TrelloCardNum[i]);  
  }

  //Slackに書き込み
  var slacktext ="";
  slacktext  += formatDate + "のタスク" + "\\n";
  for (var i=0; i<TrelloCardNum.length; i++){
    slacktext += TrelloCardOutputtext[i] + "\\n";
  }
  slacktext += "カード合計: " + totalNum_Card;

  postSlack(slacktext);
}

//リスト毎にjson取得し、リストに格納されたカード個数を取得する
function GetCardNumfromTrello(){
  var BoardURL   = 'https://trello.com/1/boards/'+ scriptProp.TRELLO_BOARD_ID
                   + '/lists?key=' + scriptProp.TRELLO_API_KEY
                   + '&token=' + scriptProp.TRELLO_API_TOKEN
                   + '&fields=name';
  var response   = UrlFetchApp.fetch(BoardURL);
  var json_Board = JSON.parse(response.getContentText("UTF-8"));
  var totalNum_Card  = 0;

  for (var i=0; i<TRELLO_List_IDs.length; i++){
    var cardListURL = 'https://api.trello.com/1/lists/' + TRELLO_List_IDs[i] + '/cards'
    + '?key=' + scriptProp.TRELLO_API_KEY
    + '&token=' + scriptProp.TRELLO_API_TOKEN
    + '&fields=id,name,dateLastActivity,shortUrl,desc';
    var response = UrlFetchApp.fetch(cardListURL);
    var json_card = JSON.parse(response.getContentText("UTF-8"));

    TrelloCardNum[i]  = json_card.length;
    TrelloCardOutputtext[i] = json_Board[i].name + ":" + json_card.length;
    totalNum_Card    += json_card.length;
  }
  return totalNum_Card;
}

function postSlack(text){
  var options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
    "payload" : '{"text":"' + text + '"}'
  };
  UrlFetchApp.fetch(urlSlack, options);
}
iori_ama
仕事はIT支援/マルチリード楽器芸人/岐阜県加茂郡白川町/バスクラリネット/CivicTech/Code for Gifu&shirakawa https://codeforgifu.jp 演奏多重録音などしてます http://goo.gl/J9nR1w
https://twitter.com/iori_ama
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした