GAS＆Backlog APIで必要情報のみを取得して見やすく一覧化する話

## はじめに
案件管理でツールを使用してますが、「各案件の状況が分かるような一覧資料を別途用意して！」ということが多々あります。
ツールと別途資料準備で2重管理になり、手間と不整合で管理に苦労します。

Backlog（案件管理ツール）のAPIを使用して、GASで必要情報のみを取得して自動で一覧化されるようにしてみました。

## Backlogとは
チームのタスク管理ツール（ https://backlog.com/ja/ ）
プロジェクトの課題（タスク）を作成して、各タスクに担当・スケジュール等を設定して管理を行います。
BacklogにはAPIが用意されており、プロジェクトに登録した課題データを一括で取得することができます。
また、APIを使用して課題の登録・更新なども行えます。

## Backlog APIへの接続
https://（スペースID）.backlog.jp/（対象API）?apiKey=（API KEY）

スペースID：Backlog利用開始時に決めたスペースID
対象API：取得したい情報に応じて使用するAPIを指定（※[公式サイト](https://developer.nulab.com/ja/docs/backlog/api/2/get-space/#)にAPIがまとまってます）
API KEY：Backlogにログインして発行したAPI KEY
![キータ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1705751/d0c1b393-6248-8bf4-4af2-a1982131292c.png)
※API KEYはBacklogログイン後に個人設定のAPIからKEY生成ができます

## APIを叩いてみた
プロジェクト一覧を取得
`https://xxx.backlog.jp/api/v2/projects?apiKey=xxx`

```json
[
	{
		"id": 123456789,
		"projectKey": "AAA",
		"name": "AAA PRJ",
		"chartEnabled": true,
		"subtaskingEnabled": false,
		"projectLeaderCanEditProjectLeader": false,
		"useWikiTreeView": false,
		"textFormattingRule": "backlog",
		"archived": false,
		"displayOrder": 8,
		"useDevAttributes": true
	},
	{
		"id": 111111111,
		"projectKey": "BBB",
		"name": "BBB管理",
		"chartEnabled": true,
		"subtaskingEnabled": true,
		"projectLeaderCanEditProjectLeader": false,
		"useWikiTreeView": false,
		"textFormattingRule": "backlog",
		"archived": false,
		"displayOrder": 48,
		"useDevAttributes": true
	}
]
```

対象プロジェクトの課題一覧を取得
`https://xxx.backlog.jp/api/v2/issues?apiKey=xxx&projectId[]=（対象プロジェクトのID）`

```json
[
	{
		"id": 112233445566,
		"projectId": 111111111,
		"issueKey": "BBB-591",
		"keyId": 591,
		"issueType": {
			"id": 123456794,
			"projectId": 111111111,
			"name": "タスク",
			"color": "#7ea800",
			"displayOrder": 0
		},
		"summary": "アカウント追加対応 2020.7.15",
		"description": "BBB担当者様\n\n体制変更に伴い、アカウント追加よろしくお願いします",
		"resolution": {
			"id": 0,
			"name": "対応済み"
		},
		"priority": {
			"id": 3,
			"name": "中"
		},
		"status": {
			"id": 4,
			"projectId": 111111111,
			"name": "完了",
			"color": "#b0be3c",
			"displayOrder": 4000
		},
		"assignee": {
			"id": 123456794,
			"userId": null,
			"name": "田辺",
			"roleType": 2,
			"lang": null,
			"mailAddress": null,
			"nulabAccount": null,
			"keyword": "田辺"
		},
		"category": [],
		"versions": [],
		"milestone": [],
		"startDate": null,
		"dueDate": null,
		"estimatedHours": null,
		"actualHours": null,
		"parentIssueId": null,
		"createdUser": {
			"id": 1074155555,
			"userId": null,
			"name": "田中",
			"roleType": 2,
			"lang": null,
			"mailAddress": null,
			"nulabAccount": null,
			"keyword": "田中"
		},
		"created": "2020-07-15T07:34:53Z",
		"updatedUser": {
			"id": 10742244444,
			"userId": null,
			"name": "田辺",
			"roleType": 2,
			"lang": null,
			"mailAddress": null,
			"nulabAccount": null,
			"keyword": "田辺"
		},
		"updated": "2020-07-16T02:01:59Z"
	}
]
```

## GAS＆Backlog APIでプロジェクト一覧をスプレッドシートに出力
GASコード　※処理中の課題のみを取得して一覧化

```javascript
function getIssueList() {
  //スペースid
  var space_id = "***";
  // apiKey
  var api_key = "***";
  // 対象prject
  var project_id = "***";

  // スプレッドシート設定
  var targetSS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("IssueList");
  // シート書き込み位置指定（A1）
  var range = targetSS.getRange(1, 1);

  // 課題取得
  var response = UrlFetchApp.fetch("https://" + space_id + ".backlog.jp/api/v2/issues?apiKey=" + api_key + "&projectId[]=" + project_id + "&statusId[]=2");
  var issuelist = JSON.parse(response);

  // シート初期化
  targetSS.getRange("A3:AE" + issuelist.length).clearContent();
  // シートに書き出し
  for (var i = 0; i < issuelist.length; i++) {
    // 種別
    range.offset(i + 2, 0).setValue(issuelist[i]["issueType"]["name"]);
    // 課題ID
    range.offset(i + 2, 1).setValue(issuelist[i]["issueKey"]);
    // 課題名
    range.offset(i + 2, 2).setValue(issuelist[i]["summary"]);
    // 担当者
    range.offset(i + 2, 3).setValue(issuelist[i]["assignee"]["name"])
    // ステータス
    range.offset(i + 2, 4).setValue(issuelist[i]["status"]["name"])
    // 優先度
    range.offset(i + 2, 5).setValue(issuelist[i]["priority"]["name"])
    // 調査工数 ※カスタムフィールド
    range.offset(i + 2, 6).setValue(issuelist[i]["customFields"][5]["value"]["name"])
  }
}
```

出力結果
![キータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1705751/9eabac94-a9ad-e6fa-a869-00a557a4a70a.png)

## データのカスタマイズ
デフォルトでBacklogに用意されている項目だけだと足りないという場合、項目を自由に追加できるカスタムフィールドがあります。
各プロジェクトに特化した項目もカスタムフィールドで設定可能で、上記スクリプト記載の通り`issuelist[i]["customFields"][5]`のような記述で値が取得できます。
汎用性が高いため、多くのプロジェクトで活用できること間違い無しです。

## 最後に
今回はBacklogを使用した例を紹介しました。
私のプロジェクトでは[Trello](https://trello.com/ja)も使用しており、こちらもAPIがあるため、同じような形でデータ取得することができます。
他にも案件管理ツールでAPIが用意されているものがあるため、他ツールでも応用して、管理作業を楽にするよう試してみたいと思います！