見出し画像

「Python」×「タスクスケジューラ」で、BacklogチケットをTeamsに定期的に連携する方法を解説


はじめに


こんにちは。SHIFTの野上です。

今回の記事では、「Python」×「タスクスケジューラ」を用いて、Backlogの期限切れ・期限間近のチケットを定期的にTeamsチャットに連携する方法をご紹介します。

Python実行環境の準備

まずは、Pythonコードを実行するために、ローカル環境にPythonをインストールします。

公式サイトからインストーラーをダウンロードします。 https://www.python.org/downloads/

インストーラーをダウンロードしたら、下記の画像の通りにチェックを入れてインストールします。

インストールが完了したら、「Windows PowerShell」を起動して、pip listを入力して、パッケージのインストール状況を確認します。

"requests"パッケージがインストールされていなければ、pip install requestsを入力して、パッケージを追加でインストールしてください。

Pythonコードの設定

今回は、下記のPythonコードを使用して、Backlogから期限切れ・期限間近のチケットを取得し、Teamsに連携します。

import requests
import json
from datetime import datetime, timedelta

# Backlog情報
BACKLOG_API_KEY = 'AAAAAAAA'  # ①APIキー
BACKLOG_HOME_URL = 'https://BBBBBBB.backlog.com/view' # ②プロジェクトホームURL
BACKLOG_SPACE_ID = 'BBBBBBB' # ③URLの先頭
BACKLOG_PROJECT_ID = 'CCCCCC' # ④プロジェクトID
BACKLOG_CATEGORY_ID = 'DDDDDDD' # ⑤カテゴリー
BACKLOG_STATUS_ID = [1,2] # ⑥チケットのステータス
BACKLOG_SCOPE = 7 # ⑦チケット集計対象期間 
BACKLOG_ISSUE_TYPES = ["タスク","要望"] # ⑧Backlogの種別 
BACKLOG_API_URL = f'https://{BACKLOG_SPACE_ID}.backlog.com/api/v2/issues' # BacKlogの課題一覧の取得API

# Teams情報
TEAMS_WEBHOOK_URL = 'https://EEEEEEEE' # ⑨TeamsのWebhook URL

# 期限間近および期限切れのチケットを取得する関数
def get_issues():
    today = datetime.now()
    ticket_scope = today + timedelta(days=BACKLOG_SCOPE) # チケット収集日範囲
    params = {
        'apiKey': BACKLOG_API_KEY,
        'projectId[]': BACKLOG_PROJECT_ID,
        'categoryId[]': BACKLOG_CATEGORY_ID,
        'statusId[]':BACKLOG_STATUS_ID,
        'count': 100,
        'dueDateUntil': ticket_scope.strftime('%Y-%m-%d'),
        'sort': 'dueDate',
        'order': 'asc'
    }
    response = requests.get(BACKLOG_API_URL, params=params)
    response.raise_for_status()
    return response.json()

# Teamsにメッセージを送信する関数
def send_to_teams(message):
    headers = {
        'Content-Type': 'application/json'
    }
    payload = {
    "attachments": [
    {
        "contentType": "application/vnd.microsoft.card.adaptive",
        "content": {
        "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
        "type": "AdaptiveCard",
        "version": "1.2",
        "body": [
            {
            "type": "TextBlock",
            "text": message,
            "wrap": True,
            "markdown": True
            } 
        ],
        "msteams":{
            "width": "Full"
            }
        }
    }
    ]
}
    response = requests.post(TEAMS_WEBHOOK_URL, data=json.dumps(payload), headers=headers)
    response.raise_for_status()

# チケットのタイプ分け
def append_issues_by_type(message, issues,issue_type):
    link_base = BACKLOG_HOME_URL #
    message += issue_type + "\n\n"
    tickets_exists = False
    for issue in issues:
        if issue["issueType"]["name"] == issue_type:
            if not tickets_exists:
                tickets_exists = True
            due_date = (issue['dueDate'] if 'dueDate' in issue else 'なし').replace('T00:00:00Z', '')
            link = link_base + issue['issueKey']
            message += f"* 【 [{issue['issueKey']}]({link}) 】 {issue['summary']} (期限: {due_date})\n\n"
    if not tickets_exists:
        message += "* 対象チケットなし\n\n"
    return message

# メイン処理
def main():
    issues = get_issues()
    if not issues:
        send_to_teams("期限間近および期限切れのチケットはありません。")
        return

    message = "期限間近および期限切れのチケット情報:\n\n"
    # 課題タイプのリスト
    issue_types = BACKLOG_ISSUE_TYPES
    for issue_type in issue_types:
        message = append_issues_by_type(message,issues,issue_type)

    send_to_teams(message)
    # print(message)

if __name__ == "__main__":
    main()

上記のコードを動かすために、①~⑨の情報をBacklog及びTeamsから取得・設定します。

<①BACKLOG_API_KEY>

Backlog APIを実行するために必要なBacklogのAPIキー。

■確認方法

Backlogのアイコンから"個人設定"を押下。

新しいAPIキーを発行の"登録"を押下で、APIキーが発行されます。

<②BACKLOG_HOME_URL>

利用しているBacklogのURL。

■確認方法

BacklogのURLに表示される'https://BBBBBBB.backlog.com/view ' が該当のURLになります。

<③BACKLOG_SPACE_ID>

情報取得したいBacklogのスペースID。

■確認方法

BacklogのURLに表示される'https://BBBBBBB.backlog.com/view ' の"BBBBBBB"の部分に該当する箇所が、スペースIDになります。

<④BACKLOG_PROJECT_ID>

情報取得したいBacklogのプロジェクトID。

■確認方法

情報を取得したいプロジェクトに移動した後に、"プロジェクト設定"を押下した後に表示されるURLの"projectid=CCCCCC"の"CCCCCC"の部分が、プロジェクトIDになります。

<⑤BACKLOG_CATEGORY_ID>

情報を取得したいプロジェクトの中で、取得対象とするカテゴリーID。

■確認方法

情報を取得したいプロジェクトに移動した後に、"プロジェクト設定"を押下し、表示される"カテゴリー"を押下。

カテゴリーの一覧が表示されるので、取得対象としたいカテゴリーを押下。

指定のカテゴリー押下後に、表示されるURLの"component.id=DDDDDDD"の"DDDDDDD"の部分が、カテゴリーIDになります。

<⑥BACKLOG_STATUS_ID>

情報を取得したいBacklogチケットのステータス情報。

Backlogでは、下記のステータスと番号が割り当てられています。

1:未対応、2:処理中、3:処理済み、4:完了

下記の形で、取得したいステータスをコードに設定します。

例.BACKLOG_STATUS_ID = [1, 2]

<⑦BACKLOG_SCOPE>

期限切れ何日前からのチケットを取得するかを指定します。

<⑧BACKLOG_ISSUE_TYPES>

情報を取得したいプロジェクトの中で、取得対象とするステータス。

下記の形で、取得したい種別をコードに設定します。

例.BACKLOG_ISSUE_TYPES = ["タスク","要望"]

<⑨TEAMS_WEBHOOK_URL>

Backlogのチケットを連携するTeamsチャットに紐づくWebhook URL。

■設定方法

Teams画面で、通知を連携したいチャットの設定から、"ワークフロ"ーを押下。

webhook要求を受信したらチャットに投稿するを選択。

次へを選択。

グループチャットに、指定のチャットが選択されていることを確認し、ワークフローを追加するを選択。

処理が完了するとWebhook URLが表示されます。

Pythonコードの実行確認

Pythonコードの設定が完了したら、Pythonコードのファイルをダブルクリックして実行します。

設定した条件のBacklogチケットが、指定したTeamsチャットで受信できれば、Pythonコードの実行確認は完了です。

タスクスケジューラの設定

Pythonコードの実行確認ができたら、Pyhonコードを定期的に実行するために、Windowsで使える"タスクスケジューラ"を使用します。

■設定方法

タスクスケジュールライブラリで「タスクの作成」から新規のタスクを追加。

  • 「全般」タブ

タスクの「名前」を入力。

  • 「トリガー」タブ

通知を送るタイミングを設定します。

平日に通知を送りたい場合は、「毎週」にチェックを入れて、間隔を'1'にして、平日の曜日にチェックを入れる。

開始日時については、開始欄で日時を指定する。

設定した日にち・曜日から繰り返しで、指定した日時で通知が行われます。

  • 「操作」タブ

  1. プログラム/スクリプト:参照ボタンからpython.exeを指定

  2. 引数の追加:実行するファイル名を指定(拡張子.pyを含む)

  3. 開始:実行するPythonコードの置き場所

タスクスケジューラで指定したタイミングで、TeamsにBacklog通知が送信されることが確認できれば、「Python」×「タスクスケジューラ」を用いた、BacklogチケットをTeamsに定期的に連携する設定は完了になります。

おわりに


最後まで記事を読んでいただきありがとうございます!

今回ご紹介した内容を活用いただき、プロジェクト管理の1つのツールとしてお役立ていただければ幸いです。

記事が役に立ったと感じていただけたら、スキをいただけると励みになります。

他にも、noteで生成AI等の記事を書いているので、よければ、ご一読いただければ幸いです。

その他のnote記事


執筆者プロフィール: 野上
SIerで数年のキャリアを経て、SHIFT入社。 生成AIなど技術・サービスをキャッチアップして、発信していきます!

SHIFTへのお問合せはお気軽に

お役立ち資料無料ダウンロード

SHIFTについて(コーポレートサイト)

SHIFTのサービスについて(サービスサイト)

SHIFTの導入事例

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/