LoginSignup
11

More than 5 years have passed since last update.

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

Posted at

Trelloを使っていると、「完了」のリストにどんどんカードが溜まっていきます。
そこで、自動アーカイブ機能が欲しいので、ググりしました。
こちらの記事とかこちらの記事なんかがヒットしましたが、簡単な処理だけなのでGoogle Apps Scriptで自動化しようと考えました。

処理の流れ

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

コード

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

参考リンク

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11