0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

フリーランスの雑務を年100時間減らすPython自動化レシピ集 — 請求書・勤怠・ファイル整理を全部スクリプト化

0
Last updated at Posted at 2026-03-01

フリーランスとして働いていると、本業以外の雑務が地味に時間を食います。

請求書の作成、勤怠の集計、納品ファイルの整理、メールの定型文送信……。一つひとつは10分程度でも、月に換算すると8〜10時間。年間で100時間以上を雑務に費やしている計算になります。

この記事では、実際に自分が使っているPythonスクリプトを5つ紹介します。コピペで動くレベルまで簡略化しているので、Python初心者でもすぐ試せます。

1. 請求書PDFの自動生成

毎月の請求書作成、手動でやってませんか?

from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from datetime import date

def create_invoice(client_name, items, output_path):
    c = canvas.Canvas(output_path, pagesize=A4)
    width, height = A4

    c.setFont("Helvetica-Bold", 24)
    c.drawString(50, height - 60, "INVOICE")

    c.setFont("Helvetica", 12)
    c.drawString(50, height - 90, f"Date: {date.today().strftime('%Y/%m/%d')}")
    c.drawString(50, height - 110, f"To: {client_name}")

    y = height - 160
    total = 0
    for item_name, price in items:
        c.drawString(50, y, f"{item_name}")
        c.drawString(400, y, f"¥{price:,}")
        total += price
        y -= 25

    c.setFont("Helvetica-Bold", 14)
    c.drawString(350, y - 20, f"Total: ¥{total:,}")
    c.save()

# 使い方
create_invoice(
    "株式会社サンプル",
    [("Webサイト開発", 300000), ("保守運用(3月分)", 50000)],
    "invoice_2026_03.pdf"
)

reportlabを入れるだけ(pip install reportlab)。テンプレートを一度作れば、あとはクライアント名と金額を変えるだけ。

実際には、Notionのデータベースと連携させて案件情報を自動取得→PDF生成→メール送信まで一気にやっています。Notionでの案件管理についてはこちらの記事で詳しく解説しています。

2. 勤怠・稼働時間の自動集計

💡 スクリプトで時間を作ったあとは、案件管理も仕組み化を
Python不要、CSVインポートするだけで案件・勤怠・収支をNotionで一元管理できるテンプレートを公開中。自動化と組み合わせると「稼いで・管理して・申告する」サイクルが完結する。
フリーランスOS — Notionテンプレート(¥980)

フリーランスにとって稼働時間の記録は確定申告にも必要。CSVで雑に記録して、月末にPythonで集計するのが一番楽です。

import csv
from collections import defaultdict
from datetime import datetime

def summarize_work_log(csv_path):
    project_hours = defaultdict(float)

    with open(csv_path, encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            start = datetime.strptime(row["start"], "%Y-%m-%d %H:%M")
            end = datetime.strptime(row["end"], "%Y-%m-%d %H:%M")
            hours = (end - start).total_seconds() / 3600
            project_hours[row["project"]] += hours

    print("=== 月間稼働サマリー ===")
    total = 0
    for project, hours in sorted(project_hours.items()):
        print(f"  {project}: {hours:.1f}h")
        total += hours
    print(f"  合計: {total:.1f}h")

CSVの記録すら面倒な人は、Notionのタイムトラッカーテンプレートを使うのもアリです。Notion活用術も参考にどうぞ。

3. 納品ファイルの自動整理・リネーム

import shutil
from pathlib import Path
from datetime import date

def organize_deliverables(source_dir, dest_dir):
    source = Path(source_dir)
    dest = Path(dest_dir)
    today = date.today().strftime("%Y%m%d")

    moved = 0
    for file in source.iterdir():
        if file.is_file() and not file.name.startswith("."):
            ext = file.suffix.lower().lstrip(".")
            ext_dir = dest / ext
            ext_dir.mkdir(parents=True, exist_ok=True)
            new_name = f"{today}_{file.name}"
            shutil.move(str(file), str(ext_dir / new_name))
            moved += 1

    print(f"{moved}ファイルを整理しました → {dest_dir}")

納品前に毎回手動でフォルダ分けしてた時間が、これで0になりました。

4. 定型メールの自動送信

import smtplib
from email.mime.text import MIMEText

def send_template_mail(to_addr, subject, body, from_addr, password):
    msg = MIMEText(body, "plain", "utf-8")
    msg["Subject"] = subject
    msg["From"] = from_addr
    msg["To"] = to_addr

    with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
        server.login(from_addr, password)
        server.send_message(msg)

Gmailのアプリパスワードを使えば、2要素認証が有効でも送信できます。月初に稼働報告テンプレートを差し込んで送るだけ。

5. 定期バックアップ

import shutil
from datetime import datetime
from pathlib import Path

def backup_workspace(source, backup_root, max_backups=5):
    backup_dir = Path(backup_root)
    backup_dir.mkdir(parents=True, exist_ok=True)

    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    archive_name = backup_dir / f"backup_{timestamp}"

    shutil.make_archive(str(archive_name), "zip", source)
    print(f"バックアップ完了: {archive_name}.zip")

    backups = sorted(backup_dir.glob("backup_*.zip"))
    while len(backups) > max_backups:
        oldest = backups.pop(0)
        oldest.unlink()

Gitを使っていても、ローカルの全体バックアップは別で持っておくと安心です。

まとめ:自動化のコツ

  1. 完璧を目指さない — 80%自動化できれば十分。残り20%は手動でOK
  2. まず1つだけ自動化する — 一番面倒なやつから。成功体験が次につながる
  3. Pythonの標準ライブラリだけで始めるos, csv, datetimeで大体いける

年間100時間の雑務削減は、時給3,000円換算で30万円分の価値。スクリプトを書く数時間の投資で、確実にリターンがあります。


おすすめ関連ツール・テンプレート

  • ToolPlex — ブラウザで使える無料オンラインツール集。JSON整形、Base64変換、正規表現テスターなど、開発中にサッと使えるツールが揃っています

  • TechPlex Blog — Notion活用術やフリーランス向けの生産性テクニックを発信中

  • フリーランスOS — Notion案件管理テンプレート(¥980) — 案件・タスク・収支をNotionで一元管理。この記事で紹介した請求書・勤怠Pythonスクリプトと組み合わせると「自動化 + 管理」が完結する


関連記事:


あわせて読みたい(関連サイト)


💻 Python自動化に役立つ機材

この記事のテーマに関連して、作業環境の見直しもおすすめです:

この記事で紹介したツールを最大限活用するには、ハードウェア環境も重要です。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?