Trelloを使っていると、「完了」のリストにどんどんカードが溜まっていきます。
そこで、自動アーカイブ機能が欲しいので、ググりしました。
こちらの記事とかこちらの記事なんかがヒットしましたが、簡単な処理だけなのでGoogle Apps Scriptで自動化しようと考えました。
処理の流れ
- 特定のリストからカードの情報一覧を取ってくる。
- 取ってくる情報:id,name,dateLastActivity,shortUrl
- 情報一覧の大きさで捨てるか否かを判断する。
- 一覧をカードの最終更新日が新しい順に並べ替える。
- 最新の8件を一覧から削除。
- 一覧に残ったカードをcloseする。
- 一覧を走査してカードの情報を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);
}
参考リンク
- 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