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

# 経緯
今まで、プロジェクト管理に[Brabio!](https://brabioproject.appspot.com/)を使用していたのですが、このたび代替ツールの使用を検討することにしました。

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

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

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

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

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

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

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

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

# データの書き出し

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

<img width="773" alt="スクリーンショット 2017-04-20 17.36.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/29607/553b899b-0124-3e87-c4dc-feacb00fe4ac.png">

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

# フォーマットの作成

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

```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形式のファイルを取得します。

```js
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データを用いてタスク管理ツールにインポートし、ツールの検討を行なっていきます。