TrelloのカードをGASから自動でアーカイブする。

Trelloを使っていると、「完了」のリストにどんどんカードが溜まっていきます。
そこで、自動アーカイブ機能が欲しいので、ググりしました。
[こちらの記事](https://liginc.co.jp/373242)とか[こちらの記事](https://qiita.com/KeitaMoromizato/items/dd27c6ff8129241b5775)なんかがヒットしましたが、簡単な処理だけなので*Google Apps Script*で自動化しようと考えました。


# 処理の流れ

1. 特定のリストからカードの情報一覧を取ってくる。
 - 取ってくる情報：id,name,dateLastActivity,shortUrl
1. 情報一覧の大きさで捨てるか否かを判断する。
1. 一覧をカードの最終更新日が新しい順に並べ替える。
1. 最新の8件を一覧から削除。
1. 一覧に残ったカードをcloseする。
1. 一覧を走査してカードの情報をslackに投稿する。
 - 投稿する情報：name,shortUrl
 - 一つのカードにつき、一回slackに投稿する。(連投)

# コード

```javascript:removeOldCards
function removeOldCards(){

  const CARDS_MAX = 8; //リストにこれ以上カードがあった場合、カードを削除する。
  
  //GASのスクリプトプロパティの取得
  var scriptProperty = PropertiesService.getScriptProperties().getProperties();
  var Key = scriptProperty.Trello_KEY; //TrelloのAPIキー
  //Logger.log("trello_key = "+Key);
  var Trello_Token = scriptProperty.Trello_TOKEN; //TrelloのAPIトークン
  //Logger.log("trello_token = "+Trello_Token);
  var ListId = scriptProperty.Trello_LIST_ID; //この削除機能を適用する、リストのID
  //Logger.log("trello_list_id = "+ListId);
  
  Logger.log("リストにあるカードの一覧の取得");
  var cardListURL = 'https://api.trello.com/1/lists/' + ListId + '/cards'
  + '?key=' + Key
  + '&token=' + Trello_Token
  + '&fields=id,name,dateLastActivity,shortUrl,desc';
  var response = UrlFetchApp.fetch(cardListURL);
  var json = JSON.parse(response.getContentText("UTF-8"));
  
  Logger.log("JSON配列の大きさから、削除すべきかどうか判断");
  //Logger.log("json.length="+json.length);
  if (json.length <= CARDS_MAX){
    Logger.log("数が少ないため、削除しません。");
    return;
  }
  
  Logger.log("JSON配列の順番を最終更新日時が新しい順に並べ替え");
  for (var i in json){
    json[i]["dateLastActivity"] = new Date(json[i]["dateLastActivity"]);
    //Logger.log(json[i]["dateLastActivity"]);
  }
  json.sort( function(a,b){
    if (a["dateLastActivity"].getTime() > b["dateLastActivity"].getTime()) return -1;
    if (a["dateLastActivity"].getTime() < b["dateLastActivity"].getTime()) return 1;
    return 0;
  });
  
  //JSON配列の初めから一定数を削除
  json.splice(0,CARDS_MAX);
  Logger.log("json.length="+json.length);
  
  Logger.log("JSON配列のカードをclosedをtrueにする");
  for (var i in json) {
    var cardURL = 'https://api.trello.com/1/cards/' + json[i]["id"]
    + '?key=' + Key
    + '&token=' + Trello_Token
    + '&closed=true';
    UrlFetchApp.fetch(cardURL, {'method' : 'put'});
  }
    
  Logger.log("JSON配列の一覧をslackに投稿");
  var Slack_Token = scriptProperty.Slack_TOKEN; //Slackのtoken
  var channel = scriptProperty.Slack_CHANNEL; //メッセージを投稿するSlackのチャンネル
  var card_list = [];
  for (var i in json) {
    card_list.push(
      {
        "fallback" : "Deleted Trello Card.",
        "color" : "#0079BF",
        "title" : json[i]["name"],
        "title_link" : json[i]["shortUrl"],
        "text" : json[i]["desc"],
        "ts" : json[i]["dateLastActivity"].getTime()/1000 // ミリ秒単位で渡されるので、秒単位にする。 [ms] -> [s]
      });
  }
  var attachments = JSON.stringify(card_list);
  var payload = {
    "token" : Slack_Token,
    "channel" : channel,
    "text" : "Trelloのリストから以下の"+json.length+"件のカードがアーカイブされました。",
    "as_user": "true",
    "attachments": attachments
  };
  var option = { "method" : "POST", "payload" : payload };

  UrlFetchApp.fetch("https://slack.com/api/chat.postMessage",option);
}
```

# 参考リンク


- Trello公式のAPIドキュメント
 - https://developers.trello.com
 - その場で実行できて便利。
- GASの公式のドキュメント
 - https://developers.google.com/apps-script
- GASのHTTPの叩き方
 - http://shinsuke789.hatenablog.jp/entry/2015/01/03/164203
- TrelloのAPIの叩き方
 - http://blog.serverworks.co.jp/tech/2016/05/16/trello-api/
- GASのJSON形式のデータの取り扱い方
 - https://tonari-it.com/gas-json-weather/
- javascriptでのJSON配列の並び替え方
 - https://qiita.com/PianoScoreJP/items/f0ff7345229871039672