Agentive
自動化ラボ

AIでスプレッドシート作業を自動化 — Excel/Google Sheetsの一括処理

約5分で読めます

AIでスプレッドシート作業を自動化 — Excel/Google Sheetsの一括処理

大量のExcelファイルを開いて、データを集計して、グラフを作って、レポートにまとめて、メールで送る。この作業に毎週何時間も費やしているなら、AIとPythonで完全自動化できる。openpyxlとClaude APIを組み合わせれば、集計から分析、レポート生成、メール送信まで一気通貫で処理できるパイプラインが構築できる。

スプレッドシート自動化の全体像

自動化できる作業と削減時間

作業手動の所要時間自動化後削減率
複数ファイルの集計60分10秒99%
ピボットテーブル作成30分5秒99%
グラフ・チャート生成20分3秒99%
異常値の検出・ハイライト45分5秒99%
レポート文書の生成60分30秒99%
メール送信10分自動100%
合計225分/回約1分99%

必要なライブラリ

# requirements.txt
openpyxl==3.1.5        # Excel読み書き
pandas==2.2.3          # データ処理
anthropic==0.42.0      # Claude API
gspread==6.1.4         # Google Sheets連携
oauth2client==4.1.3    # Google認証
matplotlib==3.9.3      # グラフ生成
jinja2==3.1.4          # テンプレートエンジン

Excelファイルの一括読み込みと集計

複数ファイルの自動集計

import openpyxl
import pandas as pd
from pathlib import Path

def aggregate_excel_files(directory: str, sheet_name: str = None) -> pd.DataFrame:
    """指定ディレクトリの全Excelファイルを1つのDataFrameに集約"""
    all_data = []
    excel_dir = Path(directory)
    
    for file_path in excel_dir.glob("*.xlsx"):
        try:
            df = pd.read_excel(file_path, sheet_name=sheet_name)
            df["source_file"] = file_path.name
            all_data.append(df)
        except Exception as e:
            print(f"エラー: {file_path.name} - {e}")
    
    if not all_data:
        raise ValueError(f"Excelファイルが見つかりません: {directory}")
    
    combined = pd.concat(all_data, ignore_index=True)
    return combined

sales_data = aggregate_excel_files("./monthly_reports/", sheet_name="売上データ")

データの前処理と異常値検出

import anthropic
import json

client = anthropic.Anthropic()

def detect_anomalies_with_ai(df: pd.DataFrame, context: str) -> dict:
    """AIでデータの異常値やパターンを検出する"""
    summary = {
        "columns": list(df.columns),
        "shape": list(df.shape),
        "describe": df.describe().to_dict(),
        "null_counts": df.isnull().sum().to_dict(),
        "sample_rows": df.head(10).to_dict(orient="records")
    }
    
    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=2000,
        messages=[{
            "role": "user",
            "content": f"""以下のデータセットを分析し、異常値を検出してください。
コンテキスト: {context}
データ: {json.dumps(summary, ensure_ascii=False, default=str)}
報告: 異常値、データ品質問題、トレンド、推奨アクション(JSON形式)"""
        }]
    )
    return json.loads(response.content[0].text)

anomalies = detect_anomalies_with_ai(sales_data, "月次売上レポート")

AIによるデータ分析とインサイト生成

自動分析レポートの生成

def generate_analysis_report(df: pd.DataFrame, report_type: str) -> str:
    """DataFrameからAI分析レポートを生成する"""
    numeric_summary = df.describe().to_string()
    categorical_cols = df.select_dtypes(include=["object"]).columns
    cat_summary = {col: df[col].value_counts().head(10).to_dict() 
                   for col in categorical_cols}
    
    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=3000,
        messages=[{
            "role": "user",
            "content": f"""以下のデータから{report_type}を作成してください。
数値統計: {numeric_summary}
カテゴリ分布: {json.dumps(cat_summary, ensure_ascii=False, default=str)}
含めるもの: サマリー、KPI比較、トップ/ボトム5、トレンド、改善提案3つ、次月予測"""
        }]
    )
    return response.content[0].text

report = generate_analysis_report(sales_data, "月次売上分析レポート")

Google Sheetsとの連携

Google Sheets APIの設定と読み書き

import gspread
from oauth2client.service_account import ServiceAccountCredentials

def connect_google_sheets(credentials_path: str) -> gspread.Client:
    """Google Sheets APIに接続する"""
    scope = [
        "https://spreadsheets.google.com/feeds",
        "https://www.googleapis.com/auth/drive"
    ]
    creds = ServiceAccountCredentials.from_json_keyfile_name(credentials_path, scope)
    return gspread.authorize(creds)

def sync_to_google_sheets(gc, spreadsheet_name, df, worksheet_name="Sheet1"):
    """DataFrameの内容をGoogle Sheetsに同期する"""
    try:
        sh = gc.open(spreadsheet_name)
    except gspread.SpreadsheetNotFound:
        sh = gc.create(spreadsheet_name)
    try:
        worksheet = sh.worksheet(worksheet_name)
        worksheet.clear()
    except gspread.WorksheetNotFound:
        worksheet = sh.add_worksheet(
            title=worksheet_name, rows=len(df)+1, cols=len(df.columns)
        )
    data = [df.columns.tolist()] + df.values.tolist()
    worksheet.update(range_name="A1", values=data)
    return sh.url

Excelレポートの自動生成

グラフ付きExcelレポートの作成

from openpyxl.chart import BarChart, Reference
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.utils.dataframe import dataframe_to_rows

def create_formatted_report(df, output_path, title):
    """フォーマット済みのExcelレポートを生成する"""
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = "レポート"
    ws["A1"] = title
    ws["A1"].font = Font(size=16, bold=True)
    ws.merge_cells("A1:F1")
    
    start_row = 3
    for r_idx, row in enumerate(dataframe_to_rows(df, index=False, header=True)):
        for c_idx, value in enumerate(row, 1):
            cell = ws.cell(row=start_row + r_idx, column=c_idx, value=value)
            if r_idx == 0:
                cell.font = Font(bold=True, color="FFFFFF")
                cell.fill = PatternFill(start_color="2563EB", fill_type="solid")
                cell.alignment = Alignment(horizontal="center")
    
    if len(df.select_dtypes(include=["number"]).columns) > 0:
        chart = BarChart()
        chart.title = f"{title} - チャート"
        num_col = df.select_dtypes(include=["number"]).columns[0]
        col_idx = df.columns.tolist().index(num_col) + 1
        data = Reference(ws, min_col=col_idx, min_row=start_row, max_row=start_row + len(df))
        chart.add_data(data, titles_from_data=True)
        ws.add_chart(chart, "H3")
    wb.save(output_path)

定期実行の仕組み

スケジュール実行の設定

import schedule
from datetime import datetime

def weekly_report_job():
    """毎週の自動レポート生成ジョブ"""
    df = aggregate_excel_files("./weekly_data/")
    report_text = generate_analysis_report(df, "週次売上分析")
    output = f"reports/weekly_{datetime.now().strftime('%Y%m%d')}.xlsx"
    create_formatted_report(df, output, "週次売上レポート")
    gc = connect_google_sheets("credentials.json")
    sync_to_google_sheets(gc, "週次レポート", df)

schedule.every().monday.at("09:00").do(weekly_report_job)

コスト試算

項目月間コスト
Claude API(週1回のレポート生成)約200〜500円
Google Sheets API無料
Python環境無料
合計約200〜500円/月

月225分 x 4回 = 15時間の手作業が月500円で自動化できる。時給2,000円換算で月30,000円分の工数削減だ。

ユースケース別の活用例

ケース1: フリーランスの請求書管理

自動化する作業内容
請求書の集約月末にクライアント別のExcelをまとめる
入金チェック銀行CSVと請求書の突合
未入金アラート支払期日超過を自動検知してSlack通知

ケース2: ECサイトの在庫・売上管理

自動化する作業内容
日次売上集計各モール(Amazon/楽天/Yahoo)のCSVを統合
在庫アラート安全在庫を下回った商品を自動通知
週次レポート売れ筋・死に筋分析をAIで自動生成

ケース3: 人事・勤怠管理

自動化する作業内容
勤怠集計タイムカードCSVから残業時間を自動計算
有給管理残有給日数の自動計算とアラート
月次レポート部署別の勤務状況をAIで分析

まとめ — 今日から始めるスプレッドシート自動化

  1. Step 1: 毎週繰り返している「最も面倒なExcel作業」を1つ特定する
  2. Step 2: openpyxl + pandasで読み込みと集計を自動化する
  3. Step 3: Claude APIでデータ分析とレポート文章を自動生成する
  4. Step 4: 定期実行(cron/タスクスケジューラ)で完全自動化する

まずは小さく始めて、1つの作業を自動化する成功体験を得ることが重要だ。その経験が、他の作業の自動化にもつながっていく。

関連記事

A

Agentive 編集部

AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。