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で分析 |
まとめ — 今日から始めるスプレッドシート自動化
- Step 1: 毎週繰り返している「最も面倒なExcel作業」を1つ特定する
- Step 2: openpyxl + pandasで読み込みと集計を自動化する
- Step 3: Claude APIでデータ分析とレポート文章を自動生成する
- Step 4: 定期実行(cron/タスクスケジューラ)で完全自動化する
まずは小さく始めて、1つの作業を自動化する成功体験を得ることが重要だ。その経験が、他の作業の自動化にもつながっていく。
関連記事
A
Agentive 編集部
AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。