みなさん、こんにちは!うえはら(@tifoso_str)です。
前回までのシリーズで、Google Apps ScriptでTrelloのAPIを利用して、1ヶ月の執筆数をメンバーごとに集計する方法をお伝えしました。
前回の記事の最後で、Google Apps ScriptでTrelloのカードをアーカイブできることに触れました。
せっかく、Trelloについての話題を解説しているので、このついでに集計が終わった後のカードをアーカイブする方法をお伝えします。
はじめに
カードをアーカイブする方法には、下記の二通りがあります。
- カードのIDを取得してカードごとにアーカイブする方法
- リストにあるカードをまとめてアーカイブする方法
今回のシリーズでは、集計が終わったカードを対象にするので、「1」のカードごとにアーカイブする方法を使用します。
最後に「2」のまとめてアーカイブする方法もお伝えしますので、確認いただければと思います。
カードを個別にアーカイブする
カードをアーカイブするURLは下記となります。
カード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メソッドのパラメータも前回までとは異なっています。
前回までは、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がわかればそのリストのカードを全てアーカイブすることができます。
全てアーカイブするときはHTTPメソッドに「POST」を使いますので、ご注意下さい
まとめ
今回はGoogle Apps ScriptでTrelloのカードをアーカイブする方法をお伝えしました。
前回も書きましたが、TrelloのAPIはまだまだ出来ることがあります!
TrelloのAPIを見て、いろいろ試してみてください。
それでは、最後までありがとうございました。