7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Brabio!のデータをJSON形式で書き出す。

Posted at

経緯

今まで、プロジェクト管理にBrabio!を使用していたのですが、このたび代替ツールの使用を検討することにしました。

チームメンバーに使われ方や需要を確認したところ、タスク管理ツールにマクロからミクロまで、すなわち

  1. ガントチャート
  2. 中長期のマイルストーン管理
  3. チーム個人のスケジュール管理
  4. 日々のタスク管理
  5. Slack等、他アプリケーションとの連携

を求めているようです。現状1-4まですべてbrabioに書き込まれる運用がなされています。

Brabio! が得意としているのは、主に1,2で、日々のタスク管理やスケジュールの管理に不便が生じてきたため、今回別の運用を考えてみることにしました。その際、Slack連携も導入したいところです。

新しい運用では、移行のため上記に加えて

  1. 現在のbrabioのデータ(200件ほどのタスクが登録されている)を扱うことができる
  2. 複数のアプリケーションを用いる場合は互いに同期できる

を満たす必要があります。連携機能が弱いため、brabioを利用した運用の提案はここで弾かれます。

現状のプロジェクトのプロジェクト管理データを用いて新しく導入するアプリケーションを検討してみたいので、
一旦、現状のbrabioのデータを扱いやすく加工することにしました。

データの書き出し

brabioでは、管理権限を持っていればプロジェクトをExcel形式または、CSV形式で書き出すことが可能です。

スクリーンショット 2017-04-20 17.36.32.png

今回はこちらのCSVデータを加工し、使い勝手をよくするためJSON形式に変換します

フォーマットの作成

brabioにある機能をベースとした、JSONフォーマットを作成します。

{
  "company_name": "company_name",
  "project": {
    "name": "project_name",
    "id": "xxx",
    "members": ["name1", "name2"],
    "milestones": [
      {
        "name": "name",
        "at": "YYYY-MM-DDT00:00:00.000Z",
        "tags": ["red"]
      }
    ],
    "tasks": [
      {
        "id": "xxx",
        "name": "name",
        "parent_id": "yyy",
        "start_at": "YYYY-MM-DDT00:00:00.000Z",
        "due_on": "YYYY-MM-DDT00:00:00.000Z",
        "completed_at": "YYYY-MM-DDT00:00:00.000Z",
        "status_type": 0,
        "progress": 0,
        "member": ["name1", "name2"],
        "description": ""
      },      
    ]
  }
}

今回はこんな感じのフォーマットで書き出すことにしました。

CSV to JSON 変換

エクスポートしたCSVデータをGoogleスプレッドシートにインポートし、GoogleAppsScriptを用いてJSON形式のファイルを取得します。

function brabioToJson(url, inputSheetName, outputSheetName, projectRowIndex) {
  var ss = SpreadsheetApp.openByUrl(url);
  var sheet = ss.getSheetByName(inputSheetName);
  var sheetValues = sheet.getDataRange().getValues();
  var sheetData = {
    data: sheetValues,
    getStringValue: function(column, row) { return this.data[row][column] != null ? this.data[row][column] : "";},
    getIntValue: function (column, row) { return parseInt(this.getStringValue(column, row) ? this.getStringValue(column, row) : 0);}
  };
  
  getMembers = function(text) { text !== "" ? text.split('\n') : [];}

  var ret = {};
  ret.company_name = sheetData.getStringValue(0, 0);
  ret.modified_at = "";
  
  var project = {};
  project.name = sheetData.getStringValue( 3, projectRowIndex);
  project.start_at = sheetData.getStringValue( 4, projectRowIndex);
  project.due_on = sheetData.getStringValue( 5, projectRowIndex);
  project.id = sheetData.getStringValue( 2, projectRowIndex);
  project.members = getMembers(sheetData.getStringValue( 10, projectRowIndex));
  project.milestones = [];
  project.tasks = [];
  
  var beforeParent = [project.id];
  var lastRow = sheet.getLastRow();
  for (var index = projectRowIndex + 1;index < lastRow; ++index) {
    var type = sheetData.getStringValue( 0, index);
    var task = {};
    task.name = sheetData.getStringValue( 3, index);
    if (type === 'milestone') {
      task.at = sheetData.getStringValue( 4, index);
      task.tags = [sheetData.getStringValue( 11, index)];
      project['milestones'].push(task);  
    }
    else {
      var outline = sheetData.getIntValue( 1, index);
      task.id = sheetData.getStringValue( 2, index);
      beforeParent[outline] = task.id;
      task.start_at = sheetData.getStringValue( 4, index);
      task.due_on = sheetData.getStringValue( 5, index);
      task.parent = beforeParent[outline - 1];
      task.status = sheetData.getStringValue( 6, index);
      task.progress = sheetData.getIntValue( 7, index);
      task.completed_at = sheetData.getStringValue( 9, index);
      task.members = getMembers(sheetData.getStringValue( 10, index));
      task.description = sheetData.getStringValue( 11, index);
      project['tasks'].push(task);  
    }    
  }

  ret.project = project;
    
  var content = ContentService.createTextOutput(JSON.stringify(ret)).setMimeType(ContentService.MimeType.JSON)
  var resultSheet = ss.getSheetByName(outputSheetName);
  var resultCell = resultSheet.getRange("a1");
  resultCell.setValue(content.getContent());
  return content;
}

function doGet(e)
{
  const Url = "アプリケーションのURL";
  const InputSheetName = "読み込みシート名";
  const OutputSheetName = "書き出し先シート";
  const ProjectRowIndex = 1;
  return brabioToJson(Url, InputSheetName, OutputSheetName, ProjectRowIndex);
}

こちらを実行することで、求めるJSONファイルを作成することができました。

次回は、こちらのJSONデータを用いてタスク管理ツールにインポートし、ツールの検討を行なっていきます。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?