SPIDERPLUS Tech Blog

建設SaaS「スパイダープラス」のエンジニアとデザイナーのブログ

GitHub Projectsの進捗率をExcelで見える化した話

こんにちは、技術開発部 PdMの上田です。

みなさんはプロジェクトの進捗状況をどのように管理していますか。
私はプロジェクトのタスクの進捗率をガントチャートで管理するのが好きです。
スパイダープラスではGitHubを用いて開発を行っていますので、今回はGitHub Projectsの進捗率をExcel見える化してガントチャートで管理した話をしたいと思います。
※公開用に一部情報を省略、編集しております。

 

📝 この記事で説明しないこと

やりたいこと

メンバーはアサインされたIssueを進めています。

私は対応する案件がリリース日までに終わるのかどうか、順調にすすんでいるかどうかを進捗率を見て随時確認したいと考えています。

別途進捗を管理するファイルを用意すると、メンバーに余計な手間がかかってしまいます。

そこで、メンバーにはアサインされたIssueのみ更新してもらい、管理したいIssueの情報を収集することで進捗状況を管理できないか考えてみました。

GitHub IssueにはIssueのトップコメントに記載したチェックリストをタスクとしてカウントする機能があります。このチェックリストをガントチャートでは進捗率として利用し、Issue上では各メンバー自身の残タスク管理として利用することでメンバーはIssueを更新するだけ、私はIssueの情報を取得して進捗状況を確認できる状態を目指します。

GitHub Projectsのroadmap機能では足りない

GitHub Projectsには2023/3/23にroadmap機能(ガントチャート表示)がリリースされています。

ただし、このroadmap表示では開始日、終了日は表示できるものの、各Issueの進捗状況を表示することはできませんでした。

https://github.blog/changelog/2023-03-23-roadmaps-in-projects-are-now-generally-available/

Microsoftが提供するExcelガントチャートを利用

共有するならスプレッドシートで作成したいところですが、利用したい機能はMicrosoftが提供するExcelガントチャートに網羅されており、すぐに使える状態にしたかったためExcelをそのまま利用することにしました。

このExcelには進捗状況欄の進捗率に応じて、スケジュールの線の色を塗りつぶしてくれる機能があります。また、スケジュールも表示したい最初の週に含まれる日付を入力するとスケジュールの線が切り替わるため、日付の列が足りなくなったから追加するような手間もありません。

https://create.microsoft.com/ja-jp/template/%25E3%2582%25B7%25E3%2583%25B3%25E3%2583%2597%25E3%2583%25AB-%25E3%2582%25AC%25E3%2583%25B3%25E3%2583%2588-%25E3%2583%2581%25E3%2583%25A3%25E3%2583%25BC%25E3%2583%2588-4bf6b793-490f-4623-84ca-c9c6251a91fc

GitHub Issueのタスクをガントチャート

Excelに表示したい項目列を追加し、GitHub ProjectsおよびIssueの内容をガントチャートに当てはめます。

 

項目

種別

Excelの対象列

備考

開始日

GitHub Projects

実績開始日

-

開始予定日

GitHub Projects

開始

スケジュールの線に反映

終了予定日

GitHub Projects

終了

スケジュールの線に反映

リポジトリ

GitHub Issue

リポジトリ

-

タイトル

GitHub Issue

タイトル

-

assignees

GitHub Issue

担当者

-

Issueトップのタスクリスト

GitHub Issue

タスク

-

-

-

進捗状況

タスクリストから計算

GitHubからのデータ取得にはGithub GraphQL APIを利用しExcelマクロにて取得します。

GitHub GraphQL APIを利用するためにはPersonal access tokenの発行が必要です。

Personal access tokenの発行についてはこちらを参照してください。

【Projectsのデータを取得するGraphQL】

query {
  organization(login: \"組織名\") {
    projectV2(number: 131) {
      title
      items(first:100) {
        totalCount
        edges {
          node {
            type
            content {
              ...on Issue {
                number
                id
                title
                url
                closed
                closedAt
                createdAt
                updatedAt
                repository {
                  name
                }
                milestone {
                  id
                  title
                }
                assignees(first: 5) {
                  nodes {
                    name
                    login
                  }
                }
                body
              }
            }
            isArchived
            updatedAt
            fieldValues(first: 20) {
              nodes{
                ... on ProjectV2ItemFieldTextValue {
                  text
                  field {
                    ... on ProjectV2FieldCommon {
                      id
                      dataType
                      name
                    }
                  }
                }
                ... on ProjectV2ItemFieldDateValue {
                  date
                  field {
                    ... on ProjectV2FieldCommon {
                      id
                      dataType
                      name
                    }
                  }
                }
                ... on ProjectV2ItemFieldSingleSelectValue {
                  name
                  optionId
                  field {
                    ... on ProjectV2FieldCommon {
                      id
                      dataType
                      name
                    }
                  }
                }
                ... on ProjectV2ItemFieldIterationValue {
                  iterationId
                  startDate
                  title
                  titleHTML
                  field {
                    ... on ProjectV2FieldCommon {
                      id
                      dataType
                      name
                    }
                  }
                }
                ... on ProjectV2ItemFieldLabelValue {
                  labels(first: 10) {
                    nodes {
                      name
                    }
                  }
                  field {
                    ... on ProjectV2FieldCommon {
                      id
                      dataType
                      name
                    }
                  }
                }
                ... on ProjectV2ItemFieldMilestoneValue {
                  milestone {
                    id
                    title
                  }
                  field {
                    ... on ProjectV2FieldCommon {
                      id
                      dataType
                      name
                    }
                  }
                }
                ... on ProjectV2ItemFieldNumberValue {
                  number
                  field {
                    ... on ProjectV2FieldCommon {
                      id
                      dataType
                      name
                    }
                  }
                }
              }
            }
          }
          cursor
        }
        pageInfo {
          endCursor
          hasNextPage
        }
      }
    }
  }
}

完成

ProjectsのIssueをタスクリストをもとに進捗管理できるようになりました。

Excelからスプレッドシート

現状の把握をすぐにできるようにMicrosoftが提供するExcelガントチャートを利用しましたが、スプレッドシートのほうがメンバーがアクセスしやすいだけでなく、他チームや他部署からも状況が確認できてアサインの調整がしやすくなり便利です。

そのため、今後はスプレッドシートへ移行しプロジェクトの状況を誰でも確認できるようにしていく予定です。

最後に

スパイダープラスでは仲間を募集中です。

もっといい方法を知っている、自分だったらこんな風に管理する、などなど、スパイダープラスにちょっと興味が出てきたなという方がいらっしゃったらお気軽にご連絡ください。

https://spiderplus.co.jp/contact/

 

参考

docs.github.com