みなさん、こんにちは!うえはら(@tifoso_str)です。
今回のシリーズでは、Google Apps ScriptでTrelloのAPIを利用して、1ヶ月の執筆数をメンバーごとに集計することを目標にしています。
前回はTrelloのリストにある担当カードの数を集計する方法をお伝えしました。
シリーズの目標は1ヶ月の執筆数なので、今回は期限の条件を追加して1ヶ月分の執筆数を集計します。
また、何月分かわかるように関数も追加したいと思います。
最後にスプレッドシートへの追記とトリガーを設定して、このシリーズをまとめていきます。
カードの期限で前月分を判断して集計する
下記のような、スクリプトとなります。
//カードのメンバーを検索して集計用に足して行く 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); //先月頭 for (i=0;i<cards.length;i++){ var due = new Date(cards[i][1]); //カードの期限を日付形式に変換 if (lastMonth <= due && due < thisMonth) { var id = cards[i][0]; objCounter[id] ++; // } }
5,6行で、今月の1日と先月の1日を設定しています。
Dateオブジェクトについては、下記記事をご覧下さい。
9行目で期限を取得していますが、TrelloのAPIで取得できる日付は「ISO-8601拡張フォーマット」をいう形式で、そのままでは文字列として認識されてしまうので、日付形式に変換しています。
if文を追加して条件に「先月1日<=期限<今月1日」とすることで、前月分を集計するようにしています。
何年何月分かわかるようにyyyymm形式の関数作成
スプレッドシートを見たときに何年何月の執筆分か確認できるように関数を追加します。
スクリプトは下記のようになります。
/** * 取得する前月をyyyymmの形にする * @return {String} */ function getyyyymm(lastMonth){ var yyyy = lastMonth.getYear(); var mm = lastMonth.getMonth() mm = ('0' + mm).slice(-2); return yyyy + mm }
月表示を二桁で統一したかったので、1~9月は前に「0」を付けるようにしています。
文字列を取り出すときはsliceメソッドを使いまます。
開始位置を「-」(マイナス)とすることで、文字列の後ろから指定することが出来ます。
今回の場合は、終了位置を省略しているので、後ろから2文字ということになります。
スプレッドシートに追記する
スプレッドシートへの記入は、このブログでも頻出なので、おなじみですね!
スクリプトは下記のようになります。
//スプレッドシートに追記 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);
3行目で最終行を取得して、4,5行で配列の行数と列数を取得しています。
上書きしないように、最終行の次の行から配列に入っているデータを追記しています。
トリガー作成
最後に、月が変わった時に関数が実行されるようにトリガーを設定します。
イベントを「時間主導型」「月タイマー」、日付を「1」、時間を「午前0~1時」としました。
まとめ
メインの関数をまとめると、下記のようになります。
getBoardMembers関数、getCards関数、getyyyymm関数は変更ないので省略します。
/** * 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); //先月頭 for (i=0;i<cards.length;i++){ var due = new Date(cards[i][1]); //カードの期限を日付形式に変換 if (lastMonth <= due && due < thisMonth) { var id = cards[i][0]; objCounter[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); }
このtrelloMain関数を月が変わった直後に実行するようにトリガー設定しているので、Trelloで管理している前月一ヶ月分の執筆数を集計して、スプレッドシートに記録を残すことができます。
ひとまず、シリーズは終わりますが、TrelloのAPIはまだまだ出来ることがあります。
今回は集計するだけでしたが、ちょっと手を加えれば、集計した後にカードをアーカイブするということも出来ます。
興味のある方は、TrelloのAPIを見てください!
それでは、最後までありがとうございました。