今日はAPIを使って、Backlogの課題に自動で課題の完了日を埋める仕組をつくりました。
Backlogの課題、登録日はあるんですけど、完了させたときの日付は記録されないんですよね。最終更新日が実質完了日と言えなくもないですが、その後分析のためカテゴリなどを一括更新してしまうと最終更新日も変わってしまい、完了日が取れなくなります。
実際、無邪気な分析愛好家(またの名をPMO)に完了後のカテゴリ変更をやられてしまいましてね。ほとんどの課題の完了日が取れなくなってしまいました。
完了日が取れなくなると、作業実績の統計が取れなくなるんですよね。
課題を作って、課題ごとに仕事や担当を振っているんですが、担当ごとの生産性を見るためにはどの担当が何月にどれだけ課題を完了させているか、というのは結構重要なんです。人によって結構違いが出るんですよ。
課題はIT系の構築や調査だったりして、個々の課題ごとに作業の難易度やボリュームは全く異なるんですが、それでもマクロ的な観点で見れば、月ごと、4半期ごとで見ると、人によって多かったり少なかったりする傾向が手に取るようにわかるんですね。
課題を完了させる品質程度が変わらなければ、そりゃたくさん課題を処理してほしいので、遅い人へのけん制の意味も込めて、人別月別の課題消化量を統計して公開してます。逆に早すぎる人に対しても、品質程度の観点からもっと時間をかけてよ、というメッセージにもなりますしね。そういった意味もあって、課題ごとの完了日、侮れません。リモートワークで互いの顔が見えなくなると、なおさらです。
そんな重要な完了日が、無邪気な数字遊び(失礼)のために洗い替えられちゃたまらん、同じことがあっても完了日は把握できるようにせんと!ということで、仕組みを考えたんですよ。
幸い、backlogにはAPIが用意されていて、ヘルプもあり比較的外部のプログラムから課題を更新しやすいです。反対に、backlog自身にスクリプト機能は持っていないようなので、新たにbacklogに「完了日」のカスタムフィールドを追加したうえで、外部から定期的に完了課題を拾って更新させることにしました。
外部と言っても、まず自分の端末、ローカルでジョブ起動させるのはNGですね。なぜなら自分が休みの日は端末を閉じてしまっているのでジョブが動かないからです。かといってこれだけのためにお金も手間もかかる専用サーバーを立ち上げる愚も犯したくない。
ちょっと悩んで、せや、こういうときのためのGASやってことで、GASから更新することにしました。これならサーバレスでいけるし、無料だし、いい感じやん♡
ということで早速構築してみました。GASは初めてだけど、まあ普通のJavaScriptですね。ゴリゴリ書いてしまいます。以下は書くときにまとめたポイントです。
✔ 1. 基本設定(APIキー / 対象プロジェクトなど)
最初に以下の環境設定が必要のため、backlogを確認・用意します。
・APIキー、スペースID
Backlog API 呼び出しの必須情報。APIキーは個人設定から作成できます。
・完了ステータスID
※プロジェクトごとに異なる場合があるので要注意!
・完了日カスタムフィールドID
完了日を入れたい独自フィールドを追加し IDを取得。
対象プロジェクトIDのリスト
限定する場合は配列で指定、全体が対象なら空配列に。
これらを正しく設定することで、意図した課題だけに完了日が自動適用する処理を構築できます。よし、いいぞ。
✔ 2. 課題の取得処理(ページング対応)
Backlog API は一度に取得できる件数に制限があるため、
`count`(取得件数)
`offset`(取得開始位置)
を使って ページングしながらすべての課題を順次取得 します。
またクエリパラメータには:
・完了ステータス(必須)
・対象プロジェクト
・作成日フィルタ
などを付与し、不要なデータ取得を避けています。
✔ 3. 完了日が未設定の課題だけを更新
取得した課題から、次の条件に一致したものに処理を行います:
1. ステータスが「完了」
2. 完了日のカスタムフィールドが空
該当する場合は、
👉 課題の 更新日(issue.updated)を完了日として自動設定。
既に完了日が入っている課題はスキップするようにしておきます。
✔ 4. 完了日の更新処理(PATCH)
Backlogの課題更新 API に対して、
customField_<フィールドID> = yyyy-MM-dd
という形式で値を送信し、完了日をセットします。
更新成功 → ログに記録して `true` を返す
失敗 → エラー内容をログに残しスキップ
という構造にしました。
✔ 5. エラーハンドリングとログ出力をしっかり作りこむ
ここをなおざりにしておくと、半年後、コードのことなどすっかり忘れた自分が困ることになりますので、ちゃんと書き込みます笑
・APIレスポンスコードを毎回ログに残す
・取得・更新処理で例外が起きてもキャッチして処理を中断
・更新件数を最後にまとめて表示
後から不具合を追いやすく、運用中のトラブルにも強くできるように作れればいいかと思います。
開発できたらトリガーを毎日深夜一回動作させるようにして完了です。
翌朝見たら、ちゃんと動いてましたしログも確認できます。始めて使ったけど結構便利だGAS君。これはホクホク。さあ無邪気な統計軍団(またの名前をPMO。くどい?)、好きなだけフィールドを更新したまえ。ふははははっ