4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JiraとExcelの二重管理から脱却する3つのアプローチ

Last updated at Posted at 2025-12-13

はじめに

この記事では、実績工数のJiraとExcelの二重管理から脱却する3つのアプローチを紹介します。

課題整理

まず、なぜJiraとExcelの二重管理が発生するのか整理します。

よくある運用パターン

1. Jiraでタスク管理・時間記録(Time Tracking)
   ↓
2. 週次/月次でJiraから実績工数をコピペ
   ↓
3. Excelで集計・グラフ化

何が問題なのか

  • 手作業によるコピペミス: 数値の転記ミスが発生しやすい
  • 時間のムダ: 毎週/毎月、同じ作業を繰り返す
  • データの不整合: JiraとExcelでデータが乖離する可能性
  • リアルタイム性の欠如: 最新の状況を把握するのに時間がかかる
  • 属人化: Excelファイルの数式や構造を理解している人が限られる

特に、複数プロジェクトを横断した集計や、特定期間のデータ抽出を行う際に、この問題は顕著になります。

アプローチ1: Jira標準機能の活用

最もシンプルなアプローチは、Jiraの標準機能を最大限活用することです。

Jiraのレポート機能

Jiraには、以下のようなレポート機能が標準で用意されています。

Time Tracking Report

ユーザーごと、プロジェクトごとの工数を可視化できます。

プロジェクト設定 → レポート → Time Tracking Report

表示できる情報:

  • ユーザーごとの作業時間
  • 課題ごとの見積もり時間 vs 実績時間
  • 期間指定によるフィルタリング

カスタムダッシュボード

ダッシュボードにガジェットを配置することで、リアルタイムな工数状況を可視化できます。

活用できるガジェット:

  • Pie Chart: プロジェクトごとの工数割合
  • Two Dimensional Filter Statistics: ユーザー×プロジェクトのマトリクス
  • Average Age Chart: タスクの滞留時間

実装例

ダッシュボードの作成手順:

1. ダッシュボード → 新規作成
2. ガジェットを追加 → "Filter Results"を選択
3. JQLでフィルタを作成:
   
   project = PROJECT_KEY 
   AND worklogDate >= startOfMonth() 
   AND worklogDate <= endOfMonth()
   
4. グルーピング: assignee (担当者別)
5. 統計タイプ: Time Spent (消費時間)

メリットとデメリット

メリット:

  • 追加コストなし(標準機能のため)
  • 学習コスト低い
  • データの一元管理

デメリット:

  • Excelほど自由なレイアウト・集計ができない
  • 複雑な集計やクロス集計は困難
  • エクスポート形式が限定的

こんな現場におすすめ

  • Jiraの利用に慣れているチーム
  • シンプルな工数集計で十分な場合
  • まずは小さく始めたい場合

アプローチ2: Jira API + 自動化ツール

もう少し柔軟な集計や、既存のワークフローとの統合が必要な場合は、Jira APIを活用します。

Jira REST APIの基本

Jira Cloud/Data Centerには、豊富なREST APIが用意されています。

認証方法

# Basic認証(Jira Cloud)
curl -u email@example.com:api_token \
  https://your-domain.atlassian.net/rest/api/3/myself
# Personal Access Token(Jira Data Center)
curl -H "Authorization: Bearer YOUR_TOKEN" \
  https://your-domain.com/rest/api/2/myself

工数データの取得

特定期間のworklogを取得するAPIエンドポイント:

GET /rest/api/3/issue/{issueIdOrKey}/worklog

Python実装例

JiraのworklogデータをGoogle Sheetsに自動転記するスクリプト例:

import requests
from datetime import datetime, timedelta
import gspread
from oauth2client.service_account import ServiceAccountCredentials

# Jira設定
JIRA_URL = "https://your-domain.atlassian.net"
JIRA_EMAIL = "your-email@example.com"
JIRA_API_TOKEN = "your-api-token"

# 今月のworklogを取得
def get_monthly_worklogs(project_key):
    jql = f'project = {project_key} AND worklogDate >= startOfMonth()'
    
    # JQLで課題を検索
    search_url = f"{JIRA_URL}/rest/api/3/search"
    headers = {"Accept": "application/json"}
    query = {
        "jql": jql,
        "fields": "worklog,summary,assignee"
    }
    
    response = requests.get(
        search_url,
        headers=headers,
        auth=(JIRA_EMAIL, JIRA_API_TOKEN),
        params=query
    )
    
    issues = response.json()["issues"]
    
    # worklogを整形
    worklogs = []
    for issue in issues:
        if "worklog" not in issue["fields"]:
            continue
            
        for log in issue["fields"]["worklog"]["worklogs"]:
            worklogs.append({
                "issue_key": issue["key"],
                "summary": issue["fields"]["summary"],
                "author": log["author"]["displayName"],
                "time_spent": log["timeSpentSeconds"] / 3600,  # 時間に変換
                "date": log["started"][:10]
            })
    
    return worklogs

# Google Sheetsに書き込み
def write_to_sheets(worklogs):
    scope = ["https://spreadsheets.google.com/feeds"]
    creds = ServiceAccountCredentials.from_json_keyfile_name(
        "credentials.json", scope
    )
    client = gspread.authorize(creds)
    
    sheet = client.open("工数管理").sheet1
    
    # ヘッダー
    sheet.update("A1:E1", [[
        "課題キー", "サマリー", "担当者", "工数(h)", "日付"
    ]])
    
    # データ挿入
    rows = [[
        w["issue_key"],
        w["summary"],
        w["author"],
        w["time_spent"],
        w["date"]
    ] for w in worklogs]
    
    sheet.update(f"A2:E{len(rows)+1}", rows)

# 実行
worklogs = get_monthly_worklogs("PROJ")
write_to_sheets(worklogs)
print(f"{len(worklogs)}件のworklogを転記しました")

Google Apps Script実装例

Google Sheetsから直接Jiraデータを取得する方法:

function fetchJiraWorklogs() {
  const JIRA_URL = 'https://your-domain.atlassian.net';
  const JIRA_EMAIL = 'your-email@example.com';
  const JIRA_API_TOKEN = 'your-api-token';
  
  // Basic認証のヘッダー
  const headers = {
    'Authorization': 'Basic ' + Utilities.base64Encode(
      JIRA_EMAIL + ':' + JIRA_API_TOKEN
    ),
    'Content-Type': 'application/json'
  };
  
  // 今月の工数を取得するJQL
  const jql = 'project = PROJ AND worklogDate >= startOfMonth()';
  const url = `${JIRA_URL}/rest/api/3/search?jql=${encodeURIComponent(jql)}&fields=worklog,summary,assignee`;
  
  const response = UrlFetchApp.fetch(url, { headers: headers });
  const data = JSON.parse(response.getContentText());
  
  // Sheetに書き込み
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.clear();
  
  // ヘッダー
  sheet.appendRow(['課題キー', 'サマリー', '担当者', '工数(h)', '日付']);
  
  // データ整形
  data.issues.forEach(issue => {
    if (!issue.fields.worklog) return;
    
    issue.fields.worklog.worklogs.forEach(log => {
      sheet.appendRow([
        issue.key,
        issue.fields.summary,
        log.author.displayName,
        log.timeSpentSeconds / 3600,
        log.started.substring(0, 10)
      ]);
    });
  });
  
  Logger.log('工数データの取得完了');
}

// 毎日自動実行する設定
function createTrigger() {
  ScriptApp.newTrigger('fetchJiraWorklogs')
    .timeBased()
    .everyDays(1)
    .atHour(9)
    .create();
}

定期実行の設定

GitHub Actionsでの自動化

name: Sync Jira to Sheets

on:
  schedule:
    - cron: '0 0 * * 1'  # 毎週月曜日0時
  workflow_dispatch:  # 手動実行も可能

jobs:
  sync:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'
      
      - name: Install dependencies
        run: |
          pip install requests gspread oauth2client
      
      - name: Run sync script
        env:
          JIRA_EMAIL: ${{ secrets.JIRA_EMAIL }}
          JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
          GOOGLE_CREDENTIALS: ${{ secrets.GOOGLE_CREDENTIALS }}
        run: python sync_jira.py

メリットとデメリット

メリット:

  • 完全自動化が可能
  • 既存のExcelフォーマットを維持できる
  • 複雑な集計ロジックも実装可能
  • 他システムとの連携も容易

デメリット:

  • 開発・メンテナンスコストがかかる
  • API仕様変更への対応が必要
  • 認証トークンの管理が必要

こんな現場におすすめ

  • 既存のExcelフォーマットを変えたくない
  • 複数システムと連携したい
  • 開発リソースを確保できる

アプローチ3: サードパーティツールの活用

開発コストを抑えつつ、より高度な工数管理を実現したい場合は、専用ツールの導入を検討します。

Tempo Timesheets

JiraのMarketplaceで最も人気のある工数管理プラグインです。

主な機能:

  • より詳細なworklog入力UI
  • 承認ワークフロー
  • 予算管理
  • 高度なレポート機能
  • CSVエクスポート

料金: 10ユーザーで$10/月〜

インストール:
Jira設定 → アプリを探す → "Tempo Timesheets"で検索

Clockify

Jira連携が可能な無料のタイムトラッキングツールです。

特徴:

  • Jiraの課題に直接時間記録
  • ブラウザ拡張機能で簡単入力
  • 無料プランでも基本機能が利用可能
  • Excelエクスポート対応

連携設定:

1. Clockifyアカウント作成
2. Integrations → Jira
3. Jira URLとAPI Tokenを入力
4. プロジェクトをマッピング

Tableau/Power BIとの連携

BIツールを使ってJiraデータを可視化する方法もあります。

Tableau連携例:

-- Jiraコネクタを使用したカスタムSQL
SELECT 
  i.key AS issue_key,
  i.summary,
  w.author,
  w.timeworked / 3600 AS hours,
  DATE(w.startdate) AS work_date
FROM 
  jiraissue i
  JOIN worklog w ON i.id = w.issueid
WHERE 
  w.startdate >= CURRENT_DATE - INTERVAL '30 days'

メリットとデメリット

メリット:

  • 開発不要で即導入可能
  • プロフェッショナルなUI/UX
  • サポート体制が整っている
  • 継続的なアップデート

デメリット:

  • ランニングコストが発生
  • ベンダーロックインのリスク
  • カスタマイズに制限がある

こんな現場におすすめ

  • すぐに導入したい
  • 開発リソースがない
  • 予算を確保できる

比較表

それぞれのアプローチを、主要な観点で比較します。

観点 Jira標準機能 API自動化 サードパーティ
初期コスト 無料 低〜中 中〜高
ランニングコスト 無料 中〜高
開発工数 なし 中〜高 なし
カスタマイズ性
メンテナンス 不要 必要 ベンダー任せ
導入スピード 即日 1週間〜 即日〜数日
学習コスト 低〜中

まとめ

JiraとExcelの二重管理から脱却するための3つのアプローチを紹介しました。

再掲:

  1. Jira標準機能の活用: コストをかけずにすぐ始められる
  2. API自動化: 柔軟なカスタマイズと完全自動化
  3. サードパーティツール: 開発不要で高機能

参考

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?