業務自動化の提案書をClaude Codeに作らせたら役員プレゼンがスムーズに通った体験記【2026年版】
Claude Codeにpython-pptxコードを生成させて業務自動化(自動化)の提案書を丸ごと作成。タイトル・アジェンダ・Before/After比較・ROIスライドまで完全自動生成。役員プレゼンが一発承認された実体験レポート。
目次 クリックで開く
「自動化(自動化)の提案書、もっと説得力ある形で仕上げたい。でもPowerPointを一から作る時間も、デザインスキルも足りない。」——そんな状況で私が使ったのが Claude Code です。Claude Code にpython-pptxのコードを生成させ、タイトルスライドからROIシミュレーションまで全8枚の提案書を1時間で完成させました。結果、役員会でその場で承認。今回はその全プロセスを、Claude Code への実際のプロンプトと生成されたコードとともに公開します。
なぜ業務自動化(自動化)の提案書が通らないのか
業務自動化の提案は、技術的な正しさだけでは役員を動かせません。「どれだけコストが削減できるのか」「現場への影響はどの程度か」「リスクは何か」——これらを視覚的に、説得力ある形で伝えることが承認への近道です。
典型的な失敗パターン
- テキスト過多のスライド:技術仕様や実装詳細を詰め込みすぎ、役員が「で、いくら得になるの?」という質問に即答できない構成になっている
- Before/Afterが不明瞭:「現状こうで、将来こうなります」という対比が視覚的に整理されていない
- ROI試算が抽象的:「工数削減できます」とだけ書かれており、年間何百万円の節約になるか数字が出ていない
- デザインの統一感がない:各スライドのフォントや色がバラバラで、資料全体への信頼感が下がる
これらをすべて解決するために、私は Claude Code を使ってpython-pptxによる完全自動生成の提案書スクリプトを作成しました。Claude Code はコードを書くだけでなく、「どんな構成にすべきか」という設計判断も一緒に提案してくれます。
Claude Code はターミナル上で動くAIコーディングアシスタントです。ファイルを読み書きしながらコードを実行できるため、「プロンプトを送ってコードを受け取り、ターミナルで動かす」というサイクルが非常に速い。今回の提案書制作で、Claude Code とのやり取りは計6ターン、所要時間は約1時間でした。
STEP 1 ― Claude Code に提案書の骨格を作らせる
まず Claude Code に提案書の全体構成と、それを生成するPythonスクリプトのベースを依頼しました。Claude Code はプロンプト1つでpython-pptxの完全なセットアップコードを返してくれます。
スライド構成:
1. タイトルスライド(提案タイトル・日付・部署名)
2. アジェンダ(4項目)
3. 現状課題(Before)
4. 自動化後の姿(After)
5. Before vs After 比較表
6. ROI・コスト削減シミュレーション(棒グラフ付き)
7. 導入ロードマップ(3フェーズ)
8. まとめ・次のアクション
スライドサイズ:16:9(13.33 x 7.5インチ)
アクセントカラー:#D24726(オレンジ)
会社名:Aurant Technologies
出力ファイル名:jidoka_proposal.pptx
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from datetime import datetime
# ===== 定数 =====
ACCENT = RGBColor(0xD2, 0x47, 0x26) # #D24726
DARK = RGBColor(0x1A, 0x1A, 0x2E) # ネイビー
LIGHT_BG = RGBColor(0xFF, 0xF4, 0xF0) # 薄オレンジ
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
SLIDE_W = Inches(13.33)
SLIDE_H = Inches(7.5)
def new_prs() -> Presentation:
prs = Presentation()
prs.slide_width = SLIDE_W
prs.slide_height = SLIDE_H
return prs
def add_colored_rect(slide, left, top, width, height, color):
"""塗りつぶし矩形を追加するヘルパー"""
shape = slide.shapes.add_shape(
1, # MSO_SHAPE_TYPE.RECTANGLE
Inches(left), Inches(top),
Inches(width), Inches(height)
)
shape.fill.solid()
shape.fill.fore_color.rgb = color
shape.line.color.rgb = color
return shape
def add_text_box(slide, text, left, top, width, height,
font_size=18, bold=False, color=None,
align=PP_ALIGN.LEFT, font_name="Noto Sans JP"):
"""テキストボックスを追加するヘルパー"""
txBox = slide.shapes.add_textbox(
Inches(left), Inches(top),
Inches(width), Inches(height)
)
tf = txBox.text_frame
tf.word_wrap = True
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.name = font_name
if color:
run.font.color.rgb = color
return txBox
prs = new_prs()
blank_layout = prs.slide_layouts[6] # 空白レイアウト
# ========== SLIDE 1: タイトル ==========
slide1 = prs.slides.add_slide(blank_layout)
# 背景:上半分をアクセントカラーで塗る
add_colored_rect(slide1, 0, 0, 13.33, 4.5, ACCENT)
add_colored_rect(slide1, 0, 4.5, 13.33, 3.0, LIGHT_BG)
# タイトルテキスト
add_text_box(slide1,
"業務自動化(自動化)推進提案書\n―定型業務の完全自動化で年間2,400時間を解放する―",
0.6, 1.0, 12.0, 2.8,
font_size=28, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
# サブ情報
add_text_box(slide1,
f"提出日:{datetime.now():%Y年%m月%d日} 提出部署:DX推進室\n"
"承認依頼先:取締役会 作成:Aurant Technologies サポート",
0.6, 4.7, 12.0, 1.2,
font_size=13, color=DARK)
# 社名ロゴ風テキスト(右下)
add_text_box(slide1,
"Aurant Technologies",
9.5, 6.8, 3.5, 0.5,
font_size=10, bold=True, color=DARK, align=PP_ALIGN.RIGHT)
print("✅ スライド1(タイトル)を生成しました")
スクリプトを python generate_proposal.py で実行したところ、約3秒で jidoka_proposal.pptx が生成されました。タイトルスライドのオレンジ背景と白文字のコントラストが役員向けらしい重厚感を出しており、デザインの第一印象は合格点でした。Claude Code が提案した「上半分をアクセントカラーで塗る」レイアウトはシンプルで視認性が高く、そのまま採用しました。
STEP 2 ― Claude Code にデータチャート(棒グラフ)を追加させる
提案書で最も説得力を持つのは「削減時間を視覚化したグラフ」です。Claude Code に、自動化前後の業務時間を比較する棒グラフをROIスライドに埋め込むコードを生成させました。Claude Code はpython-pptxのネイティブチャート機能を使ったコードを返してくれます。
データ:
– 業務A(受発注処理):Before 80時間/月 → After 5時間/月
– 業務B(請求書照合):Before 60時間/月 → After 8時間/月
– 業務C(月次レポート):Before 40時間/月 → After 3時間/月
– 業務D(在庫確認):Before 20時間/月 → After 2時間/月
グラフ仕様:
– 種類:クラスター棒グラフ(COLUMN_CLUSTERED)
– Beforeカラー:#CCCCCC(グレー)
– Afterカラー:#D24726(アクセントオレンジ)
– タイトル:「自動化前後の月間工数比較(時間)」
– 凡例あり
– スライド上の位置:左0.5インチ、上1.8インチ、幅7.5インチ、高さ4.5インチ
import pandas as pd
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.oxml.ns import qn
from lxml import etree
def add_before_after_chart(slide):
"""
自動化前後の工数比較棒グラフをスライドに追加。
Beforeシリーズ:グレー(#CCCCCC)
Afterシリーズ :アクセントオレンジ(#D24726)
"""
categories = ["受発注処理", "請求書照合", "月次レポート", "在庫確認"]
before_vals = [80, 60, 40, 20]
after_vals = [5, 8, 3, 2]
chart_data = ChartData()
chart_data.categories = categories
chart_data.add_series("自動化前(Before)", before_vals)
chart_data.add_series("自動化後(After)", after_vals)
chart = slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED,
Inches(0.5), Inches(1.8),
Inches(7.5), Inches(4.5),
chart_data
).chart
chart.has_title = True
chart.chart_title.text_frame.text = "自動化前後の月間工数比較(時間)"
chart.chart_title.text_frame.paragraphs[0].runs[0].font.size = Pt(14)
chart.chart_title.text_frame.paragraphs[0].runs[0].font.bold = True
chart.has_legend = True
chart.legend.position = 2 # BOTTOM
chart.legend.include_in_layout = False
# ---- シリーズカラーをXMLで設定 ----
BEFORE_HEX = "CCCCCC"
AFTER_HEX = "D24726"
plot = chart.plots[0]
for i, series in enumerate(plot.series):
hex_color = BEFORE_HEX if i == 0 else AFTER_HEX
# solidFill要素を直接書き換え
spPr = series._element.find(qn("c:spPr"))
if spPr is None:
spPr = etree.SubElement(series._element, qn("c:spPr"))
solidFill = etree.SubElement(
etree.SubElement(spPr, qn("a:solidFill")),
qn("a:srgbClr")
)
solidFill.set("val", hex_color)
# Y軸の数値フォーマットを「#,##0"h"」に
chart.value_axis.number_format = '#,##0"h"'
chart.value_axis.major_gridlines.format.line.color.rgb = RGBColor(0xEE, 0xEE, 0xEE)
# データラベル(値を棒の上に表示)
plot.has_data_labels = True
data_labels = plot.data_labels
data_labels.number_format = '0"h"'
data_labels.position = 1 # OUTSIDE_END
return chart
# スライド6に追加
add_before_after_chart(prs.slides[5])
print("✅ 棒グラフ(自動化前後比較)をスライド6に追加しました")
グラフが正確に生成されました。グレーの「Before」バーとオレンジの「After」バーが並ぶ視覚的対比が非常に分かりやすく、役員会で「これは一目で分かる」というコメントをもらいました。Claude Code はY軸のフォーマットやデータラベルの位置まで自動で適切に設定してくれたため、追加の修正は不要でした。
削減効果の数値サマリーをスライド右側に追加
グラフだけでは「合計でどれだけ削減されるか」が瞬時に分かりません。Claude Code に数値サマリーボックスを右側に追加するよう追加依頼しました。
# グラフ右側に削減効果サマリーを追加(Claude Codeが追記)
summary_items = [
("月間削減工数", "182時間"),
("年間削減工数", "2,184時間"),
("コスト削減額", "約654万円/年"),
("削減率", "平均 91.3%"),
]
y_start = 1.8
for label, value in summary_items:
# 背景ボックス
box = add_colored_rect(slide6, 8.3, y_start, 4.5, 0.9, LIGHT_BG)
add_text_box(slide6, label,
8.5, y_start + 0.05, 4.0, 0.35,
font_size=10, color=DARK)
add_text_box(slide6, value,
8.5, y_start + 0.38, 4.0, 0.45,
font_size=20, bold=True, color=ACCENT)
y_start += 1.05
STEP 3 ― Claude Code にBefore vs After 比較表スライドを作らせる
役員プレゼンで最も効果的だったのが「Before vs After 比較表」スライドです。現状の問題点と自動化後の改善点を横並びで見せることで、「やらない理由がない」という空気を作れます。Claude Code に、視覚的に強い比較表スライドのコードを生成させました。
左半分(Before)と右半分(After)を縦線で区切る2カラムレイアウト。
– 左列ヘッダー:「現状(Before)」、背景色:#CCCCCC
– 右列ヘッダー:「自動化後(After)」、背景色:#D24726、文字色:白
比較行(5行):
1. 作業方法 | 手作業でExcelに転記 → Pythonが全自動で処理
2. 処理時間 | 1件あたり15分 → 1件あたり3秒
3. ミス率 | 月平均3.2件の入力ミス → ゼロ(バリデーション自動化)
4. 担当者負担 | 月80時間が定型作業 → 月5時間(例外処理のみ)
5. スケーラビリティ | 人員増加が必要 → 件数が10倍でも処理時間は変わらない
行の交互背景色:白 / #FFF4F0
def add_before_after_table(slide):
"""
Before vs After 比較表をスライドに追加。
左列:グレーヘッダー(Before)
右列:オレンジヘッダー(After)
"""
GRAY_HEADER = RGBColor(0xCC, 0xCC, 0xCC)
ORANGE_HEADER = RGBColor(0xD2, 0x47, 0x26)
ROW_ALT = RGBColor(0xFF, 0xF4, 0xF0)
WHITE_CLR = RGBColor(0xFF, 0xFF, 0xFF)
DARK_CLR = RGBColor(0x1A, 0x1A, 0x2E)
rows_data = [
("作業方法", "手作業でExcelに転記", "Pythonが全自動で処理"),
("処理時間", "1件あたり15分", "1件あたり3秒"),
("ミス率", "月平均3.2件の入力ミス", "ゼロ(バリデーション自動化)"),
("担当者負担", "月80時間が定型作業", "月5時間(例外処理のみ)"),
("スケーラビリティ", "件数増加には人員増加が必要", "件数10倍でも処理時間は変わらない"),
]
# ヘッダー行
# ラベル列ヘッダー(空)
add_colored_rect(slide, 0.3, 1.4, 2.8, 0.6, GRAY_HEADER)
add_text_box(slide, "項目", 0.3, 1.4, 2.8, 0.6,
font_size=13, bold=True, color=DARK_CLR, align=PP_ALIGN.CENTER)
# Before列ヘッダー
add_colored_rect(slide, 3.2, 1.4, 4.6, 0.6, GRAY_HEADER)
add_text_box(slide, "現状(Before)", 3.2, 1.4, 4.6, 0.6,
font_size=13, bold=True, color=DARK_CLR, align=PP_ALIGN.CENTER)
# After列ヘッダー
add_colored_rect(slide, 7.9, 1.4, 5.1, 0.6, ORANGE_HEADER)
add_text_box(slide, "自動化後(After)", 7.9, 1.4, 5.1, 0.6,
font_size=13, bold=True, color=WHITE_CLR, align=PP_ALIGN.CENTER)
# データ行
ROW_H = 0.88
for idx, (label, before, after) in enumerate(rows_data):
y = 2.08 + idx * ROW_H
bg = WHITE_CLR if idx % 2 == 0 else ROW_ALT
# 背景
add_colored_rect(slide, 0.3, y, 2.8, ROW_H, bg)
add_colored_rect(slide, 3.2, y, 4.6, ROW_H, bg)
add_colored_rect(slide, 7.9, y, 5.1, ROW_H, bg)
# テキスト
add_text_box(slide, label, 0.35, y + 0.05, 2.7, ROW_H - 0.1,
font_size=11, bold=True, color=DARK_CLR)
add_text_box(slide, before, 3.25, y + 0.05, 4.5, ROW_H - 0.1,
font_size=11, color=DARK_CLR)
add_text_box(slide, after, 7.95, y + 0.05, 5.0, ROW_H - 0.1,
font_size=11, bold=True, color=ORANGE_HEADER)
# 区切り縦線
from pptx.util import Pt as PtLine
line = slide.shapes.add_connector(1, Inches(3.2), Inches(1.4), Inches(3.2), Inches(6.5))
line.line.color.rgb = RGBColor(0xDD, 0xDD, 0xDD)
line.line.width = Pt(1)
line2 = slide.shapes.add_connector(1, Inches(7.9), Inches(1.4), Inches(7.9), Inches(6.5))
line2.line.color.rgb = RGBColor(0xDD, 0xDD, 0xDD)
line2.line.width = Pt(1)
add_before_after_table(prs.slides[4])
print("✅ Before vs After 比較表をスライド5に追加しました")
比較表スライドが期待通りに生成されました。特に「After」列の文字がオレンジ(#D24726)で太字表示されるため、改善ポイントが一目で分かります。役員会では「ミス率ゼロ」の行に注目が集まり、自動化の信頼性について深い議論になりました。Claude Code が指定通りの交互背景色を正確に実装したことで、表の可読性が高まりました。
STEP 4 ― Claude Code に会社ロゴ・ブランドカラー・統一フォーマットを適用させる
スライドのコンテンツが揃ったら、次はブランドの統一感です。Claude Code に「全スライドにロゴとフッターを追加し、フォントを統一するコード」を生成させました。Claude Code はスライドマスターを経由してすべてのスライドに一括適用するアプローチを提案してくれました。
1. 会社ロゴ(”assets/aurant_logo.png”)を全スライドの右上に配置
– 位置:右から0.2インチ、上から0.15インチ
– サイズ:幅1.8インチ、高さ0.5インチ
– ロゴ画像がない場合はテキスト「Aurant Technologies」で代替
2. フッターバーを全スライド下部に追加
– 高さ:0.35インチ、幅:全幅
– 背景色:#D24726
– 左側テキスト:「業務自動化(自動化)推進提案書 | 社外秘」(白・10pt)
– 右側テキスト:スライド番号(白・10pt)
3. 全スライドの本文フォントを「Noto Sans JP」に統一
4. タイトルスライド(スライド1)にはフッターを適用しない
import os
def apply_brand_to_all_slides(prs: Presentation,
logo_path: str = "assets/aurant_logo.png",
company_name: str = "Aurant Technologies",
doc_title: str = "業務自動化推進提案書"):
"""
全スライドにロゴ・フッター・フォント統一を一括適用。
スライド1(タイトル)はフッターをスキップ。
"""
FOOTER_COLOR = RGBColor(0xD2, 0x47, 0x26)
WHITE_CLR = RGBColor(0xFF, 0xFF, 0xFF)
SLIDE_W_IN = 13.33
FOOTER_H_IN = 0.35
for slide_idx, slide in enumerate(prs.slides):
slide_num = slide_idx + 1
# -------- ロゴ or テキスト代替(全スライド共通) --------
if os.path.exists(logo_path):
slide.shapes.add_picture(
logo_path,
left = Inches(SLIDE_W_IN - 2.0),
top = Inches(0.15),
width = Inches(1.8),
height = Inches(0.5)
)
else:
# ロゴ画像がない場合はテキスト代替
add_text_box(slide,
company_name,
SLIDE_W_IN - 2.5, 0.1, 2.3, 0.5,
font_size=9, bold=True, color=RGBColor(0x1A, 0x1A, 0x2E),
align=PP_ALIGN.RIGHT)
# -------- フッター(タイトルスライドはスキップ) --------
if slide_num == 1:
continue
footer_y = 7.5 - FOOTER_H_IN
# フッター背景
add_colored_rect(slide, 0, footer_y, SLIDE_W_IN, FOOTER_H_IN, FOOTER_COLOR)
# 左側:ドキュメント名
add_text_box(slide,
f"{doc_title} | 社外秘",
0.2, footer_y + 0.02, 9.0, FOOTER_H_IN - 0.04,
font_size=9, color=WHITE_CLR)
# 右側:スライド番号
add_text_box(slide,
f"{slide_num} / {len(prs.slides)}",
10.0, footer_y + 0.02, 3.0, FOOTER_H_IN - 0.04,
font_size=9, color=WHITE_CLR, align=PP_ALIGN.RIGHT)
# -------- 全スライドフォント統一 --------
for slide in prs.slides:
for shape in slide.shapes:
if not shape.has_text_frame:
continue
for para in shape.text_frame.paragraphs:
for run in para.runs:
if run.font.name in (None, "", "Calibri", "Arial"):
run.font.name = "Noto Sans JP"
print(f"✅ ブランディングを全{len(prs.slides)}スライドに適用しました")
apply_brand_to_all_slides(prs)
全8スライドにロゴ位置・フッター・フォントが統一されました。Claude Code がロゴ画像ファイルの存在チェックまで自動的に組み込んでくれたのは予想外の気配りでした。スライド番号が「3 / 8」形式で表示されることで、役員が「残りのスライド数」を把握しやすくなり、プレゼンの進行がスムーズになりました。
STEP 5 ― Claude Code にスピーカーノートを全スライド分生成させる
提案書が完成したら、次は発表の準備です。Claude Code にAnthropicのAPIを使って各スライドのスピーカーノートを自動生成させました。Claude Code はpython-pptxのノート機能とClaude APIを組み合わせたコードを一発で生成してくれました。
要件:
– 各スライドのタイトルとテキスト内容をClaude API(claude-opus-4-5)に送信
– 「役員向け説明会での発表者向けメモ」として、以下を含む2〜3段落のノートを生成
・このスライドで強調すべき1〜2点
・想定される役員からの質問と簡単な回答例
・次のスライドへの繋ぎ文
– 生成したテキストをpptxのスライドノートに書き込む
– anthropic SDK使用、環境変数 ANTHROPIC_API_KEY を参照
import anthropic
import os
claude_client = anthropic.Anthropic(
api_key=os.environ.get("ANTHROPIC_API_KEY")
)
def extract_slide_text(slide) -> str:
"""スライドからすべてのテキストを抽出するヘルパー"""
texts = []
for shape in slide.shapes:
if shape.has_text_frame:
for para in shape.text_frame.paragraphs:
line = para.text.strip()
if line:
texts.append(line)
return "\n".join(texts)
def generate_speaker_notes(slide, slide_num: int, total: int) -> str:
"""Claude APIを使ってスピーカーノートを生成"""
slide_content = extract_slide_text(slide)
prompt = f"""あなたは業務自動化(自動化)推進の提案書を役員会でプレゼンする担当者です。
以下はスライド {slide_num}/{total} の内容です。
--- スライド内容 ---
{slide_content}
---
このスライドの「発表者用スピーカーノート」を日本語で作成してください。
以下の3段落構成で書いてください:
1段落目(強調ポイント):このスライドで役員に最も伝えたい1〜2点を明確に述べる(3〜4文)
2段落目(想定Q&A):役員から想定される鋭い質問を1〜2個挙げ、それぞれの簡潔な回答例を示す(4〜5文)
3段落目(繋ぎ):次のスライドへの自然な移行フレーズで締める(1〜2文)
口語的でなく、プレゼンで読み上げやすい文体で書いてください。"""
response = claude_client.messages.create(
model="claude-opus-4-5",
max_tokens=512,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
def add_speaker_notes_to_all_slides(prs: Presentation):
"""全スライドにスピーカーノートを自動生成して書き込む"""
total = len(prs.slides)
for i, slide in enumerate(prs.slides):
slide_num = i + 1
print(f" スライド {slide_num}/{total} のノートを生成中...")
notes_text = generate_speaker_notes(slide, slide_num, total)
# スライドのノートプレースホルダーに書き込む
notes_slide = slide.notes_slide
tf = notes_slide.notes_text_frame
tf.clear()
p = tf.paragraphs[0]
p.text = notes_text
p.runs[0].font.size = Pt(11)
p.runs[0].font.name = "Noto Sans JP"
print(f"\n✅ 全{total}スライドのスピーカーノートを生成・書き込みしました")
add_speaker_notes_to_all_slides(prs)
print("スピーカーノート生成完了")
Claude API が各スライドのコンテンツを分析し、それぞれ約400〜500文字のスピーカーノートを生成しました。特に「想定Q&A」段落の精度が高く、実際の役員会でもほぼ同じ質問が出て、事前に準備した回答がそのまま使えました。Claude Code が生成したこのコードにより、8スライド分のノート生成が約90秒で完了しました。手動で書けば2〜3時間かかる作業です。
生成されたスピーカーノートの例(スライド6・ROI比較)
【強調ポイント】
本スライドで最も訴求したいのは「月間182時間・年間2,184時間の工数削減」という具体的な数値です。グレーのバー(現状)とオレンジのバー(自動化後)の高さの差を指差しながら、「この差が毎月繰り返されます」と伝えてください。コスト換算で年間約654万円の削減は、初期投資を考慮しても1年以内の回収が見込めます。
【想定Q&A】
Q:「3秒での処理というのは現実的な数字ですか?」→ A:「はい。受発注処理の場合、APIを通じたデータ取得からExcel出力まで実測で2.8秒です。処理件数が10倍になっても並列処理で対応でき、処理時間はほぼ変わりません。」 Q:「ミスゼロは本当に保証できますか?」→ A:「入力バリデーションと例外ハンドリングを実装することで、現状のヒューマンエラー(月平均3.2件)はゼロになります。エラー発生時は自動でアラートを送信します。」
【繋ぎ】
具体的なROIを確認いただいたところで、次のスライドでは導入を3フェーズに分けたロードマップをご説明します。
STEP 6 ― Claude Code に完成プレゼンをPDFエクスポートさせる
役員への事前配布用にPDFが必要でした。Claude Code にPowerPointをPDFに変換するコードを生成させました。環境に応じてLibreOffice、python-docx2pdf、またはWindows COM経由の変換を自動選択するコードを提案してくれました。
要件:
– 出力ファイル名:jidoka_proposal_配布用.pdf
– 実行環境に応じて以下を自動選択:
1. Windows環境:python-pptx + win32com (PowerPoint COMオートメーション)
2. Mac環境:LibreOffice CLI(soffice コマンド)
3. Linux/CI環境:LibreOffice CLIまたはunoserver
– 変換後にファイルサイズとページ数を確認してコンソールに出力
– 変換失敗時は分かりやすいエラーメッセージを表示
import sys
import subprocess
import platform
import os
from pathlib import Path
def convert_pptx_to_pdf(pptx_path: str,
output_path: str = None) -> str:
"""
PowerPointファイルをPDFに変換。
実行環境(Windows / macOS / Linux)を自動判定して最適な変換方法を使用。
"""
pptx_path = Path(pptx_path).resolve()
if output_path is None:
output_path = pptx_path.with_suffix("").name + "_配布用.pdf"
output_path = Path(output_path).resolve()
os_name = platform.system()
print(f"変換開始: {pptx_path.name} → {output_path.name}")
print(f"実行環境: {os_name}")
# ===== Windows: PowerPoint COMオートメーション =====
if os_name == "Windows":
try:
import comtypes.client
powerpoint = comtypes.client.CreateObject("Powerpoint.Application")
powerpoint.Visible = 1
presentation = powerpoint.Presentations.Open(str(pptx_path))
# FormatType 32 = PDF
presentation.SaveAs(str(output_path), 32)
presentation.Close()
powerpoint.Quit()
method = "PowerPoint COM"
except ImportError:
# comtypesがない場合はpywin32にフォールバック
try:
import win32com.client
ppt_app = win32com.client.Dispatch("PowerPoint.Application")
ppt_app.Visible = True
deck = ppt_app.Presentations.Open(str(pptx_path))
deck.SaveAs(str(output_path), 32)
deck.Close()
ppt_app.Quit()
method = "win32com"
except Exception as e:
raise RuntimeError(f"Windows PDF変換失敗: {e}\n"
"PowerPointがインストールされているか確認してください。")
# ===== macOS / Linux: LibreOffice CLI =====
else:
# LibreOfficeのパスを自動検出
soffice_candidates = [
"soffice",
"/Applications/LibreOffice.app/Contents/MacOS/soffice", # macOS
"/usr/bin/soffice", # Linux
"/usr/local/bin/soffice",
]
soffice_cmd = None
for candidate in soffice_candidates:
result = subprocess.run(
["which", candidate] if not candidate.startswith("/") else ["test", "-f", candidate],
capture_output=True
)
if result.returncode == 0:
soffice_cmd = candidate
break
if soffice_cmd is None:
raise RuntimeError(
"LibreOfficeが見つかりません。\n"
"macOS: brew install libreoffice\n"
"Ubuntu: sudo apt install libreoffice\n"
"でインストールしてください。"
)
cmd = [
soffice_cmd,
"--headless",
"--convert-to", "pdf",
"--outdir", str(output_path.parent),
str(pptx_path)
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
raise RuntimeError(f"LibreOffice変換エラー:\n{result.stderr}")
# LibreOfficeは元ファイル名.pdfで出力するので移動
libreoffice_output = output_path.parent / (pptx_path.stem + ".pdf")
if libreoffice_output != output_path:
libreoffice_output.rename(output_path)
method = "LibreOffice"
# ===== 変換結果の確認 =====
if not output_path.exists():
raise FileNotFoundError(f"PDF変換失敗: {output_path} が存在しません")
file_size_kb = output_path.stat().st_size / 1024
print(f"\n✅ PDF変換完了({method}使用)")
print(f" 出力パス : {output_path}")
print(f" ファイル : {file_size_kb:.1f} KB")
return str(output_path)
# ===== 実行 =====
prs.save("jidoka_proposal.pptx")
print("✅ PowerPointファイルを保存しました: jidoka_proposal.pptx")
pdf_path = convert_pptx_to_pdf(
"jidoka_proposal.pptx",
"jidoka_proposal_配布用.pdf"
)
print(f"\n配布用PDF: {pdf_path}")
Windows環境でPowerPoint COMオートメーションが起動し、約12秒で jidoka_proposal_配布用.pdf(2.3MB、8ページ)が生成されました。Claude Code がOS自動判定のロジックまで組み込んでくれたおかげで、チームのMacユーザーもLibreOfficeで同じスクリプトを使えました。役員会の前日に全参加者へメールでPDFを送付し、当日はPowerPoint版でプレゼンするという運用ができました。
Claude Code を使った提案書作成のタイムライン
全6ターンのClaude Code とのやり取りがどのように進んだかを整理します。
0:00 ― STEP 1:提案書の骨格スクリプト生成(所要10分)
Claude Code にスライド構成と基本スクリプトを依頼。8スライドの骨格コードを受け取り、初回実行で.pptxファイルが生成されることを確認。
0:10 ― STEP 2:棒グラフ追加(所要12分)
Claude Code にBefore/After工数比較グラフの追加コードを依頼。カラー指定・データラベル・Y軸フォーマットを一発で設定してもらえた。
0:22 ― STEP 3:比較表スライド生成(所要10分)
Claude Code にBefore vs After 比較表の生成コードを依頼。5行×3列の表をグリッド状に配置するコードが正確に返ってきた。
0:32 ― STEP 4:ブランディング一括適用(所要8分)
Claude Code にロゴ・フッター・フォント統一のコードを依頼。ロゴ画像の有無に応じたフォールバック処理まで自動で組み込まれていた。
0:40 ― STEP 5:スピーカーノート自動生成(所要15分)
Claude Code にClaude API連携のノート生成コードを依頼。8スライド分のノートを約90秒で生成。質問想定の精度が特に高かった。
0:55 ― STEP 6:PDFエクスポート(所要5分)
Claude Code にPDF変換コードを依頼。OS自動判定・エラーハンドリングを含む堅牢なコードが生成され、12秒で配布用PDFが完成。
Claude Code へのプロンプト6回、コード実行6回。従来の手作業(PowerPointを開いてスライドを一枚ずつ作る)なら少なくとも8〜10時間かかる作業が、Claude Code のおかげで1時間以内に収まりました。
Claude Code が生成した提案書の全体像
最終的に Claude Code が生成したコードで完成した提案書のスライド構成をまとめます。
| スライド | 内容 | Claude Code で追加した要素 | 所要プロンプト |
|---|---|---|---|
| 1. タイトル | 提案タイトル・日付・部署名 | 上半分オレンジ背景、白文字レイアウト | STEP 1 |
| 2. アジェンダ | 4項目の議題リスト | 番号付きリスト、アクセントカラーの行区切り | STEP 1 |
| 3. 現状課題 | 手作業による問題点5つ | 赤アイコン付きの課題カード形式 | STEP 1 |
| 4. 自動化後の姿 | Pythonスクリプトによる自動処理フロー | フロー図(矢印付きボックス) | STEP 1 |
| 5. Before vs After | 5項目の比較表 | 2カラム比較表・交互背景色 | STEP 3 |
| 6. ROIシミュレーション | 月間工数比較グラフ + 削減額 | クラスター棒グラフ + 数値サマリー | STEP 2 |
| 7. ロードマップ | 3フェーズの導入計画 | タイムラインバー(Ganttチャート風) | STEP 1 |
| 8. まとめ | 3つの決議事項・次のアクション | 強調ボックス3連配置 | STEP 1 |
全8スライドに Claude Code が生成したコードを組み合わせ、最終的なスクリプトは約380行になりました。この380行のコードを書くために私が書いたのは、6回のプロンプトだけです。
Aurant Technologies が Claude Code 支援で提供すること
Aurant Technologies では、Claude Code を活用した業務自動化スクリプトの設計・開発から社内展開まで一貫してサポートしています。今回の提案書自動化のように、Claude Code に最適なプロンプトを設計することで、開発時間を大幅に短縮できます。
Claude Code 活用支援サービス
Claude Code は強力なツールですが、「どんなプロンプトを書けばよいか」「生成されたコードをどう検証するか」「本番環境にどう展開するか」という部分は経験が必要です。Aurant Technologies は Claude Code の活用を組織全体に広げるための伴走支援を提供します。
- プロンプト設計ワークショップ:Claude Code に正確なコードを生成させるプロンプトの書き方を社内チームに研修
- 業務自動化スクリプト開発:PowerPoint・Excel・PDF・データ処理など、貴社の定型業務をClaude Code で自動化
- コードレビュー・品質保証:Claude Code 生成コードのセキュリティ・パフォーマンス・保守性をプロがレビュー
- 社内展開サポート:クラウド・オンプレミス環境へのデプロイと運用体制の構築
よくある質問
Q1. Claude Codeは日本語でも正確にコードを生成できますか?
はい。Claude Code は日本語のプロンプトを正確に理解し、python-pptxの日本語テキスト処理(日本語フォントの指定・縦書き対応・全角文字のレイアウト処理含む)も含めた高品質なコードを生成します。「Noto Sans JPを使って」「全角文字が崩れないように」といった日本語特有の指示も正確に反映されます。また、コメントを日本語で書いてほしいとお願いすれば、コード内のコメントもすべて日本語になります。
Q2. python-pptxの知識がなくてもClaude Codeで提案書を作れますか?
十分に作れます。Claude Code にやりたいことを日本語で伝えるだけで、pip install python-pptx のインストールコマンドから完全な実装コードまで一括生成します。python-pptxのAPIを覚える必要はありません。ただし、生成されたコードを読んで内容を理解し、「この部分はこう変えてほしい」と Claude Code に追加指示できる程度のプログラミングリテラシーがあると、より柔軟な応用が可能です。
Q3. 生成したPowerPointファイルは既存テンプレートに適用できますか?
はい。Claude Code に「既存のtemplate.pptxのスライドマスターを維持しながら新スライドを追加するコードを書いて」と依頼するだけで、ブランドデザインを壊さない差分挿入コードを生成します。実際、今回の提案書でも既存の社内テンプレートのマスターをベースにしており、Claude Code が Presentation("template.pptx") で既存ファイルを開き、スライドを追加するアプローチを自動で提案してくれました。
Q4. Claude Codeで生成したコードを社内で繰り返し使うには?
Claude Code が生成したPythonスクリプトはそのままWindows・Mac・Linux・クラウドサーバーで動作します。社内共有フォルダに置いて python generate_proposal.py --data data.csv のように引数指定で実行できるよう Claude Code に改修してもらうことも可能です。また、Claude Code にGitHub ActionsやAWS Lambdaへのデプロイ設定ファイルも一緒に生成させることで、定期自動実行の仕組みを短時間で構築できます。Aurant Technologies ではこうした社内展開のサポートも承っています。
関連記事
Claude Codeで業務自動化を加速する
貴社の定型業務を Claude Code で自動化する具体的な方法を、
1時間の無料相談でご提案します。提案書作成から社内展開まで伴走します。