結論:毎月1時間かかっていた請求書作業が5分になった
先に結論から書きます。
Claude CodeとPythonを組み合わせると、毎月繰り返す請求書・見積書の作成・PDF化・メール送付を完全に自動化できます。
フリーランスや個人事業主が毎月必ずやらなければいけない「請求書作業」は、単純作業の繰り返しです。同じフォーマットに今月の金額・日付・案件名を入力してPDFに変換してメールで送る。この作業にAIは向いていません——AIが向いているのは、この仕組みを「一度作ってしまえば永遠に使い回せるコード」に変換することです。
私が実際にこのシステムを作った結果、毎月3〜5社への請求書送付が5分の確認作業(Pythonスクリプトの実行と内容確認)に圧縮されました。
システムの全体構成
Googleスプレッドシート(案件・金額管理)
↓ Python(gspread)で読み込み
Claude API(請求書本文・件名を生成)
↓
ReportLab(請求書PDF生成)
↓
Gmail API(PDF添付でメール送信)
↓
請求書フォルダに自動保存(YYYY-MM/得意先名/)
ステップ1:案件管理スプレッドシートの準備
Googleスプレッドシートに以下の列を用意します。
| 得意先名 | 案件名 | 金額(税抜) | 送付先メール | 請求月 | 送付済み |
|---|---|---|---|---|---|
| 株式会社○○ | Webサイト制作費 | 200000 | billing@xxx.co.jp | 2026-05 | |
| 個人 田中様 | コンサルティング料 | 50000 | tanaka@gmail.com | 2026-05 |
「送付済み」列を使って、スクリプトが実行済み請求書を再送しないようにします。
ステップ2:Pythonスクリプトの全体像
import gspread
from google.oauth2.service_account import Credentials
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import anthropic
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import encoders
from datetime import datetime, date
from pathlib import Path
import os
# 設定
SPREADSHEET_ID = "YOUR_SPREADSHEET_ID"
SENDER_EMAIL = "your@gmail.com"
SENDER_NAME = "ムカイ / AI時間"
INVOICE_DIR = Path("~/invoices").expanduser()
# フォント登録(日本語対応)
pdfmetrics.registerFont(TTFont("Gothic", "C:/Windows/Fonts/meiryo.ttc"))
claude = anthropic.Anthropic()
ステップ3:請求書PDFの生成
def generate_invoice_pdf(client: str, project: str, amount: int, invoice_no: str) -> Path:
"""ReportLabで請求書PDFを生成する"""
today = date.today()
due = today.replace(month=today.month + 1, day=25) if today.month < 12 else \
today.replace(year=today.year + 1, month=1, day=25)
tax = int(amount * 0.1)
total = amount + tax
out_dir = INVOICE_DIR / today.strftime("%Y-%m") / client
out_dir.mkdir(parents=True, exist_ok=True)
out_path = out_dir / f"{invoice_no}_{client}_請求書.pdf"
c = canvas.Canvas(str(out_path), pagesize=A4)
w, h = A4
c.setFont("Gothic", 20)
c.drawCentredString(w / 2, h - 80, "請 求 書")
c.setFont("Gothic", 11)
c.drawString(50, h - 130, f"{client} 御中")
c.drawString(350, h - 130, f"発行日:{today.strftime('%Y年%m月%d日')}")
c.drawString(350, h - 150, f"請求書番号:{invoice_no}")
c.drawString(350, h - 170, f"振込期限:{due.strftime('%Y年%m月%d日')}")
c.setFont("Gothic", 10)
c.drawString(50, h - 210, "下記の通りご請求申し上げます。")
# 明細テーブル
y = h - 260
c.setFont("Gothic", 10)
headers = ["件名", "金額(税抜)", "消費税(10%)", "合計(税込)"]
cols = [50, 280, 380, 450]
for i, header in enumerate(headers):
c.drawString(cols[i], y, header)
y -= 20
c.line(50, y, w - 50, y)
y -= 15
c.drawString(cols[0], y, project)
c.drawString(cols[1], y, f"¥{amount:,}")
c.drawString(cols[2], y, f"¥{tax:,}")
c.drawString(cols[3], y, f"¥{total:,}")
y -= 40
c.setFont("Gothic", 12)
c.drawString(350, y, f"ご請求金額合計:¥{total:,}(税込)")
# 振込先
y -= 80
c.setFont("Gothic", 10)
c.drawString(50, y, "【振込先】")
c.drawString(50, y - 15, "○○銀行 △△支店 普通 1234567")
c.drawString(50, y - 30, "口座名義:ムカイ ケイイチ")
c.save()
return out_path
ステップ4:Claudeでメール本文を自動生成
毎回同じメール文面でも問題ありませんが、Claudeを使うと案件ごとに自然な文体に変化させられます。
def generate_email_body(client: str, project: str, amount: int) -> str:
"""Claudeで請求メールの本文を生成する"""
total = int(amount * 1.1)
prompt = f"""
以下の情報をもとに、個人事業主から法人クライアントへ送る請求メールの本文を生成してください。
丁寧でプロフェッショナルな文体で、200文字以内にまとめてください。
得意先: {client}
案件名: {project}
請求金額: {total:,}円(税込)
振込期限: 翌月25日
メール本文のみを出力してください。件名は含めないでください。
"""
response = claude.messages.create(
model="claude-sonnet-4-6",
max_tokens=300,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
ステップ5:Gmail APIでPDF添付メールを送信
def send_invoice_email(to: str, client: str, project: str,
amount: int, pdf_path: Path, body: str):
"""GmailでPDF添付メールを送信する"""
total = int(amount * 1.1)
subject = f"【請求書送付】{project}のご請求 ¥{total:,}(税込)"
msg = MIMEMultipart()
msg["From"] = f"{SENDER_NAME} <{SENDER_EMAIL}>"
msg["To"] = to
msg["Subject"] = subject
msg.attach(MIMEText(body, "plain", "utf-8"))
with open(pdf_path, "rb") as f:
part = MIMEBase("application", "octet-stream")
part.set_payload(f.read())
encoders.encode_base64(part)
part.add_header("Content-Disposition", f'attachment; filename="{pdf_path.name}"')
msg.attach(part)
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login(SENDER_EMAIL, os.environ["GMAIL_APP_PASSWORD"])
server.sendmail(SENDER_EMAIL, to, msg.as_string())
ステップ6:スプレッドシートを読み込んで全件処理
def run_monthly_invoicing():
"""当月分の未送付請求書を一括処理する"""
creds = Credentials.from_service_account_file("credentials.json",
scopes=["https://spreadsheets.google.com/feeds",
"https://www.googleapis.com/auth/drive"])
gc = gspread.authorize(creds)
sheet = gc.open_by_key(SPREADSHEET_ID).sheet1
rows = sheet.get_all_records()
today = date.today()
month = today.strftime("%Y-%m")
for i, row in enumerate(rows, start=2): # 行番号は2始まり
if row["請求月"] != month or row["送付済み"]:
continue
client = row["得意先名"]
project = row["案件名"]
amount = int(row["金額(税抜)"])
to = row["送付先メール"]
inv_no = f"INV-{month}-{i:03d}"
print(f"処理中: {client} / {project}")
pdf_path = generate_invoice_pdf(client, project, amount, inv_no)
body = generate_email_body(client, project, amount)
send_invoice_email(to, client, project, amount, pdf_path, body)
sheet.update_cell(i, 6, "✓") # 送付済みにマーク
print(f" → 送付完了: {to}")
if __name__ == "__main__":
run_monthly_invoicing()
運用ルール:月初に1回実行するだけ
このスクリプトを毎月1日の朝にWindows タスクスケジューラ(またはcron)で自動実行するように設定すると、請求書作業が完全に無人化されます。
タスク名: 月次請求書送付
実行日時: 毎月1日 9:00
実行コマンド: python D:/scripts/monthly_invoicing.py
確認するのは「スプレッドシートの送付済み列が✓になっているか」だけ。問題があればその場で再実行します。
よくある質問
Q: Gmail App Passwordはどこで取得しますか?
Googleアカウント → セキュリティ → 2段階認証(有効化必須)→ アプリパスワード で発行できます。GMAIL_APP_PASSWORD 環境変数に設定してください。
Q: ReportLabで日本語が文字化けします
游明朝やメイリオなど、TrueType形式(.ttc)の日本語フォントを pdfmetrics.registerFont で登録する必要があります。ファイルパスはWindows環境であれば C:/Windows/Fonts/ 以下にあります。
Q: freeeとの使い分けはどうすればいいですか?
このスクリプトは「請求書の送付フロー」に特化しています。発行した請求書の入金管理・仕訳・確定申告はこれまで通りfreeeを使うのがおすすめです。2つを組み合わせるのがベストです。
まとめ:一度作れば毎月5分の作業になる
| 作業 | 手動の場合 | 自動化後 |
|---|---|---|
| スプレッドシートへの入力 | 都度10分 | 都度10分(変わらない) |
| PDF作成 | 15分 | 0分(自動) |
| メール作成・送付 | 10分×件数 | 0分(自動) |
| フォルダ整理 | 5分 | 0分(自動) |
スプレッドシートへの入力だけが人間の仕事として残ります。
初期セットアップに2〜3時間かかりますが、それ以降は毎月10分の節約が永続します。1年で2時間、10年で20時間の節約です。一度作るだけの価値は十分あります。
関連ツールを見る
この記事で紹介したツール・サービスをまとめてチェック。
![]()