【Python】Backlog API を叩いて課題一覧を Excel に出力してみる【openpyxl】

こんにちは。
とある事情で月次で発生した障害情報を Excel に纏めて提出する必要が出てきたので、スクリプトを組んでみようと思います。
発生した障害は Backlog の Webhook 機能を使って課題として登録されているので、Backlog API を叩いて月の障害課題を収集します。
Python には openpyxl という Excel 操作用のライブラリが用意されているようなので、甘んじて使ってみます。
※ Python よく分からない民なので、割とむちゃくちゃしてるかもです。

ディレクトリ構成

テンプレートとなる Excel ファイルを templates ディレクトリ配下に配置しておき、API を叩いて取得した課題一覧をマージして output に出力する構成にしてみます。

.
├── main.py
├── output
└── templates
    └── template.xlsx

スクリプト

念のため API Key、スペース ID、プロジェクト ID 等の秘匿情報周りは環境変数から読み込めるようにしておきます。
また、課題の検索期間、検索キーワードはコマンドライン引数から指定できるように調整します。

#!/usr/bin/python3
# coding: utf-8

import json
import os
import urllib.request
import urllib.parse
import datetime
import sys
import openpyxl
import argparse

parser = argparse.ArgumentParser(
    usage='Specify the collection period in -p and the search word in -w as arguments',
    description='Output a list of issues to Excel by hitting the BackLog API.'
    )
parser.add_argument('-p', '--period', required=True, help='Specify the time period for collecting issues (1: this month to today or 2: last month)')
parser.add_argument('-w', '--word', required=True, help='Specify search words')
args = parser.parse_args()

if __name__ == '__main__':
    if args.period == "1":
        CREATED_SINCE = datetime.datetime.now().strftime('%Y' + "-" + '%m') + '-01'
        CREATED_UNTIL = datetime.datetime.now().strftime('%Y' + "-" + '%m' + "-" + '%d')
    elif args.period == "2":
        CREATED_SINCE = (datetime.datetime.today() - datetime.timedelta(datetime.datetime.today().day)).strftime('%Y-%m') + '-01'
        CREATED_UNTIL = (datetime.datetime.today() - datetime.timedelta(datetime.datetime.today().day)).strftime('%Y-%m-%d')
    else:
        print('Invalid argument.')
        sys.exit(1)

BACKLOG_API_KEY = os.environ['BACKLOG_API_KEY']
SPACE_ID = os.environ['SPACE_ID']
PROJECT_ID = os.environ['PROJECT_ID']
KEYWORD = urllib.parse.quote(args.word)
#CREATED_SINCE = '2022-xx-01'
#CREATED_UNTIL = '2022-xx-31'

URL = f'https://{SPACE_ID}.backlog.jp/api/v2/issues?apiKey={BACKLOG_API_KEY}&projectId[]={PROJECT_ID}&createdSince={CREATED_SINCE}&createdUntil={CREATED_UNTIL}&count=100&keyword={KEYWORD}'

def utc_to_jst(timestamp_utc):
    """
    @string
    UTC → JST に変換する
    """
    datetime_utc = datetime.datetime.strptime(timestamp_utc, "%Y-%m-%dT%H:%M:%SZ")
    datetime_jst = datetime_utc + datetime.timedelta(hours=9)
    timestamp_jst = datetime.datetime.strftime(datetime_jst, "%Y-%m-%d %H:%M:%S")
    return timestamp_jst
    
def get_alarm_list(url):
    """
    @string
    BackLog の課題を取得しパースしてから配列に突っ込む
    """
    request = urllib.request.Request(url)
    with urllib.request.urlopen(request) as response:
        data = json.loads(response.read().decode("utf-8"))

        lists = []
        for i in range(len(data)):
            lists.append(utc_to_jst(data[i]['created']) + "," + data[i]['summary'])
    return lists

"""
# NOTE: BackLog API 叩く
"""
res = get_alarm_list(URL)

"""
# NOTE: テンプレート( Excel )読み込み
"""
wb = openpyxl.load_workbook("templates/template.xlsx")
cover_ws = wb.worksheets[0]
list_ws = wb.worksheets[1]

"""
# NOTE: 表紙に資料作成日を追記
"""
cover_ws.cell(column=10, row=13, value=datetime.datetime.now().strftime('%Y' + "-" + '%m' + "-" + '%d'))

"""
# NOTE: 全課題を Excel シートに突っ込む
"""
for i in range(len(res)):
    list_ws.cell(column=3, row=(i + 3), value=res[i].split(',')[0])
    list_ws.cell(column=4, row=(i + 3), value=res[i].split(',')[1])
    print(res[i])

"""
# NOTE: Excel 保存
"""
wb.save("output/MonthlyAlarm_" + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + ".xlsx")

openpyxl 以外はビルトインのモジュールを使ってみました。
※ いつも通りエラーハンドリングは 無視 省力です。自分用の備忘録ですしおすし。

投稿者: snk

保有資格 ・TOEIC 835 ・LPIC 304 ・AWS SAA/SAP ・GCP PCA ・IPA SC

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です