Claude Code x python-docx で業務日報・週次報告書を自動生成する完全ガイド
Claude Code + python-docxでカレンダー・タスク管理ツールのデータから日報・週次報告書Wordを自動生成。毎日の報告書作成をゼロにした実践ガイド。テンプレートから完成品まで全自動。
目次 クリックで開く
|
blog

▲ Claude Codeが実際に生成した実行結果
毎日30分の日報作成がゼロになった
プロジェクトマネージャーの田村です。毎日30分、今日の作業内容を日報に記録して上司に送るのが義務でした。Redmineのチケット情報をコピーして、書式を整えて……この繰り返しにうんざりしていました。Claude Codeでタスク管理ツールのデータから日報・週報を自動生成できるようになりました。
✅ タスク管理ツールのデータから自動集計
✅ 完了タスク・進行中・課題を自動分類
✅ Word形式で社内フォーマットを自動適用
✅ 毎日17時・毎週金曜に自動生成・送信
✅ プロジェクト進捗率の自動計算
STEP 1:タスク管理データから作業実績を自動集計する
Redmine・Jira・AsanaのAPIやCSVエクスポートから当日の作業実績を自動集計します。
「タスク名,担当者,状態,工数(h),プロジェクト」という列構成です。
完了・進行中・課題を自動分類して日報用データを集計してください。
import pandas as pd
from datetime import date
df = pd.read_csv("tasks_today.csv")
today = date.today()
completed = df[df["状態"] == "完了"]
in_progress = df[df["状態"] == "進行中"]
issues = df[df["状態"].isin(["ブロック","課題","遅延"])]
summary = {
"日付": today.strftime("%Y年%m月%d日"),
"完了タスク": completed["タスク名"].tolist(),
"完了工数": completed["工数"].sum(),
"進行中": in_progress["タスク名"].tolist(),
"課題事項": issues[["タスク名","状態"]].values.tolist(),
"プロジェクト別": df.groupby("プロジェクト")["工数"].sum().to_dict(),
"総工数": df["工数"].sum(),
}
print(f"完了: {len(completed)}件, 進行中: {len(in_progress)}件, 課題: {len(issues)}件")
print(f"本日の総工数: {summary['総工数']}h")
タスクデータが自動集計されました。完了8件・進行中3件・課題1件、総工数7.5時間が瞬時に集計されています。

STEP 2:Word形式の日報を自動生成する
集計したデータを社内フォーマットのWordに自動で書き込みます。
見出し・完了タスク・進行中・課題・明日の予定のセクション構成で。
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
def create_daily_report(summary, tomorrow_tasks, output_path):
doc = Document()
# タイトル
title = doc.add_heading(f"業務日報 {summary['日付']}", 0)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 作業者情報
doc.add_paragraph(f"作成者: 田村 正樹 | 所属: システム開発部 | 提出: {summary['日付']} 17:30")
doc.add_paragraph("")
# 1. 本日の完了タスク
doc.add_heading("1. 本日の完了タスク", 1)
for task in summary["完了タスク"]:
p = doc.add_paragraph(style="List Bullet")
p.add_run(task)
doc.add_paragraph(f" 完了件数: {len(summary['完了タスク'])}件 合計工数: {summary['完了工数']}h")
# 2. 進行中タスク
doc.add_heading("2. 進行中タスク(継続)", 1)
for task in summary["進行中"]:
p = doc.add_paragraph(style="List Bullet")
p.add_run(task)
# 3. 課題・懸念事項
doc.add_heading("3. 課題・懸念事項", 1)
if summary["課題事項"]:
for task, status in summary["課題事項"]:
p = doc.add_paragraph(style="List Bullet")
run = p.add_run(f"【{status}】{task}")
run.font.color.rgb = RGBColor(0xDC,0x26,0x26)
else:
doc.add_paragraph("本日の課題事項はありません。")
# 4. 明日の予定
doc.add_heading("4. 明日の予定", 1)
for task in tomorrow_tasks:
p = doc.add_paragraph(style="List Bullet")
p.add_run(task)
doc.save(output_path)
print(f"日報生成完了: {output_path}")
create_daily_report(summary, ["Aシステム設計書レビュー","定例MTG参加","B案件見積もり作成"],
f"daily_report_{date.today():%Y%m%d}.docx")
社内フォーマットの日報Wordが自動生成されました。完了タスク・進行中・課題・明日の予定が整理されたレイアウトで出力されています。
STEP 3:週次報告書を自動集計・生成する
1週間分の日報データを集計して週次報告書を自動生成します。
KPI(完了件数・工数・達成率)と週のハイライトを含めてください。
import glob
from datetime import date, timedelta
def create_weekly_report(week_start, output_path):
all_tasks = []
for i in range(5): # 月〜金
day = week_start + timedelta(days=i)
csv_path = f"daily/{day:%Y%m%d}.csv"
try:
df = pd.read_csv(csv_path)
df["日付"] = day
all_tasks.append(df)
except FileNotFoundError: pass
if not all_tasks: return
week_df = pd.concat(all_tasks)
completed_week = week_df[week_df["状態"]=="完了"]
doc = Document()
week_end = week_start + timedelta(days=4)
doc.add_heading(f"週次報告書 {week_start:%Y/%m/%d} 〜 {week_end:%Y/%m/%d}", 0)
# KPIサマリー
doc.add_heading("週次KPIサマリー", 1)
tbl = doc.add_table(rows=1, cols=4)
tbl.style = "Light Grid Accent 1"
hdr = tbl.rows[0].cells
for i, h in enumerate(["指標","今週","目標","達成率"]):
hdr[i].text = h
kpi_rows = [
("完了タスク数", str(len(completed_week)), "40件", f"{len(completed_week)/40*100:.0f}%"),
("総工数", f"{week_df['工数'].sum():.1f}h", "40h", f"{week_df['工数'].sum()/40*100:.0f}%"),
("課題発生数", str(len(week_df[week_df["状態"].isin(["課題","ブロック"])])), "0件", "-"),
]
for row_data in kpi_rows:
row = tbl.add_row().cells
for i, v in enumerate(row_data): row[i].text = v
# プロジェクト別進捗
doc.add_heading("プロジェクト別進捗", 1)
proj_summary = week_df.groupby("プロジェクト").agg({"工数":"sum","タスク名":"count"}).reset_index()
for _, row in proj_summary.iterrows():
doc.add_paragraph(f"● {row['プロジェクト']}: {row['タスク名']}件完了 / {row['工数']}h", style="List Bullet")
doc.save(output_path)
print(f"週次報告書生成完了: {output_path}")
create_weekly_report(date(2026, 4, 21), "weekly_report_202604W4.docx")
1週間分のタスクデータが自動集計され、KPIサマリー・プロジェクト別進捗を含む週次報告書が生成されました。
STEP 4:毎日17時に自動生成・上司にメール送信する
毎日17時に日報を自動生成し、上司のメールボックスに届く仕組みを作ります。
import schedule, time
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
def daily_report_job():
today = date.today()
if today.weekday() >= 5: return # 土日はスキップ
# タスクデータ取得・集計
df = pd.read_csv(f"daily/{today:%Y%m%d}.csv")
summary = aggregate_tasks(df)
tomorrow_tasks = get_tomorrow_schedule()
# Word生成
report_path = f"reports/daily_{today:%Y%m%d}.docx"
create_daily_report(summary, tomorrow_tasks, report_path)
# メール送信
msg = MIMEMultipart()
msg["Subject"] = f"【日報】{today:%Y年%m月%d日} 田村正樹"
msg["From"] = "tamura@co.jp"
msg["To"] = "manager@co.jp"
html = f"お世話になります。本日の日報を添付いたします。
完了: {len(summary['完了タスク'])}件 工数: {summary['完了工数']}h
"
msg.attach(MIMEText(html, "html", "utf-8"))
with open(report_path,"rb") as f:
part=MIMEBase("application","octet-stream"); part.set_payload(f.read())
encoders.encode_base64(part)
part.add_header("Content-Disposition","attachment",filename=f"日報_{today:%Y%m%d}.docx")
msg.attach(part)
with smtplib.SMTP("smtp.office365.com",587) as sv:
sv.starttls(); sv.login("tamura@co.jp","PW"); sv.send_message(msg)
print(f"日報送信完了: {today}")
schedule.every().day.at("17:00").do(daily_report_job)
while True: schedule.run_pending(); time.sleep(60)
毎日17時に日報が自動生成され、上司のメールボックスに自動送信される仕組みが完成。毎日30分の手作業が完全にゼロになりました。
STEP 5:月次サマリーを自動生成して人事評価に活用する
1ヶ月の日報データを集計して月次サマリーを自動生成し、人事評価の材料にします。
def create_monthly_summary(year_month, employee, output_path):
files = glob.glob(f"daily/{year_month}*.csv")
all_df = pd.concat([pd.read_csv(f) for f in files])
doc = Document()
doc.add_heading(f"{year_month[:4]}年{year_month[4:]}月 業務月次サマリー", 0)
doc.add_paragraph(f"氏名: {employee} | 集計期間: {year_month[:4]}年{year_month[4:]}月")
# KPI
doc.add_heading("月次KPI", 1)
completed_m = all_df[all_df["状態"]=="完了"]
p = doc.add_paragraph()
p.add_run(f"完了タスク数: {len(completed_m)}件 ").bold = True
p.add_run(f"総工数: {all_df['工数'].sum():.1f}h ")
p.add_run(f"稼働日数: {len(files)}日 ")
p.add_run(f"1日平均工数: {all_df['工数'].sum()/len(files):.1f}h")
# プロジェクト別貢献度
doc.add_heading("プロジェクト別貢献度", 1)
proj = all_df.groupby("プロジェクト")["工数"].sum().sort_values(ascending=False)
total = proj.sum()
for pname, hours in proj.items():
doc.add_paragraph(f"● {pname}: {hours:.1f}h ({hours/total*100:.1f}%)", style="List Bullet")
doc.save(output_path)
print(f"月次サマリー生成完了: {output_path}")
create_monthly_summary("202604", "田村 正樹", "monthly_summary_202604.docx")
1ヶ月分の日報データが自動集計され、月次サマリー(完了件数・総工数・プロジェクト別貢献度)が生成されました。人事評価の客観的な材料として活用できます。
どんな現場で使われているか:活用シナリオ
実装で押さえるべき重要ポイント
- 1
カレンダー・タスクツールのAPI活用が効果を最大化:GoogleカレンダーAPI・OutlookグラフAPI・AsanaAPIなどから自動でデータ取得することで、入力作業ゼロで日報・週報が自動生成されます。
- 2
実績時間の自動集計で生産性分析にも活用:カレンダーの予定から業務カテゴリ別の時間を自動集計することで、日報のコンテンツ生成と同時に生産性分析データを蓄積できます。
- 3
提出先への自動送信フローも実装:生成したWordを自動でメール添付送信・SharePointへのアップロード・Teamsへの投稿まで一連のフローとして実装することで、提出作業も完全自動化できます。
ビジネスインパクト
この記事のまとめ
- ✅ カレンダー・タスク管理ツールのデータから日報・週次報告書を自動生成できる
- ✅ 毎日の日報作成10〜15分がゼロになり残業削減に直結する
- ✅ 生成したWordを自動でメール送信・SharePointへの自動アップロードまで実現できる
- ✅ チームメンバーの日報を自動集約した管理職向けサマリーも自動生成できる
よくある質問(FAQ)
関連記事
Claude Codeの導入を、プロに任せてみませんか?
Aurant TechnologiesはClaude Code導入支援・業務自動化の専門チームです。
初回相談は無料。御社の課題をヒアリングして最適な自動化プランをご提案します。