
「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'にして、平日の曜日にチェックを入れる。
開始日時については、開始欄で日時を指定する。
設定した日にち・曜日から繰り返しで、指定した日時で通知が行われます。

「操作」タブ
プログラム/スクリプト:参照ボタンからpython.exeを指定
引数の追加:実行するファイル名を指定(拡張子.pyを含む)
開始:実行するPythonコードの置き場所

タスクスケジューラで指定したタイミングで、TeamsにBacklog通知が送信されることが確認できれば、「Python」×「タスクスケジューラ」を用いた、BacklogチケットをTeamsに定期的に連携する設定は完了になります。
おわりに
最後まで記事を読んでいただきありがとうございます!
今回ご紹介した内容を活用いただき、プロジェクト管理の1つのツールとしてお役立ていただければ幸いです。
記事が役に立ったと感じていただけたら、スキをいただけると励みになります。
他にも、noteで生成AI等の記事を書いているので、よければ、ご一読いただければ幸いです。
執筆者プロフィール: 野上
SIerで数年のキャリアを経て、SHIFT入社。 生成AIなど技術・サービスをキャッチアップして、発信していきます!
✅SHIFTへのお問合せはお気軽に
✅お役立ち資料無料ダウンロード
SHIFTについて(コーポレートサイト)
SHIFTのサービスについて(サービスサイト)
SHIFTの導入事例
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/