この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
テントの中から失礼します、CX 事業本部のてんとタカハシです!
業務でタスク管理には Backlog を使用しています。短期間のプロジェクトでは、タスクを細かくカテゴリー分けせず進めていたりするのですが、時間が経ってやっぱりカテゴリー分けとかしたいよねって時があります、というか、ありました。
既に多くのタスクが作成されている状態で、1つずつ画面ぽちぽちしてカテゴリーを設定するのはちょっと面倒だよねって気持ちから、それを解決するスクリプトを書いてみました。これのおかげで80個近くあったタスクを1~2分で設定変更できました、わーい。
環境
プロジェクトで TypeScript を使用していたので、そのままそれで書きました。
% sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.7
BuildVersion: 19H2
% yarn --version
1.22.10
% node --version
v14.7.0
% npx tsc -v
Version 4.3.2
% npx ts-node -v
v10.0.0
必要なライブラリをインストールする
ヌーラボさんが用意している backlog-js を使用して、より簡単に API を叩けるようにします。内部で Fetch や FormData が使用されているため、Node.js でも実行できるように代わりとなるライブラリもインストールします。
% yarn add backlog-js
% yarn add isomorphic-fetch
% yarn add isomorphic-form-data
必要な各種 ID を確認する
プロジェクト ID
「プロジェクト設定」ページの URL からプロジェクト ID を確認することができます。
https://<HOST_NAME>/EditProject.action?project.id=<PROJECT_ID>
カテゴリー ID
プロジェクト設定ページの中にある「カテゴリー」ページに移動するとカテゴリーの一覧が表示されます。設定したいカテゴリーの編集ページに移動すると URL からカテゴリー ID を確認することができます。
https://<HOST_NAME>/EditComponent.action?component.id=<CATEGORY_ID>&component.projectId=<PROJECT_ID>
ソースコード
getIssues
でカテゴリーが未設定になっている課題を取得してからpatchIssue
でカテゴリー ID を設定しています。
getIssues する際の引数 categoryId に-1
を指定することで、カテゴリーが未設定の課題のみを取得することができます。また、引数 keyword の指定が必須になっているのですが、空文字を指定することで、フィルターせずに全取得できるようです。念のため、patchIssue した後は、1秒間の wait を入れています。
import 'isomorphic-fetch';
import 'isomorphic-form-data';
import * as backlogjs from 'backlog-js';
// この辺の値は各々の環境に合わせて変更してください
const host = '<HOST_NAME>'; // hoge.example.com
const apiKey = '<API_KEY>';
const projectId = <PROJECT_ID>; // 数値
const categoryId = <CATEGORY_ID>; // 数値
const backlog = new backlogjs.Backlog({ host, apiKey });
const sleep = (ms: number): Promise<void> =>
new Promise((resolve) => {
setTimeout(() => {
resolve();
}, ms);
});
(async function () {
let issueList = [];
do {
// カテゴリーが未設定の課題を取得する
issueList = await backlog.getIssues({
projectId: [projectId],
categoryId: [-1], // -1 は未設定を表す
keyword: '', // 指定が必須にはなるが、空文字にするとフィルターしないみたい
});
for (const issue of issueList) {
// 特定のカテゴリーに変更する
await backlog.patchIssue(issue.issueKey, {
categoryId: [categoryId],
});
// 瞬時に API を叩きまくらないように wait を挟んでおく
await sleep(1000);
}
} while (issueList.length !== 0);
console.log('Done!');
})();
おわりに
Backlog API を駆使すれば色々な面倒ごとを回避できそうですね。今後も何かネタがあれば記事にしようと思います。
今回は以上になります。最後まで読んで頂きありがとうございました!