Google Apps ScriptでTrelloのリストにある担当カードの数をスプレッドシートに追記する

付箋紙

みなさん、こんにちは!うえはら(@tifoso_str)です。

今回のシリーズでは、Google Apps ScriptでTrelloのAPIを利用して、1ヶ月の執筆数をメンバーごとに集計することを目標にしています。

前回はTrelloのリストにある担当カードの数を集計する方法をお伝えしました。

Google Apps ScriptでTrelloのリストにある担当カードの数を集計する
Google Apps ScriptでTrelloのAPIを利用して、1ヶ月の執筆数をメンバーごとに集計することをシリーズでお伝えしています。 今回はAPIから得られた情報を元に、メンバー毎の執筆数を集計していきます。

シリーズの目標は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オブジェクトについては、下記記事をご覧下さい。

Google Apps ScriptでのDateオブジェクトの各生成方法、日付と時刻を分ける
スプレッドシートの勤怠管理システムをお題としてGoogle Apps Scriptでの日時について解説します。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メソッドを使いまます。

文字列.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を見てください!

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

連載目次: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をコピーしました