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

私は毎日のタスク管理をTrelloで行っています。よくあるカンバン方式です。
そこで思ったのは、
#「毎日のタスク個数計測したいけど、いちいち数えて記録するのめんどい」</b>
みなさん当然思いますよね。そこで、
<b>
・GoogleAppsScript(GAS)からTrelloのAPI(json)経由でリスト内のカード枚数を取得
・Googleスプレッドシートに整形して投稿
・Slackに整形して投稿
</b>
を、自動的にできるようにしました。
解説および全ソースコードを掲載しましたので、適宜変更してご使用ください。

# 画面構成
## Trello
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/90313/112ee5dc-8238-4ae1-50b7-fc7ec6754f7e.jpeg)
分かりやすいようにChrome拡張でカード枚数を表示しています。

## Googleスプレッドシート
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/90313/dabc27f5-3844-8db7-62b5-5a07bbfa1ee5.jpeg)
Trelloのカード枚数を逐一記録します。

## Slack
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/90313/8659c722-2dc4-c675-399e-86dd43de5d9b.jpeg)
アイコンはかんばんっぽくしています。リストごとのカード枚数を記録しています。

# プログラム作成
## GoogleAppsScript(GAS)からTrelloのAPI(json)経由でリスト内のカード枚数を取得
TrelloAPIの使い方は記事参照。[Trello API を叩いてカードを作成する方法（curl利用）](https://qiita.com/isseium/items/8eebac5b79ff6ed1a180)
APIを叩いてカードを取得。TOKEN/KEY等はScriptPropertiesで隠蔽しています。
List内のカード枚数を知るには、<u>Trello Listのjsonファイルを取得し、lengthを叩きます</u>。

```javascript

    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します。

```javascript

  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でつくる方法で一番楽そうなやつ](https://vaaaaaanquish.hatenablog.com/entry/2017/09/27/184352)

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

```javascript

function postSlack(text){
  var options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
    "payload" : '{"text":"' + text + '"}'
  };
  UrlFetchApp.fetch(urlSlack, options);
}
```
## 毎日投稿
GASのトリガーを利用する。
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/90313/d09e8333-29e9-68e4-6d02-8bca4d216b51.jpeg)

# ソースコード

```javascript

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);
}
```