Google Apps ScriptでTrelloのカードをアーカイブする

Trelloカードアーカイブ
みなさん、こんにちは!うえはら(@tifoso_str)です。

前回までのシリーズで、Google Apps ScriptでTrelloのAPIを利用して、1ヶ月の執筆数をメンバーごとに集計する方法をお伝えしました。

Google Apps ScriptでTrelloのリストにある担当カードの数をスプレッドシートに追記する
Google Apps ScriptでTrelloのAPIを利用して、1ヶ月の執筆数をメンバーごとに集計することをシリーズでお伝えしています。今回はシリーズの最終回で、今までの分をまとめて、スプレッドシートに追記します。

前回の記事の最後で、Google Apps ScriptでTrelloのカードをアーカイブできることに触れました。

せっかく、Trelloについての話題を解説しているので、このついでに集計が終わった後のカードをアーカイブする方法をお伝えします。

スポンサーリンク

はじめに

カードをアーカイブする方法には、下記の二通りがあります。

  1. カードのIDを取得してカードごとにアーカイブする方法
  2. リストにあるカードをまとめてアーカイブする方法

今回のシリーズでは、集計が終わったカードを対象にするので、「1」のカードごとにアーカイブする方法を使用します。

最後に「2」のまとめてアーカイブする方法もお伝えしますので、確認いただければと思います。

カードを個別にアーカイブする

カードをアーカイブするURLは下記となります。

https://api.trello.com/1/cards/{カードID}

カードIDが必要となりますが、シリーズのgetCards関数ではカードIDを取得していなかったので、getCards関数から修正していきます。

カードID取得を追加したgetCards関数

スクリプトは下記のようになります。

/**
* リストのカード一覧から必要な情報を配列として返す
* @param {String} Trello_KEY TrelloのAPIキー
* @param {String} Trello_TOKEN Trelloのトークン
* @param {String} LIST_ID カードを取得するリストID
* @return {String[]} メンバーIDと期限とカードIDの配列
*/
function getCards(Trello_KEY,Trello_TOKEN,LIST_ID) {
    
  var url = 'https://api.trello.com/1/lists/' + LIST_ID + '/cards';
  url += '?key=' + Trello_KEY;
  url += '&token=' + Trello_TOKEN;
  url += '&fields=idMembers,due,id';
  
  var response = UrlFetchApp.fetch(url);
  var json = JSON.parse(response.getContentText());
  
  var cards = []; //カード情報を入れる配列の用意
  
  //カードの数だけ繰り返す
  for (var i = 0 ; i < json.length; i++){
    var idMembers = json[i].idMembers[0];
    var due = json[i].due;
    var id = json[i].id;
    var card = [idMembers,due,id];
    cards.push(card); //配列に追加
  }
  return cards;
}

カードidを取得する部分を13,24,25行に追加しました。

メンバーIDを取得するのと、同じ要領です。

集計後のカードをアーカイブする機能を追加したメイン関数

それでは、前回まで解説した、Trelloのカードを集計して1ヶ月の執筆数をスプレッドシートに追記する関数に、集計したカードをアーカイブする機能を追加します。

スクリプトは下記のようになります。

スプレッドシート追記後にアーカイブする部分を追加しています。

/**
* Trelloから情報を取得するメイン関数
* @return {Number} Mainから呼び出される場合に実績人数
*/
function trelloMain(){
  var scriptProperties = PropertiesService.getScriptProperties();
  const Trello_KEY   = scriptProperties.getProperty('Trello_KEY');
  const Trello_TOKEN = scriptProperties.getProperty('Trello_TOKEN');
  const BOARD_ID = scriptProperties.getProperty('BOARD_ID');
  const LIST_ID = scriptProperties.getProperty('LIST_ID');
 
  var members = getBoardMembers(Trello_KEY,Trello_TOKEN,BOARD_ID); //ボードのメンバー取得 
  var membersId = members[0];
  var membersFullName=members[1];
  
  var objMembers = {}; //メンバーIDをキー、氏名を値とするオブジェクト作成
  var objCounter={}; //メンバーIDをキー、執筆数を値とするオブジェクト作成
  for (var i=0; i<membersId.length;i++) {
    var memberId = membersId[i];
    objMembers[memberId] = membersFullName[i];
    objCounter[memberId] = 0;
  }
  
//カードのメンバーを検索して集計用に足して行く
  var cards = getCards(Trello_KEY,Trello_TOKEN,LIST_ID); //カード取得
  var date = new Date();
  var thisMonth = new Date(date.getFullYear(),date.getMonth(),1,0,0,0); //今月頭
  var lastMonth =  new Date(date.getFullYear(),date.getMonth()-1,1,0,0,0); //先月頭
  var cardsId = []; //アーカイブするカードIDを入れる配列
  
  for (i=0;i<cards.length;i++){
    var due = new Date(cards[i][1]); //カードの期限を日付形式に変換
    if (lastMonth <= due && due < thisMonth) {
      var writer = cards[i][0];
      objCounter[writer] ++; 
      cardsId.push(cards[i][2]); //アーカイブ用のカードIDを追加
    }
  }
  
  var yyyymm = getyyyymm(lastMonth);
 
//スプレッドシート用の配列作成
  var monthAchieve=[];
  for (var key in objCounter) {
    if (objCounter[key]){ //執筆数が「0」は除く
      monthAchieve.push([yyyymm,key,objMembers[key],objCounter[key]]);
    }
  }
 
//スプレッドシートに追記
  var shAchieve = SpreadsheetApp.getActiveSheet()
  var lastRow = shAchieve.getLastRow();
  var rows = monthAchieve.length;
  var cols = monthAchieve[0].length;
  shAchieve.getRange(lastRow+1, 1,rows,cols).setValues(monthAchieve);
 
//Trelloのカードをアーカイブ
  for (var i=0 ; i<cardsId.length ; i++) {
    var id = cardsId[i];
    var URL = 'https://api.trello.com/1/cards/' + id;
    var payload = {
      'key': Trello_KEY,
      'token': Trello_TOKEN,
      'closed':'true' //trueにするとアーカイブされる
    }; 
    var option = {
      'method':'PUT',
      'payload': payload
    };
    UrlFetchApp.fetch(URL,option);
  }
}

24~38行の「カードのメンバーを検索して集計用に足して行く」部分で、アーカイブするカードのカードIDを配列に追加しています。

この配列を元に57~71行でカードをアーカイブしています。

この部分を見ると、URLやfetchメソッドのパラメータが今までと違っていることにお気づきでしょうか?

アーカイブするときはHTTPメソッドに「PUT」を使うので、fetchメソッドのパラメータも前回までとは異なっています。

UrlFetchApp.fetch(URL,[パラメータ])

前回までは、HTTPメソッドが「GET」だったので、パラメータの部分を省略していました。

今回は、「'method':'PUT'」と「'payload'」をそれそれ指定しています。

カードをアーカイブするにはカードオブジェクトの「closed」を「true」にすればいいので、「'payload'」で「'closed':'true'」を指定しています。

これを、カードごとに実行することで、1つずつアーカイブしていきます。

これで、Trelloの特定のリストにあるカードを集計して、アーカイブするまでの一連の動作を自動化することができます!

【おまけ】リストのカードを全てアーカイブ

カードをアーカイブする方法に、リストにあるカードをまとめてアーカイブ方法もあるので、この機会にお伝えします。

スクリプトは下記のようになります。

function archiveAllCard() {
  var scriptProperties = PropertiesService.getScriptProperties();
  const Trello_KEY   = scriptProperties.getProperty('Trello_KEY');
  const Trello_TOKEN = scriptProperties.getProperty('Trello_TOKEN');
  const BOARD_ID = scriptProperties.getProperty('BOARD_ID');
  const LIST_ID = scriptProperties.getProperty('LIST_ID2');

  var URL = 'https://api.trello.com/1/lists/' + LIST_ID + '/archiveAllCards';
  var payload = {
    'key':Trello_KEY,
    'token':Trello_TOKEN
  };
  var option = {
    'method':'POST',
    'payload':payload
  };

  UrlFetchApp.fetch(URL,option);
}

URLは下記の通りで、リストIDがわかればそのリストのカードを全てアーカイブすることができます。

https://api.trello.com/1/lists/{リストID}/archiveAllCards

全てアーカイブするときはHTTPメソッドに「POST」を使いますので、ご注意下さい

まとめ

今回はGoogle Apps ScriptでTrelloのカードをアーカイブする方法をお伝えしました。

前回も書きましたが、TrelloのAPIはまだまだ出来ることがあります!

TrelloのAPIを見て、いろいろ試してみてください。

それでは、最後までありがとうございました。

連載目次:GASでTrelloのAPIを利用して、1ヶ月の執筆数をメンバーごとに集計

「いつも隣にITのお仕事」の執筆チームでは、タスク管理にTrelloを使用しています。 各記事をカードとして管理し、公開されたものは「公開済み」のリストへ移動させます。 本シリーズでは、「公開済み」のリストにあるカードを確認して、1ヶ月の執筆数をメンバー毎に集計します。
  1. Google Apps ScriptでTrelloの特定のリストにあるカードの一覧を取得する
  2. Google Apps ScriptでTrelloのカード情報一覧から必要な情報を取り出す
  3. Google Apps ScriptでTrelloのボードに登録しているメンバー情報を取り出す
  4. Google Apps ScriptでTrelloのリストにある担当カードの数を集計する
  5. Google Apps ScriptでTrelloのリストにある担当カードの数をスプレッドシートに追記する
タイトルとURLをコピーしました