gasでtrelloと連携してみた

目次

はじめに

会社で個人的なタスク管理はtrelloを使っているのですが、
trelloだと細かいタスク時間の設定などできないのです。
たぶん。
※機能を詳しく知らないだけで、もしかしたらできるのかな。。。
それをgoogleスプレッドシートでカバーしようと思いまして、連携させてみました。

何をしたいのか

やりたいこととしては、タスクごとに見積時間を登録するのと、実績時間を日付ごとに登録することです。
見積と実績が大幅にずれているものはないか、などを確認して、見積もりの精度を上げるためにやりたいなー
ということで、gasで作ってみました。

作ったもの

概要は
毎日18時頃に実行するようにトリガー設定してあげて、
特定のボードからカード一覧取得してきて、それをスプレッドシートに転記する。
最後はチャットワークで、取得したことを伝える。
となっています。

コードは以下のような感じです。

function fetchTrelloTasks() {
  var scriptProperties = PropertiesService.getScriptProperties();
  const TRELLO_API_KEY   = scriptProperties.getProperty('TRELLO_API_KEY');
  const TRELLO_TOKEN = scriptProperties.getProperty('TRELLO_TOKEN');
  const TRELLO_BOARD_ID = scriptProperties.getProperty('TRELLO_BOARD_ID');

  var URL = 'https://trello.com/1/members/me/boards?key=' + TRELLO_API_KEY + '&token=' + TRELLO_TOKEN + '&fields=name';
  var response = UrlFetchApp.fetch(URL);
  var json = JSON.parse(response.getContentText());

  var cards = [['list_name', 'card_name', 'card_id', 'label_name']];
  var LIST_URL = 'https://trello.com/1/boards/' + TRELLO_BOARD_ID  + '/lists?key=' + TRELLO_API_KEY + '&token=' + TRELLO_TOKEN;
  var list_response = UrlFetchApp.fetch(LIST_URL);
  var list_json = JSON.parse(list_response.getContentText());

  for (var li=0 ; li<list_json.length ; li++){
    var list_name = list_json[li].name;
    var list_id = list_json[li].id;

    var CARD_URL = 'https://trello.com/1/lists/' + list_id + '/cards?key=' + TRELLO_API_KEY + '&token=' + TRELLO_TOKEN;
    var card_response = UrlFetchApp.fetch(CARD_URL);
    var card_json = JSON.parse(card_response.getContentText());
    for(var ci=0 ; ci<card_json.length ; ci++){
      var card_name = card_json[ci].name;
      var card_id = card_json[ci].id;
      var label_name = card_json[ci].labels[0].name;
      cards.push([list_name, card_name, card_id, label_name]);
    }
  }

  var sheetBoard =SpreadsheetApp.getActiveSpreadsheet().getSheetByName('trelloTasks');

  var lastColumn = sheetBoard.getLastColumn();
  Logger.log(sheetBoard.getRange(1,lastColumn).getValue());
  if(!Moment.moment(sheetBoard.getRange(1,lastColumn).getValue()).isSame(moment(),'day'))
  {
    sheetBoard.getRange(1,lastColumn+1).setValue(moment().format('YYYY/MM/DD'));
  }
  var tasks = sheetBoard.getDataRange().getValues();
  var unregisteredCards = [['list_name', 'card_name', 'card_id']];
  for (var i=1; i<cards.length; i++)
  {
    var isExsitTask = false;
    for(var j=1; j<tasks.length; j++)
    {
      if(cards[i][2] == tasks[j][2])
      {
        isExsitTask = true;
        sheetBoard.getRange(j+1, 1).setValue(cards[i][0]);
        sheetBoard.getRange(j+1, 2).setValue(cards[i][1]);
        sheetBoard.getRange(j+1, 4).setValue(cards[i][3]);
      }
    }

    if(isExsitTask)
    {
     // なにかする?
    }
    else
    {
      sheetBoard.appendRow(cards[i]);
    }
  }

  sendMessage_("121976525","Trelloから最新のタスク取得したよ!本日の勤怠をつけてね!\n[info][title]勤怠入力はここだよ[/title]https://docs.google.com/spreadsheets/d/15EAjgIAeqh1AI-Tyw8hvx0wipjjaz6JboYALoUrvOFA/edit#gid=0[/info]");
}

スプレッドシートはこんな感じです。

ちゃんと見直すと、ソース結構雑や笑
コメントで、「なにかする?」ってなんやねん笑
まぁ個人的にやってるやつだからいっかー
最後のsendMessage_()は別のファイルで定義してるやつですね。
単純にチャットワークの特定のルームにメッセージ送信するってだけですが。

問題なのは、trello側でラベルを設定しておかないとエラーで落ちちゃうことですかね、、、
単純にチェック入れればいいんですけどね、、、

とりあえずやりたいことはできました。
あとは完了したタスクをスプレッドシートで色塗ってわかりやすくするとか、
トレロの特定のリストに入ったものは非表示にするとかしてわかりやすくしたいですね。。。