
みなさん、こんにちは!うえはら(@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を見て、いろいろ試してみてください。
それでは、最後までありがとうございました。

