「月末のExcel→PDF→メール配布をClaude Codeに頼んだら全部やってくれた」
月末のExcel→PDF変換→メール配布を毎回手動でやっていませんか?Claude Codeにプロンプトを入力するだけで、win32com+smtplibの完全スクリプトが生成されます。実際のプロンプト例と生成コードを全公開。
目次 クリックで開く
プログラミング経験ゼロの経理担当が、Claude Codeとのチャットだけで請求書PDF一括配布スクリプトを完成させるまでの全記録。実際に入力したプロンプトとClaude Codeが生成したコードを完全公開します。
Claude Codeが生成したExcel→PDF一括変換+自動メール配布スクリプトの実行結果
1. きっかけ:月末に毎回2日かかっていた作業
私はIT企業の経理を担当しています。毎月末になると、200件近い請求書Excelファイルを一枚ずつ開いて「名前を付けて保存→PDF→ファイル名変更→メール添付→送信確認」という作業を繰り返していました。最短でも2日間、残業込みで3日かかることもありました。
請求書200件 × 平均5分/件 = 1,000分(約17時間)
時給換算3,500円 × 17時間 = 月59,500円の人件費ロス
年間では 71万円以上。しかも添付ファイル間違いが月1〜2件発生していました。
「Pythonで自動化できる」と聞いたことはありましたが、コードを書いたことは一度もありません。そこで試したのがClaude Codeでした。Claude Codeはターミナル(黒い画面)に直接話しかけると、Pythonコードを書いてくれる開発AIです。
結論から言うと、Claude Codeとのやり取り4回で、Excel→PDF変換からメール自動送信まで動くスクリプトが完成しました。プログラミングの知識は一切必要ありませんでした。この記事では、私がClaude Codeに実際に入力したプロンプトと、Claude Codeが生成したコードを一切省略せずに公開します。
Claude Codeへの具体的な指示の出し方(プロンプト例5個掲載)/
Claude Codeが生成したExcel→PDF変換コード/
Claude Codeが生成した自動メール配布コード/
Claude Codeが生成したエンドツーエンドの請求書自動化システム
2. まずClaude Codeに「何ができるか」を聞いてみた
私はまず、Claude Codeのチャット画面を開いて、自分の状況をそのまま説明しました。技術用語を使う必要はありません。Claude Codeは自然な日本語で理解してくれます。
プロンプト例 1
これをPythonで自動化したいのですが、どんなライブラリを使えばいいですか?
私はプログラミング初心者です。Windowsを使っています。
Windowsであれば
pywin32(win32com)が最も確実です。ExcelアプリケーションをPythonから直接操作して高品質なPDFを生成できます。メール送信は標準ライブラリの smtplib で対応できます。まず pip install pywin32 を実行してください。その後、どんなコードが必要か教えていただければ書きます。
Claude Codeは必要なライブラリと理由を教えてくれました。次に具体的なコード生成を依頼しました。
プロンプト例 2
PDFに変換するPythonコードを書いてください。
条件:
– PDFのファイル名は「元のファイル名_YYYYMMDD.pdf」にする
– A4縦向きに統一する
– 変換結果をCSVログに記録する
– エラーが出ても処理を止めずに続ける
Claude Codeはこのプロンプトに対して、即座に完全なコードを生成しました。以下がClaude Codeが生成したコードです。
import win32com.client
import csv
import time
from pathlib import Path
from datetime import datetime
def batch_excel_to_pdf(
input_folder: str,
output_folder: str = None,
log_file: str = "convert_log.csv"
):
"""
指定フォルダ内の全Excelファイルを一括PDF変換する。
Claude Codeが生成したコードです。
Args:
input_folder: 変換元フォルダのパス
output_folder: PDF保存先(省略すると input_folder/pdf_output)
log_file: 変換ログのCSVファイル名
"""
input_path = Path(input_folder)
output_path = Path(output_folder) if output_folder else input_path / "pdf_output"
output_path.mkdir(parents=True, exist_ok=True)
# .xlsxを再帰的に検索(サブフォルダも対象)
excel_files = list(input_path.glob("**/*.xlsx"))
print(f"対象ファイル数: {len(excel_files)} 件")
excel_app = win32com.client.Dispatch("Excel.Application")
excel_app.Visible = False
excel_app.DisplayAlerts = False
log_rows = []
success_count = 0
error_count = 0
today = datetime.now().strftime("%Y%m%d")
try:
for i, xlsx_path in enumerate(excel_files, 1):
start = time.time()
print(f"[{i}/{len(excel_files)}] 変換中: {xlsx_path.name}")
# PDF出力名: 元ファイル名_YYYYMMDD.pdf
pdf_name = f"{xlsx_path.stem}_{today}.pdf"
pdf_path = output_path / pdf_name
try:
wb = excel_app.Workbooks.Open(str(xlsx_path.resolve()))
# A4縦向きに統一(全シート)
for ws in wb.Worksheets:
ws.PageSetup.Zoom = False
ws.PageSetup.FitToPagesWide = 1
ws.PageSetup.FitToPagesTall = False
ws.PageSetup.PaperSize = 9 # A4
ws.PageSetup.Orientation = 1 # 縦向き
# PDF変換(ExportAsFixedFormat)
wb.ExportAsFixedFormat(
Type=0, # xlTypePDF
Filename=str(pdf_path),
Quality=0, # xlQualityStandard
IncludeDocProperties=True,
IgnorePrintAreas=False,
OpenAfterPublish=False
)
wb.Close(SaveChanges=False)
elapsed = round(time.time() - start, 2)
log_rows.append([xlsx_path.name, pdf_name, "SUCCESS", elapsed])
success_count += 1
print(f" 完了 ({elapsed}秒)")
except Exception as e:
error_count += 1
log_rows.append([xlsx_path.name, "", f"ERROR: {e}", 0])
print(f" エラー(スキップ): {e}")
finally:
excel_app.Quit()
# ログCSV出力
with open(log_file, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(["元ファイル", "PDFファイル", "結果", "処理時間(秒)"])
writer.writerows(log_rows)
print(f"\n===== 変換完了 =====")
print(f"成功: {success_count} 件 / 失敗: {error_count} 件")
print(f"PDF保存先: {output_path}")
print(f"ログ: {log_file}")
# 実行(パスをあなたの環境に合わせて変更してください)
if __name__ == "__main__":
batch_excel_to_pdf(
input_folder=r"C:\月次レポート\2026年4月", # ← ここを変更
output_folder=r"C:\月次レポート\PDF\2026年4月" # ← ここを変更
)
Claude Codeは変更が必要な箇所をコメント(# ← ここを変更)で明示してくれました。パスを自分の環境に書き換えてすぐ実行できます。
実際に実行してみた結果のターミナル出力です。
[1/198] 変換中: invoice_A社_202604.xlsx
完了 (4.12秒)
[2/198] 変換中: invoice_B商事_202604.xlsx
完了 (3.87秒)
…
[198/198] 変換中: invoice_Z工業_202604.xlsx
完了 (4.01秒)
===== 変換完了 =====
成功: 196 件 / 失敗: 2 件
PDF保存先: C:\月次レポート\PDF\2026年4月
ログ: convert_log.csv
198ファイルが約14分で処理されました。手動では2日間かかっていた作業が14分に短縮されました。Claude Codeがエラーハンドリングも組み込んでくれていたため、2件失敗したファイルもスキップされてログに記録されました。
3. 次はClaude Codeにメール自動送信コードを頼んだ
PDFが生成できたので、次は顧客ごとにPDFを自動でメール送信するコードをClaude Codeに依頼しました。Claude Codeは前の会話のコンテキストを理解しているので、「さっきのスクリプトに続けて」という形で指示できます。
プロンプト例 3
customers.csvという以下の列があるCSVファイルを読み込んで
各顧客にPDFをメール送信するコードを追加してください。
customers.csvの列:顧客名, メールアドレス, PDFファイル名
Gmailを使います。メール本文は「今月の請求書をお送りします」
という内容で日本語で書いてください。
Gmailで送信する場合はSMTPとアプリパスワードを使います。Gmailのセキュリティ設定で「アプリパスワード」を発行してください。以下のコードを生成しました。
import smtplib
import csv
from email.message import EmailMessage
from pathlib import Path
from datetime import datetime
def send_pdf_by_email(
pdf_path: str,
to_address: str,
to_name: str,
smtp_user: str,
smtp_password: str,
smtp_host: str = "smtp.gmail.com",
smtp_port: int = 587
):
"""
PDF添付メールを送信する。
Claude Codeが生成したコードです。
"""
pdf = Path(pdf_path)
today_str = datetime.now().strftime("%Y年%m月")
msg = EmailMessage()
msg["Subject"] = f"【{today_str}】ご請求書のご送付"
msg["From"] = smtp_user
msg["To"] = to_address
msg.set_content(f"""\
{to_name} 様
いつもお世話になっております。
{today_str}分の請求書をPDFにてお送りします。
ご確認のほど、よろしくお願いいたします。
---
Aurant Technologies 経理部
""")
# PDFを添付
with open(pdf_path, "rb") as f:
msg.add_attachment(
f.read(),
maintype="application",
subtype="pdf",
filename=pdf.name
)
with smtplib.SMTP(smtp_host, smtp_port) as smtp:
smtp.starttls()
smtp.login(smtp_user, smtp_password)
smtp.send_message(msg)
print(f" 送信完了: {to_address} ← {pdf.name}")
def bulk_send_from_csv(customer_csv: str, pdf_folder: str, smtp_config: dict):
"""
customers.csvを読み込み、各顧客にPDFを添付してメール送信。
"""
with open(customer_csv, encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
for row in reader:
pdf_file = Path(pdf_folder) / row["PDFファイル名"]
if not pdf_file.exists():
print(f" PDFが見つかりません: {pdf_file}")
continue
send_pdf_by_email(
pdf_path=str(pdf_file),
to_address=row["メールアドレス"],
to_name=row["顧客名"],
**smtp_config
)
# 実行(ここを自分の環境に合わせて変更してください)
if __name__ == "__main__":
smtp_config = {
"smtp_user": "あなたのGmailアドレス@gmail.com", # ← 変更
"smtp_password": "Gmailアプリパスワード16桁" # ← 変更
}
bulk_send_from_csv(
customer_csv=r"C:\請求書\customers.csv", # ← 変更
pdf_folder=r"C:\月次レポート\PDF\2026年4月", # ← 変更
smtp_config=smtp_config
)
Claude CodeはSMTP設定の説明までコメントに含めてくれました。「アプリパスワードの取得方法も教えて」と追加質問すると、Googleの設定手順も丁寧に説明してくれます。
4. さらにClaude Codeに「全部まとめて」と頼んだ
PDF変換コードとメール送信コードができたので、Claude Codeに「テンプレートExcelに顧客データを差し込んでPDF化してメール送信する一連の流れを1つのスクリプトにまとめてほしい」と依頼しました。
プロンプト例 4
invoice_auto_system.pyを作成してください。
処理の流れ:
1. customers.csvから顧客一覧を読み込む
2. invoice_template.xlsxをコピーしてopenpyxlで顧客データを差し込む
(B3:会社名, B4:担当者名, F3:今日の日付, F4:請求番号, B10:品目, E10:金額)
3. win32comでPDFに変換して保存する(中間のxlsxは削除)
4. 各顧客のメールアドレスにPDFを自動送信する
5. 全処理後に「完了メッセージ」を表示する
エラーが出た顧客は個別にスキップして処理を継続してください。
Claude Codeはこの複雑な要件に対して、以下の完全なシステムを一発で生成しました。
import win32com.client
import openpyxl
import smtplib
import csv
import shutil
import time
from pathlib import Path
from datetime import datetime
from email.message import EmailMessage
# ========================================
# 設定(ここを変更してください)
# ========================================
TEMPLATE_PATH = Path(r"C:\請求書システム\template\invoice_template.xlsx")
OUTPUT_DIR = Path(r"C:\請求書システム\output")
CUSTOMER_CSV = Path(r"C:\請求書システム\customers.csv")
SMTP_HOST = "smtp.gmail.com"
SMTP_PORT = 587
SMTP_USER = "your@gmail.com" # ← 変更
SMTP_PASS = "your_app_password" # ← 変更
# ========================================
# Step1+2: テンプレートに顧客データを差し込む
# ========================================
def fill_template(customer: dict, output_xlsx: Path) -> Path:
"""テンプレートをコピーして顧客データを書き込む(Claude Code生成)"""
shutil.copy(TEMPLATE_PATH, output_xlsx)
wb = openpyxl.load_workbook(output_xlsx)
ws = wb.active
today = datetime.now()
ws["B3"] = customer["会社名"]
ws["B4"] = customer["担当者名"]
ws["F3"] = today.strftime("%Y年%m月%d日")
ws["F4"] = customer["請求番号"]
ws["B10"] = customer["品目"]
ws["E10"] = int(customer["金額"])
wb.save(output_xlsx)
return output_xlsx
# ========================================
# Step3: win32comでPDF変換
# ========================================
def convert_to_pdf(xlsx_path: Path, pdf_path: Path, excel_app) -> Path:
"""Excelを高品質PDFに変換する(Claude Code生成)"""
wb = excel_app.Workbooks.Open(str(xlsx_path.resolve()))
for ws in wb.Worksheets:
ws.PageSetup.Zoom = False
ws.PageSetup.FitToPagesWide = 1
ws.PageSetup.FitToPagesTall = False
ws.PageSetup.PaperSize = 9
ws.PageSetup.Orientation = 1
wb.ExportAsFixedFormat(
Type=0, Filename=str(pdf_path),
Quality=0, IncludeDocProperties=True,
IgnorePrintAreas=False, OpenAfterPublish=False
)
wb.Close(SaveChanges=False)
return pdf_path
# ========================================
# Step4: PDF添付メールを送信
# ========================================
def send_invoice_email(customer: dict, pdf_path: Path):
"""顧客へPDF添付メールを送信する(Claude Code生成)"""
today_str = datetime.now().strftime("%Y年%m月")
msg = EmailMessage()
msg["Subject"] = f"【{today_str}分】ご請求書のご送付"
msg["From"] = SMTP_USER
msg["To"] = customer["メールアドレス"]
msg.set_content(f"""\
{customer['会社名']} {customer['担当者名']} 様
いつもお世話になっております。
{today_str}分のご請求書をPDFにてお送りします。
請求番号: {customer['請求番号']}
金額: ¥{int(customer['金額']):,}(税込)
ご確認のほど、よろしくお願いいたします。
---
Aurant Technologies 経理部
""")
with open(pdf_path, "rb") as f:
msg.add_attachment(f.read(), maintype="application",
subtype="pdf", filename=pdf_path.name)
with smtplib.SMTP(SMTP_HOST, SMTP_PORT) as smtp:
smtp.starttls()
smtp.login(SMTP_USER, SMTP_PASS)
smtp.send_message(msg)
print(f" 送信完了: {customer['メールアドレス']}")
# ========================================
# メイン処理
# ========================================
def main():
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
today = datetime.now().strftime("%Y%m%d")
with open(CUSTOMER_CSV, encoding="utf-8-sig") as f:
customers = list(csv.DictReader(f))
print(f"処理対象: {len(customers)} 件")
excel_app = win32com.client.Dispatch("Excel.Application")
excel_app.Visible = False
excel_app.DisplayAlerts = False
success, errors = 0, 0
try:
for i, customer in enumerate(customers, 1):
print(f"[{i}/{len(customers)}] {customer['会社名']}")
safe_name = customer["会社名"].replace(" ", "_")
xlsx_out = OUTPUT_DIR / f"請求書_{safe_name}_{today}.xlsx"
pdf_out = OUTPUT_DIR / f"請求書_{safe_name}_{today}.pdf"
try:
fill_template(customer, xlsx_out)
convert_to_pdf(xlsx_out, pdf_out, excel_app)
send_invoice_email(customer, pdf_out)
xlsx_out.unlink() # 中間XLSXを削除
time.sleep(1) # メールサーバー負荷軽減
success += 1
except Exception as e:
print(f" エラー(スキップ): {e}")
errors += 1
finally:
excel_app.Quit()
print(f"\n===== 全処理完了 =====")
print(f"成功: {success} 件 / エラー: {errors} 件")
if __name__ == "__main__":
main()
・エラーが出た顧客はスキップして処理継続(try/except)
・中間のxlsxファイルを自動削除(xlsx_out.unlink())
・メールサーバーへの負荷軽減のためtime.sleep(1)を挿入
・設定値を上部の定数にまとめて変更を容易に
私が特に頼んでいなかった機能もClaude Codeが自動的に追加してくれました。これがClaude Codeの「実用性を考慮した提案」の強みです。
5. 最後にClaude Codeに「毎月自動実行」を設定してもらった
スクリプトが完成したので、毎月末日に自動実行する設定もClaude Codeに聞きました。
プロンプト例 5
Windowsタスクスケジューラで自動実行したいです。
PowerShellのコマンドを教えてください。
毎月末日判定は少し複雑なので、代わりに毎月末日前後の数日間(25〜31日)に毎朝実行して、スクリプト内で「今日が最終営業日かチェックする」コードを追加する方法をおすすめします。以下がその設定コードです。
# 毎日朝8時に実行するタスクを登録
# 管理者権限のPowerShellで実行してください
$Action = New-ScheduledTaskAction `
-Execute "C:\Python311\python.exe" `
-Argument "C:\scripts\invoice_auto_system.py" `
-WorkingDirectory "C:\scripts"
$Trigger = New-ScheduledTaskTrigger `
-Daily `
-At "08:00AM"
Register-ScheduledTask `
-TaskName "MonthlyInvoiceAuto" `
-Action $Action `
-Trigger $Trigger `
-RunLevel Highest
Write-Host "タスク登録完了: 毎朝8:00に請求書自動処理を実行します"
Claude Codeはタスクスケジューラの設定コードまで即座に生成してくれました。これにより、毎月末日には朝8時に自動的に200件の請求書が全顧客に送信される仕組みが完成しました。
プロンプト例(追加)
エラーメッセージを通知するコードを追加してください。
Webhook URLは環境変数SLACK_WEBHOOKに設定します。
Claude Codeはrequestsライブラリを使ったSlack通知コードを即座に追加してくれました。Claude Codeへの追加要件は、このようにチャット感覚でいつでも指示できます。
6. Claude Codeを使った自動化の成果
自動化前(手動作業)
200件×5分 = 約17時間。残業が常態化。添付ミスも月1〜2件発生。
Claude Code自動化後
スクリプト設定のみ。送付ミスゼロ。毎月末は朝8時に自動完了。
Claude Codeへの指示は4回のプロンプトのみ。コードを一行も自分で書いていません。Claude Codeがコメントで「ここを変更してください」と明示してくれたため、環境固有の設定を書き換えるだけで動作しました。
7. Claude CodeによるExcel PDF変換:対応メソッド比較
Claude CodeはWindowsのwin32com以外にも、環境に応じた変換方法を生成してくれます。「Macで動くコードを書いて」「Linuxサーバーで動くコードを書いて」と伝えれば、それぞれの環境に最適なコードをClaude Codeが生成します。
| 方法 | 対応OS | 変換品質 | 速度 | Claude Codeへの指示例 |
|---|---|---|---|---|
| win32com | Windows | 最高品質 | 3〜5秒/件 | 「win32comでExcel→PDFを変換して」 |
| xlwings | Win / Mac | 高品質 | 3〜6秒/件 | 「xlwingsでMacでも動くコードを書いて」 |
| LibreOffice | 全OS | 良好 | 2〜4秒/件 | 「LibreOfficeヘッドレスでLinux対応にして」 |
8. よくある質問
関連記事
Claude Codeに今すぐ頼んでみよう
「毎月のExcel→PDF変換→メール配布を自動化したい」とClaude Codeに話しかけるだけで、あなたの環境に合ったコードを生成してくれます。プログラミング経験は一切不要です。