こんにちは。
とある事情で月次で発生した障害情報を 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 以外はビルトインのモジュールを使ってみました。
※ いつも通りエラーハンドリングは