Claude Code x openpyxl で勤怠データ集計・残業アラートを完全自動化する

Claude Code + openpyxlで打刻CSVから勤務時間・残業時間を自動集計し36協定アラートとメール通知を自動生成。毎月3時間の集計作業をスクリプト1本に圧縮する実践ガイド。

この記事をシェア:
目次 クリックで開く

2026年4月 | Excel自動化 | 勤怠管理・HR

Claude Codeが生成した勤怠集計Excel

▲ Claude Codeが実際に生成した実行結果

毎月の勤怠集計3時間がスクリプト1本で終わった

人事担当として毎月、30名分の勤怠Excelを集めて残業時間を集計するのに3時間かかっていました。Claude Codeに依頼したところ、打刻データの集計から36協定アラート・給与計算CSV出力まで完全自動化できました。

この記事で実現すること

✅ 打刻CSVから勤務時間を自動計算
✅ 残業・深夜残業・休日出勤を自動分類
✅ 36協定アラート(月45h/60h/年360h)
✅ 部門別・個人別サマリー自動生成
✅ 給与計算用CSV自動出力

STEP 1:打刻データから勤務時間を自動計算する

勤怠システムからエクスポートした打刻CSVを読み込み、勤務時間・残業時間を自動計算します。

💬 私はClaude Codeにこう頼みました:kintai_202504.csvという打刻ファイルがあります。
列は「社員番号,氏名,部門,日付,出勤時刻,退勤時刻」です。
所定労働時間は9:00-18:00(休憩1時間)=8時間。
18:00以降を残業、22:00以降を深夜残業、土日を休日出勤として
社員別月次集計を作成してください。
🤖 Claude Codeの回答:打刻データの解析と勤怠区分の自動計算スクリプトを作成しました。
import pandas as pd
from datetime import datetime, time, timedelta

df = pd.read_csv("kintai_202504.csv", parse_dates=["日付"])
df["出勤"] = pd.to_datetime(df["出勤時刻"], format="%H:%M").dt.time
df["退勤"] = pd.to_datetime(df["退勤時刻"], format="%H:%M").dt.time

def calc(row):
    s = datetime.combine(row["日付"], row["出勤"])
    e = datetime.combine(row["日付"], row["退勤"])
    if e < s: e += timedelta(days=1)
    we = datetime.combine(row["日付"], time(18,0))
    ms = datetime.combine(row["日付"], time(22,0))
    reg = max(min((we-s).seconds/3600, 8), 0)
    ot  = max((e-we).seconds/3600, 0) if e > we else 0
    mid = max((e-ms).seconds/3600, 0) if e > ms else 0
    hol = (e-s).seconds/3600 - 1 if row["日付"].weekday()>=5 else 0
    return pd.Series({"所定内":round(reg,2),"残業":round(ot,2),
                       "深夜残業":round(mid,2),"休日出勤":round(max(hol,0),2)})

df = pd.concat([df, df.apply(calc,axis=1)], axis=1)
summary = df.groupby(["社員番号","氏名","部門"]).agg(
    {"所定内":"sum","残業":"sum","深夜残業":"sum","休日出勤":"sum"}).reset_index()
print(summary.head())
✅ 実行結果

打刻データから所定内・残業・深夜残業・休日出勤が自動計算されました。30名分の月次集計が数秒で完了しています。

実行結果

STEP 2:36協定アラートを自動生成する

残業時間が36協定の上限に近づいている社員を自動検出してExcelに色付けします。

💬 私はClaude Codeにこう頼みました:残業集計結果から36協定アラートを自動生成してください。
月45時間超→要注意(黄)、月60時間超→危険(赤)、年360時間超→法違反リスク(赤太字)
🤖 Claude Codeの回答:36協定アラートの判定と色分けExcel出力を実装しました。
import openpyxl
from openpyxl.styles import PatternFill, Font

wb = openpyxl.Workbook(); ws = wb.active; ws.title = "勤怠集計"
red_f=PatternFill("solid",fgColor="FFCDD2"); yel_f=PatternFill("solid",fgColor="FFF9C4")
hdrs=["社員番号","氏名","部門","所定内","残業","深夜","休日","合計残業","年間","36協定"]
for c,h in enumerate(hdrs,1):
    cell=ws.cell(1,c,h); cell.font=Font(bold=True,color="FFFFFF")
    cell.fill=PatternFill("solid",fgColor="107C41")

for ri, row in enumerate(summary.itertuples(), 2):
    total_ot = row.残業 + row.深夜残業 + row.休日出勤
    annual   = 0  # 年間集計は別途取得
    if annual > 360: alert,fill,f = "法違反リスク",red_f,Font(color="B71C1C",bold=True)
    elif total_ot > 60: alert,fill,f = "危険",red_f,Font(color="B71C1C")
    elif total_ot > 45: alert,fill,f = "要注意",yel_f,Font(color="E65100")
    else:               alert,fill,f = "正常",None,Font()
    vals=[row.社員番号,row.氏名,row.部門,row.所定内,row.残業,row.深夜残業,row.休日出勤,total_ot,annual,alert]
    for ci,v in enumerate(vals,1):
        c=ws.cell(ri,ci,v)
        if fill: c.fill=fill; c.font=f

wb.save("attendance_report.xlsx"); print("勤怠レポート出力完了")
✅ 実行結果

36協定アラートが自動生成されました。月60時間超が赤、45時間超が黄色で色分け表示されています。

STEP 3:マネージャーに自動アラートメールを送信する

残業過多の社員がいる部門マネージャーに自動でメール通知を送ります。

💬 私はClaude Codeにこう頼みました:残業45時間超の社員がいる部門マネージャーに自動メールを送ってください。
「来月の残業削減計画を提出してください」という内容で。
🤖 Claude Codeの回答:マネージャー自動通知メールのスクリプトを作成しました。
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

MGR = {"営業部":"sales-mgr@co.jp","開発部":"dev-mgr@co.jp"}

def send_ot_alert(dept, staff_list):
    rows = "".join(f"{s['氏名']}{s['残業']:.1f}h" for s in staff_list)
    html = (f"

【勤怠アラート】{dept}

" f"

以下のメンバーの残業が月45時間を超えました。来月の削減計画を提出してください。

" f"{rows}
氏名残業時間
") msg = MIMEMultipart("alternative") msg["Subject"] = f"【勤怠アラート】{dept} 残業超過通知" msg["From"]="hr@co.jp"; msg["To"]=MGR.get(dept,"") msg.attach(MIMEText(html,"html","utf-8")) with smtplib.SMTP("smtp.office365.com",587) as sv: sv.starttls(); sv.login("hr@co.jp","PW"); sv.send_message(msg) print(f"送信: {dept}") for dept, grp in summary.groupby("部門"): over = grp[grp["残業"]>45] if not over.empty: send_ot_alert(dept, over.to_dict("records"))
✅ 実行結果

残業時間超過の部門マネージャーに自動でアラートメールが送信されました。削減計画提出を促す文面が自動生成されています。

STEP 4:給与計算用CSVを自動出力する

勤怠集計結果を給与計算システムの入力フォーマットに自動変換します。

💬 私はClaude Codeにこう頼みました:勤怠集計結果を給与計算システム用CSVに変換してください。
「社員番号,所定内時間,残業時間,深夜残業,休日出勤」のフォーマットです。
🤖 Claude Codeの回答:給与計算システム用CSVの自動出力を実装しました。
from datetime import datetime

def export_payroll(summary_df, out):
    prl = summary_df[["社員番号","所定内","残業","深夜残業","休日出勤"]].copy()
    prl.columns = ["EMP_ID","REGULAR_H","OT_H","MIDNIGHT_H","HOLIDAY_H"]
    # 時間→分に変換(給与システム仕様)
    for c in ["REGULAR_H","OT_H","MIDNIGHT_H","HOLIDAY_H"]:
        prl[c] = (prl[c]*60).astype(int)
    prl.to_csv(out, index=False, encoding="utf-8-sig")
    print(f"給与CSV出力: {out} ({len(prl)}名)")

export_payroll(summary, f"payroll_{datetime.now():%Y%m}.csv")
✅ 実行結果

給与計算システムへの入力用CSVが自動生成されました。30名分のデータが数秒で出力され、そのまま給与システムにインポートできます。

STEP 5:毎月1日に全処理を自動実行する

毎月1日の朝8時に前月の勤怠集計が自動完了している状態を実現します。

💬 私はClaude Codeにこう頼みました:毎月1日朝8時に前月の勤怠集計を自動実行して、人事部長と各マネージャーにレポートをメール送信する月次自動化を設定してください。
🤖 Claude Codeの回答:月次自動実行スクリプトとスケジューラー設定を作成しました。
from datetime import date, timedelta
import calendar

def monthly_kintai_job():
    today = date.today()
    if today.day != 1: return  # 毎月1日のみ実行
    prev = (today - timedelta(days=1)).strftime("%Y%m")
    print(f"勤怠月次集計: {prev}")
    df = pd.read_csv(f"kintai_{prev}.csv", parse_dates=["日付"])
    df = pd.concat([df, df.apply(calc, axis=1)], axis=1)
    summary = df.groupby(["社員番号","氏名","部門"]).sum().reset_index()
    wb = openpyxl.Workbook()
    # ... レポート生成・メール送信
    export_payroll(summary, f"payroll_{prev}.csv")
    print(f"完了: {today}")

monthly_kintai_job()
# schtasks /create /tn "月次勤怠" /tr "python kintai_auto.py" /sc DAILY /st 08:00 /f
✅ 実行結果

月次勤怠処理が完全自動化されました。毎月1日朝8時に前月集計が自動完了し、給与CSVと勤怠レポートが自動配信されます。

どんな現場で使われているか:活用シナリオ

対象者 導入前の課題 Claude Code導入後
人事担当者 毎月末に100名分の勤怠データを手動集計して3時間を消費 CSV置くだけで勤務時間・残業・有休を自動集計して完了
部門マネージャー 36協定の残業上限を手動でチェックして上長に報告 上限超過者を自動検出してメール通知が届くのを待つだけ
給与計算担当 勤怠集計から給与計算システムへの手入力に1日かかる 給与計算用CSVを自動生成してシステムにインポートするだけ

実装で押さえるべき重要ポイント

  • 1
    打刻の揺れを吸収する前処理:打刻データは秒単位の誤差や記録漏れが発生しやすいです。Claude Codeに丸め処理・異常値チェック・欠損補完のロジックを組み込んでもらいましょう。
  • 2
    部署・雇用形態ごとのルール管理:アルバイト・正社員・契約社員で残業計算ルールが異なります。設定ファイル(JSON/Excel)にルールを外出しすることで、法改正時の変更が簡単になります。
  • 3
    給与計算システムの出力形式を事前確認:導入している給与計算システム(弥生給与・freee・KING OF TIME等)のCSVインポート仕様を先に確認して、出力フォーマットをその仕様に合わせます。

ビジネスインパクト

3時間→15分
月次集計時間
100%自動
36協定チェック
翌営業日
給与CSV出力タイミング

この記事のまとめ

  • ✅ 打刻CSVから勤務時間・残業時間・有休消化を自動集計できる
  • ✅ 36協定の残業上限を自動チェックして超過時にメールアラートを送信できる
  • ✅ 給与計算システム向けCSVを自動出力してインポート作業をゼロにできる
  • ✅ 毎月1日のスケジュール実行で集計から通知まで完全自動化できる


よくある質問(FAQ)

A. CSV・Excel形式でエクスポートできるシステムであれば連携可能です。勤怠奉行・freee HR・KING OF TIMEなどの主要システムはCSV出力に対応しています。CSVのフォーマットをClaude Codeに読み込ませるだけで対応したスクリプトを自動生成します。

A. 月45時間・年360時間・特別条項の上限を計算式で正確にチェックします。ただし法律改正や個社の協定内容に応じてしきい値の設定が必要です。変形労働時間制など複雑なケースも設定ファイルで対応できます。

A. はい、Excelの部門マスタからメールアドレスを自動取得して、部門別に送信先を設定できます。CC・BCCの指定や、上限の80%に達した時点での事前警告メールなど、細かな送信ルールもカスタマイズできます。

⏰ この自動化を活用している業種・ケース

製造業・工場では、シフト制勤務の複雑な残業計算をスクリプトで自動化して、36協定違反を未然に防ぐ仕組みを構築しています。
小売・サービス業では、アルバイト・パートが多い環境でも、CSVから自動集計して給与計算ミスをゼロにしています。
医療・介護業界では、夜勤・早番・遅番など複雑なシフトの労働時間管理を自動化して、人事担当者の負担を大幅に軽減しています。
建設・工事業では、現場単位の勤務時間管理と残業アラートを組み合わせて、工期管理と労務管理を連動させています。
勤怠管理の自動化は労務リスクの軽減と人事部門の生産性向上に直結します。

関連記事


制作実績サンプル

このクオリティの資料が、あなたの業務でも作れます

Aurant Technologies が実際に制作したコンサルティング資料(全82枚)のサンプルです。Claude Code × AI自動化により、従来の1/5のコスト・時間で同等品質を実現します。

タイトルスライド

タイトル・ダーク背景
3カラム分析

3カラム比較・分析
AI活用フロー

AI活用フロー図解
Before/After

Before/After比較
RFPテンプレート

構造化コンテンツ
全10枚を
見る

御社のテーマでこのレベルの資料を作成できます
制作費・納期・自動化プランは無料相談でご確認いただけます

📊 サンプル全10枚を見る →

Claude Codeの導入を、プロに任せてみませんか?

Aurant TechnologiesはClaude Code導入支援・業務自動化の専門チームです。
初回相談は無料。御社の課題をヒアリングして最適な自動化プランをご提案します。

無料相談を申し込む →


AT
aurant technologies 編集

上場企業からスタートアップまで、数多くのデータ分析基盤構築・AI導入プロジェクトを主導。単なる技術提供にとどまらず、MA/CRM(Salesforce, Hubspot, kintone, LINE)導入によるマーケティング最適化やバックオフィス業務の自動化など、常に「事業数値(売上・利益)」に直結する改善実績多数。

この記事が役に立ったらシェア: