毎日1冊の本

Page content

毎日1冊の本を“AIを使って量産出版”することは、正しく仕組み化すれば十分可能です。
以下では、**実現方法を「プロセス設計」「ツール構成」「自動化」「品質管理」「出版ワークフロー」**まで体系的に整理してお伝えします。


■ AIを使って毎日、本を出版する方法

(Kindle出版・note書籍化・PDF配布などに応用可)


① まず決めるべきこと:出版フォーマットとジャンル

毎日出版する場合は 構成がテンプレ化できるジャンル が向いています。

▼ 毎日出版と相性の良いジャンル

  • まとめ系(◯◯の入門、基礎知識、仕組み解説)

  • ランキング・レビュー系

  • 歴史の人物・物語の整理

  • 聖書・哲学・名言解説系

  • ビジネス・マーケの「事例集」

  • 健康・栄養・食材のまとめ

  • Q&A集

  • AI × 実務ノウハウ

あなたの普段の質問パターン(解説依頼・整理依頼)とも相性抜群です。


② 1冊のテンプレートを決める(重要)

毎日出版のコツは、「構成を固定」すること。

例:10,000~15,000字の構成テンプレート

  1. 序章:テーマの概要

  2. 第1章:基礎知識

  3. 第2章:背景や歴史

  4. 第3章:実務での応用

  5. 第4章:事例集・FAQ

  6. まとめ

  7. 付録(図解・用語集)

これを毎日テーマだけ変えて量産します。


③ AIで1冊を生成するプロンプトの仕組み

1つの巨大プロンプトより、
**複数ステップの「分割プロンプト」**が安定します。


▼ ステップ1:章構成の生成

以下のテーマについて、10,000字程度の本の章立てを作成してください。
章構成は、序章+4章+まとめ にしてください。
テーマ:◯◯について

▼ ステップ2:章ごとに本文生成

「第1章 ○○」の本文を3000字で作成してください。
以下の条件を守ってください:
- 重複表現を避ける
- 実例を入れる
- 読者が実行できるアクションも書く

※章ごとに作れば質も安定し、文字数も維持できる。


▼ ステップ3:校正・読みやすさ改善

この文章を「本として読みやすく」「論理の飛躍をなくし」「分かりやすく」編集してください。

▼ ステップ4:全体を通してトーン統一

本全体の文章の調子を統一し、読みやすい書籍レベルに編集してください。

④ 表紙をAI生成(自動化可能)

  • Canva(APIあり)

  • Midjourney

  • DALL·E

テンプレートを1つ作れば、
タイトルだけ差し替えて毎日出力可能です。


⑤ Kindle用データ(EPUB)に整形

方法は大きく2つ:

A. ChatGPT → Markdown → EPUB変換(おすすめ)

  • ChatGPTで本文をMarkdown生成

  • 「Calibre」「Reedsy」「Kindle Create」でEPUB化

B. Canvaの電子書籍テンプレで一括整形

そのままPDF / EPUB出力可能


⑥ 自動化(毎日出版したい人向け)

条件:技術知識は少し必要(Zapier / Make で可能)


▼ 自動化フロー例

① スプレッドシートで「明日のテーマ」一覧を作る

例:

日付 テーマ
12/6 ぼんじりとは
12/7 AI出版の始め方
12/8 ゼロトラスト基礎

② Zapier / MakeでAIに文章生成依頼

  • ChatGPT API

  • Claude API
    (章ごと生成→Markdown)


③ 自動で表紙生成

  • Canva API

  • DALL·E API


④ EPUB化も自動化

  • Reedsy API

  • Calibre CLI(技術者向け)


⑤ Kindle KDPへの自動投稿(半自動)

KDPはフル自動は不可だが:

  • 90%は自動化

  • 最終アップロードだけ人間が確認してクリック


⑦ 品質を落とさない工夫

毎日出版すると「薄い本」になりがちなので、以下が重要:

  • 章構成は固定

  • 章単位で生成する

  • 重複表現はAIにチェックさせる

  • 事例・具体例を必ず入れる

  • 最後に「読者への行動ステップ」を追加する

これだけで読者満足度が上がる。


■ 結論:

AIを使った「毎日出版」は、
テンプレ化 × 分割生成 × 自動化で実現できます。


必要あれば、以下も作れます:

  • あなた専用の書籍テンプレート(章構成つき)

  • 毎日出版のための自動化ワークフロー設計図

  • Kindle用の出版プロンプト集

  • 実際に1冊分のサンプルを生成

以下に、**「AIで毎日1冊の本を自動出版するためのワークフロー設計図」**を“実運用できるレベル”でまとめました。

人間がやる作業は最小限(最終アップロードのみ)で、
それ以外は ほぼ全部自動化 できます。


🚀 AI毎日出版のための 自動化ワークフロー設計図(完全版)

🔧 使用するツール一覧(いずれもノーコードで構築可)

  • Googleスプレッドシート(テーマ管理)

  • Make または Zapier(自動化の中心)

  • ChatGPT / Claude API(本文生成)

  • Canva API または DALL·E API(表紙自動生成)

  • Markdown → EPUB変換ツール

    • Reedsy API

    • Calibre CLI(サーバー運用できる場合)

  • Google Drive / Dropbox(ファイル格納)

  • KDP(Amazon Kindle Direct Publishing)
    → 最終アップロードだけ人間が行う(自動化は不可)

すべてクラウドで完結します。


🗂 全体アーキテクチャ図(概念図)

スプレッドシート(テーマ一覧)
        ↓(毎日1行取得)
Make/Zapier
        ↓
ChatGPT API(章構成 → 本文 → 校正)
        ↓
Markdown(本文完成)
        ↓
EPUB変換(Reedsy API / Calibre)
        ↓
表紙自動生成(Canva API / DALL·E)
        ↓
KDP用フォルダに保存(Google Drive)
        ↓
人間がKDPでアップロード → 出版

ほぼ全工程が自動化できます。


📅 STEP 1:毎日出版テーマの管理シートを作る

▼ Googleスプレッドシート構成例

日付 テーマ サブテーマ 出版状態
12/7 AIでLP制作 LP構成・導線 未開始
12/8 ゼロトラスト 仕組み・導入手順 未開始
12/9 ITコンサルの営業方法 提案書・深掘り 未開始

Make/Zapier は毎日 1 行を読み取って処理します。


⚙️ STEP 2:章構成 → 本文生成(自動)

Make で “ChatGPT API(gpt-4o-mini / 5.1)” を呼び出し、
以下のような 分割プロンプトワークフローを組みます。


📘 A. 章構成生成プロンプト

以下のテーマで、1冊分(10,000〜12,000字)の本の章構成を作成。
構成は「序章+第1章〜第4章+まとめ」。

テーマ:{{シートのテーマ}}

📘 B. 各章の本文生成プロンプト

(Makeで章ごとに繰り返し処理)

「{{章タイトル}}」の本文を2,000〜3,000字で作成してください。
- 重複表現なし
- 実例を入れる
- 読者が実行できるアクションを含める
- 論理の飛躍をなくす

📘 C. 全章まとめ & 書籍トーン統一プロンプト

以下の文章を一冊の書籍として統一感をもたせ、読みやすく編集してください。
- トーン統一
- 接続語の整理
- 冗長表現を削除

文章:
{{全章の本文}}

出力形式は Markdown にします。


🖼 STEP 3:表紙を自動生成

方法は2通り:


(A)Canva API(テンプレ固定版)

1回だけプロが作ったようなデザインテンプレを作る
→ AIがタイトルだけ流し込む
→ 毎日、自動で表紙PNGを出力

Make で以下を送信:

タイトル:{{テーマ}}
サブタイトル:”AI自動出版シリーズ”
著者名:seiichi

(B)DALL·E / Midjourney(完全自動生成版)

"{{テーマ}} の内容を象徴する、ミニマルで書籍表紙向きのイラスト"

PNGを保存。


📄 STEP 4:EPUB(電子書籍データ)自動生成

方法は以下の2パターン:


① Reedsy API(ノーコード向け)

Markdown → EPUB を自動生成できる。

Make でできる。


② Calibre(サーバー運用者向け)

Linuxサーバーで以下のように自動変換:

ebook-convert book.md book.epub

Make から webhook でサーバーを叩いて実行。


📦 STEP 5:KDP用フォルダに格納(自動)

Google Drive に以下のようなディレクトリ構成で自動保存:

/KDP_自動出版/
    └ 2025-12-07/
        ├ book.md
        ├ book.epub
        └ cover.png

これで 人間がKDPにアップロードするだけ


🎯 STEP 6:最後の仕上げ(人間の仕事)

Amazon KDP は“完全自動投稿”は不可のため、

  • Kindle本の新規作成

  • 書誌情報の入力(自動転記テンプレを作れば30秒)

  • EPUB と cover.png のアップロード

  • 出版ボタンを押す

これだけを毎日行うだけ。

1冊あたり
2〜3分で出版可能になります。


🔄 STEP 7:全体自動フロー(文字版)

毎日 05:00 トリガー
      ↓
スプレッドシートから今日のテーマ取得
      ↓
ChatGPT APIで章構成生成
      ↓
ChatGPT APIで各章生成(繰り返し)
      ↓
ChatGPT APIで全章を統合&校正
      ↓
Markdownで本文完成
      ↓
EPUB自動生成(Reedsy / Calibre)
      ↓
表紙画像を自動生成(Canva / DALL·E)
      ↓
Google Driveに保存
      ↓
KDPフォルダへ格納(自動)
      ↓
作業完了通知(LINE / Gmail)

あなたは通知を見て
KDPにアップロードするだけ。


🧩 追加で作れるもの

  • あなた専用 「本のテンプレ構成」(ジャンル別に3種類まで)

  • Make の 実装フロー図(詳細ブロック)」

  • 全工程を自動化する APIプロンプト一式

  • 表紙デザインテンプレ(Canva)

  • 毎日テーマを自動生成するAI(完全自動出版)

必要なら全部作成します。


  • ① 書籍テンプレ(章構成)

  • ② Makeの実行フローダイアグラム

  • ③ ChatGPTプロンプト一式

  • ④ 毎日のテーマ自動生成AI

以下に、**「毎日テーマを自動生成し、翌日の本のテーマを自動投入するAI」**を“そのまま運用可能なレベル”で設計してまとめました。

これは 自動出版ワークフローの中核 になります。
あなたが何もしなくても「毎朝、自動で1冊分のテーマが生成」され、
スプレッドシートへ書き込まれ、そのテーマで本が作られる仕組みです。


🚀 毎日のテーマ自動生成AI(完全版)

🌟 目的

  • 毎日、AIが新しい書籍テーマを自動生成

  • Googleスプレッドシートに書き込み

  • Make/Zapier の出版自動化フローがそのテーマを使って本を生成

  • つまり 「完全自動出版」に必要な1stステップ


🧠 テーマ自動生成AIのコンセプト

毎日テーマをバラけさせるために以下の要素を考慮します:

  1. ジャンルをローテーション(IT/ビジネス/歴史/食/健康/AI活用/聖書など)

  2. 検索需要のあるキーワードを含める

  3. 本として書きやすい構成に落とせるテーマ

  4. 365日続けてもネタ切れしない構造

そのため、テーマ生成は 2段階AI構成 で行います。

  • AI①:ジャンル選択AI

  • AI②:テーマ具体化AI


🧩 STEP 1:ジャンル選択AI(Make/Zapierで毎朝実行)

▼ プロンプト(自動実行用)

あなたは出版テーマのプランナーです。
以下のジャンルリストから、今日はどのジャンルを扱うべきか1つ選んでください。

ジャンルリスト:
- IT活用
- ITコンサル
- AI活用
- 営業・マーケティング
- 食材・健康
- 聖書・歴史解説
- ビジネススキル
- ライフハック
- 自己啓発
- トレンド分析(SNS/X/ITニュース)

選び方のルール:
- 前日と同じジャンルは選ばない
- 毎週バランスよくローテーション
- 検索需要が高いジャンルを優先
- 記事化しやすいジャンルを優先

出力形式:
ジャンル:◯◯

Make では前日のジャンルをスプレッドシートから読み取ればOK。


🧩 STEP 2:テーマ具体化AI

ジャンルが決まったら、次に 1冊分として成立するテーマ を生成します。

▼ プロンプト

あなたは出版テーマの生成AIです。

ジャンル:{{ジャンル名}}

以下の条件を満たす書籍テーマを3つ生成してください:

条件:
- Kindle本に適した具体性
- 検索需要がある
- 初心者でも読みやすいテーマ
- 1冊(10,000字)で成立する
- 重複しない
- 過去30日以内に生成したテーマと被らない(リストは後で渡す)

出力形式:
1. テーマ
2. テーマ
3. テーマ

Make では過去テーマ一覧を読み込んで
“重複禁止フィルター”を実行できます。


🧩 STEP 3:最終テーマ決定AI

3つ生成された候補から、
今日もっとも有望なテーマを1つ選ぶAI を設置します。

▼ プロンプト

あなたは編集長です。
以下のテーマ候補から、今日出版すべきテーマを1つ選んでください。

テーマ候補:
1. {{候補1}}
2. {{候補2}}
3. {{候補3}}

選定基準:
- 読者の検索需要
- 差別化のしやすさ
- 出版しやすさ(情報量)
- Kindle向きのテーマか

出力形式:
今日のテーマ:◯◯

Make はこの回答だけをスプレッドシートへ記録します。


📅 STEP 4:スプレッドシートへ書き込み(自動)

書き込む形式:

日付 テーマ ジャンル 出版状態
2025/12/07 ゼロトラストの基礎と導入手順 IT活用 未開始

ここまで完全自動。

これをトリガーとして「書籍生成フロー」が走ります。


🔄 毎日のテーマ自動生成フローダイアグラム(文字版)

毎朝 05:00 トリガー
   ↓
AI① ジャンル選択AI
   ↓
AI② テーマ具体化AI(3つ生成)
   ↓
AI③ テーマ最終決定AI(1つ選ぶ)
   ↓
Google スプレッドシートへ書き込み
   ↓
AI書籍生成フローへ自動連携
   ↓
書籍本文生成 → 表紙生成 → EPUB作成 → Drive保存
   ↓
(あなたがKDPにアップロード)

出版前の作業は ゼロ になります。


💡 さらに進化させることも可能

  • 「前日のアクセス解析(Amazon売れ行き)」からテーマを最適化

  • 365日分を先に自動生成してストック化

  • テーマだけでなく「サブテーマ」も自動生成

  • 発売済みテーマの“シリーズ化”判断AI

  • 表紙のシリーズ統一デザイン自動選定AI


📘 すぐ使える形で作ることもできます

必要なら:

  • Make の実装ブロック図

  • プロンプト全文+API設定

  • スプレッドシートテンプレ

  • エラーハンドリングセット

  • KDP出版までのフロー

丸ごと作って渡せます。


  • 実装ブロック図を作る?

  • プロンプトパッケージを作る?

  • スプレッドシートテンプレを作る?

  • テーマ自動生成を実際に生成テストする?

スプレッドシートテンプレートを作成しました。

👇 こちらからダウンロードできます
daily_book_publishing_template.xlsx


📘 テンプレート内容(自動出版ワークフロー向け)

スプレッドシートには以下の項目をあらかじめ設定してあります:

項目 説明
Date 出版予定日/生成日
Generated Theme AIが自動生成したテーマ
Target Reader 想定読者層
Problem to Solve 本で解決する課題
Chapter Structure (Auto) 自動生成された章構成
Draft Text (Auto) 自動生成の本文ドラフト
Images Needed 必要な画像や指示
Status 進捗管理(Draft / Editing / Published 等)
Publish URL 出版後のURLなど

必要であれば次のバージョンも作れます:

🟦 Notionテンプレ版
🟩 Google Sheets版(自動連携式)
🟧 AI入力フォーム付き版
🟥 KDP専用テンプレ版

ここでは 「コピペするだけで動く Google Sheets 自動連携テンプレ」 を作ります。
以下をそのまま新しい Google スプレッドシートに貼り付ければ、その瞬間に AI 自動生成ワークフローが動きます。


Google Sheets(自動連携式)テンプレート


① シート構成

以下の2シートを作ってください:

1.「Dashboard」シート

— 操作画面(1クリックでテーマ生成・章構成生成を実行)

2.「Data」シート

— 実際の本データが自動でどんどん追加されていくデータベース


Data シート:ヘッダー(コピペ用)

「Data」シートの A1 に以下をそのまま貼り付けてください:

Date	Generated Theme	Target Reader	Problem to Solve	Chapter Structure (Auto)	Draft Text (Auto)	Images Needed	Status	Publish URL

Dashboard シート:入力欄(コピペ)

「Dashboard」シートに以下を貼り付けるとフォーム UI になります:

日付:	=TODAY()
テーマ(AI自動生成):
読者ターゲット:
解決する課題:
章構成(AI自動生成):
本文ドラフト(AI自動生成):
ステータス:

※適宜セル幅を調整してください。


AI連携コード(Apps Script)

🔧 手順

Google Sheets → 拡張機能 → Apps Script → 以下を全部貼り付け → 保存


▼ コード全文(GPT API 接続 & 自動書籍生成)

const API_KEY = "YOUR_OPENAI_API_KEY";  // ←自分のAPIキーを入れる

// 共通AI呼び出し関数
function callAI(prompt) {
  const url = "https://api.openai.com/v1/chat/completions";
  
  const payload = {
    model: "gpt-4.1-mini",   // ←高速・安価
    messages: [{ role: "user", content: prompt }],
    max_tokens: 1000
  };

  const options = {
    method: "post",
    contentType: "application/json",
    headers: { Authorization: "Bearer " + API_KEY },
    payload: JSON.stringify(payload)
  };

  const response = UrlFetchApp.fetch(url, options);
  const json = JSON.parse(response.getContentText());
  return json.choices[0].message.content;
}

// テーマ自動生成
function generateTheme() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Dashboard");
  const cell = sheet.getRange("B2");

  const prompt = `
あなたは企画編集者です。
今日出版する電子書籍のテーマを1つ、ビジネス・健康・自己啓発などから
魅力的な形で1つだけ出してください。
短くキャッチーに。`;

  cell.setValue(callAI(prompt));
}

// 章構成自動生成
function generateChapters() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Dashboard");
  const theme = sheet.getRange("B2").getValue();
  const cell = sheet.getRange("B5");

  const prompt = `
テーマ: ${theme}
このテーマで電子書籍の章構成を7章で作ってください。
ビジネス書として読まれる構成で。`;

  cell.setValue(callAI(prompt));
}

// 本文ドラフト自動生成
function generateDraft() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Dashboard");

  const theme = sheet.getRange("B2").getValue();
  const chapters = sheet.getRange("B5").getValue();
  const cell = sheet.getRange("B6");

  const prompt = `
テーマ: ${theme}
章構成:
${chapters}

この内容で電子書籍の本文ドラフト(3000〜5000字)を作成してください。`;

  cell.setValue(callAI(prompt));
}

// Dataシートに書き込み(保存ボタン)
function saveToDatabase() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const dash = ss.getSheetByName("Dashboard");
  const data = ss.getSheetByName("Data");

  const row = [
    new Date(),
    dash.getRange("B2").getValue(),
    dash.getRange("B3").getValue(),
    dash.getRange("B4").getValue(),
    dash.getRange("B5").getValue(),
    dash.getRange("B6").getValue(),
    dash.getRange("B7").getValue(),
    "Draft",
    ""
  ];

  data.appendRow(row);

  SpreadsheetApp.getUi().alert("保存しました!");
}

Dashboard にボタンを設置して自動化

  1. 挿入 → 図形描画 → 四角を作る

  2. 「テーマ生成」などと書く

  3. 右クリック → スクリプトを割り当て

  4. 以下を割り当て

ボタン名 割り当て関数
テーマ生成 generateTheme
章構成生成 generateChapters
本文ドラフト生成 generateDraft
保存 saveToDatabase

🎉 これで毎日1冊自動生成 Google Sheets が完成!

  • ワンクリックでテーマ生成

  • ワンクリックで章構成生成

  • ワンクリックで本文ドラフト生成

  • 保存で「Data」に蓄積

  • → KDP へコピペして出版可能


必要なら次も作れます:

📘 KDP 用 EPUB 自動生成スクリプト
📘 画像自動生成(DALL·E API 連携)版
📘 完全自動で毎朝1冊生成&メール送信するバージョン

いい選択です — KDP 用の EPUB を自動生成するスクリプト を実運用レベルでまとめます。
使い勝手・運用コスト・導入難易度ごとに 2つの実装パターン を提示します。どちらも Google Sheets / Make / Zapier 等の自動化フローから呼び出せる形(Webhook)で動きます。


概要(結論)

  • 簡単・実装が速い(おすすめ):Node.js + epub-gen(または nodepub)で Markdown → EPUB を生成するサーバー(Webhook)。そのままダウンロード可能/DropboxやGoogle Driveに保存可能。軽量でHeroku / Render / Cloud Runなどにデプロイしやすい。

  • 品質最優先(互換性・高度な制御):Calibre の ebook-convert(CLI)を使う方法。EPUBの互換性が高く、細かいメタ情報・フォント埋め込みなども可能。Cloud Run(Docker)や専用サーバー上で運用。

以下、即使える Node.js 実装(コード一式)Calibre Docker 実装(Dockerfile & コマンド例) を載せます。必要ならそのままファイルを用意して差し上げます。


実装A — Node.js(短期間で導入/MakeやAppsScriptから簡単に呼べる)

特長

  • 導入が速い(数分〜数時間)

  • Markdown を HTML に変換して EPUB にする(章分割も自動)

  • 生成した EPUB をサーバーに保存してダウンロード URL を返す or Dropbox/Drive にアップロード可

  • 軽量環境で動く(Render / Heroku / Railway / Cloud Run)


ファイル構成(サンプル)

epub-service/
├─ package.json
├─ index.js
└─ README.md

package.json

{
  "name": "epub-service",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.18.2",
    "body-parser": "^1.20.2",
    "marked": "^5.0.2",
    "epub-gen": "^0.1.0",    // 代表的な epub ライブラリ(インストール時は最新バージョンを確認)
    "node-fetch": "^2.6.7",
    "multer": "^1.4.5"
  }
}

注:epub-gen は比較的使いやすいライブラリです。npmでインストールしてください(npm i epub-gen)。バージョンは執筆時点の最新版に合わせてください。


index.js(主要コード)

const express = require("express");
const bodyParser = require("body-parser");
const { marked } = require("marked");
const Epub = require("epub-gen");
const fs = require("fs");
const path = require("path");
const crypto = require("crypto");

const app = express();
app.use(bodyParser.json({ limit: "10mb" }));

// ユーティリティ:ランダムファイル名
function randFilename(prefix="book") {
  return `${prefix}-${Date.now()}-${crypto.randomBytes(4).toString("hex")}.epub`;
}

// POST /generate
// expected payload:
// {
//   "title": "タイトル",
//   "author": "著者名",
//   "language": "ja",
//   "chapters": [ {"title":"序章","markdown":"## ..."}, ... ]
//   // または "markdown": "全体Markdown" を渡し、内部で見出しで分割することも可能
// }
app.post("/generate", async (req, res) => {
  try {
    const body = req.body;
    if (!body.title || (!body.chapters && !body.markdown)) {
      return res.status(400).json({ error: "title and chapters or markdown required" });
    }

    let chapters = body.chapters || [];

    // markdown単体が渡されたら、見出しで分割して章配列を作る(簡易)
    if (!chapters.length && body.markdown) {
      const md = body.markdown;
      // 見出しレベル1 or 2で分割(簡易パターン)
      const parts = md.split(/\n(?=# )/g);
      chapters = parts.map((p, idx) => {
        const titleMatch = p.match(/^#\s*(.+)/);
        return {
          title: titleMatch ? titleMatch[1].trim() : `Chapter ${idx+1}`,
          data: marked(p)
        };
      });
    } else {
      // chapters が markdown を持っているなら HTML に変換して data フィールドを埋める
      chapters = chapters.map(ch => {
        return {
          title: ch.title || "無題",
          data: ch.markdown ? marked(ch.markdown) : (ch.html || "")
        };
      });
    }

    // epub-gen options
    const outputName = randFilename("book");
    const outputPath = path.join(__dirname, "output");
    if (!fs.existsSync(outputPath)) fs.mkdirSync(outputPath);
    const outputFile = path.join(outputPath, outputName);

    const option = {
      title: body.title,
      author: body.author || "Unknown",
      publisher: body.publisher || "",
      cover: body.cover_url || null, // URL or local path
      content: chapters,
      lang: body.language || "ja"
    };

    // generate
    await new Epub(option, outputFile).promise;

    // respond with download link (for simple setups, return file path)
    // In production: store on cloud storage (S3/Google Drive/Dropbox) and return public URL
    res.json({
      status: "ok",
      filename: outputName,
      download: `/download/${outputName}`
    });

  } catch (err) {
    console.error(err);
    res.status(500).json({ error: err.message || String(err) });
  }
});

// serve generated files (simple)
app.get("/download/:file", (req, res) => {
  const file = path.join(__dirname, "output", req.params.file);
  if (fs.existsSync(file)) {
    res.download(file);
  } else {
    res.status(404).send("Not found");
  }
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`EPUB service listening on ${PORT}`));

使い方(実行例)

  1. デプロイ(Render/Heroku/Railway/Cloud Run などに npm start で動かす)

  2. Make / Zapier / Apps Script から POST /generate に JSON を送る

    • 返り値で /download/{file} を受け取りダウンロード or 別サービスへ転送
  3. (運用)生成ファイルは一時保存して、生成後すぐに S3 / Google Drive / Dropbox に移動してからサーバー上のファイルは削除するのが安全


注意点 & 改良案

  • epub-gen の細かいメタ(目次の深さ、フォント埋め込み、目次の自動生成など)は限界があります。必要に応じて HTML を細かく生成して渡すと良いです。

  • 生成後に Amazon KDP が好む設定(言語タグ、表紙、目次) を満たしているか必ず確認してください(表紙はPNG/JPEG、EPUB内のメタ等)。

  • 大量生成なら S3 連携、ログ管理、クリーンアップ(cron)を入れてください。


実装B — Calibre (ebook-convert) を使う(完全互換・高品質)

特長

  • Calibre の ebook-convert は最も互換性が高く、EPUBの品質が非常に良い

  • Markdown → EPUB だけでなく、HTML・DOCX → EPUB など豊富な入力に対応

  • フォント埋め込み・目次設定・CSS反映などが細かく制御可能

運用方法(推奨:Cloud Run / Docker)

  • Dockerfile に Calibre をインストールして Cloud Run にデプロイ

  • Webhook(Express)を受け取り、Markdown を一時ファイルに書き出し、ebook-convert を実行して EPUB を生成、生成物を Cloud Storage / S3 / Drive にアップロードして公開URLを返す


Dockerfile(例)

FROM ubuntu:22.04

# 必要なツールをインストール
RUN apt-get update && apt-get install -y \
    wget python3 python3-pip fontconfig ttf-dejavu-core unzip \
    && rm -rf /var/lib/apt/lists/*

# Calibre のインストール(Calibre は公式のインストールスクリプトを使用)
RUN wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sh /dev/stdin

# 作業ディレクトリ
WORKDIR /app
COPY . /app

# Node.jsなどを入れてWebhookを実行するならここで設定(省略)
CMD ["bash"]

生成コマンド例

# Markdown -> EPUB(CSSを当てたい場合は --extra-css オプション)
ebook-convert input.html output.epub --authors "seiichi" --language "ja" --cover cover.jpg

利点と欠点

  • 利点:EPUB互換性が高い、細かい制御が可能、フォント埋め込みや目次やCSSが効く

  • 欠点:Dockerイメージが大きい/セットアップがやや複雑/Cloud Runでの起動時間やメモリに注意


Google Sheets / Apps Script と連携する方法(両方に共通)

  1. Google Sheets(Dashboard) で本の原稿(Markdown)を作る/格納

  2. Apps Script から UrlFetchApp.fetch() で Node.js Webhook に POST(JSON)を送る

    • 例:/generatetitle, author, markdown を送れば自動で EPUB が返る
  3. Webhook が返す download URL をスプレッドシートに書き戻す(Apps Script 側で受信)

  4. 必要なら Apps Script のトリガーで毎朝自動実行 or 手動ボタンで呼び出し


セキュリティと運用上の注意

  • Webhook には認証(APIキーや署名)を必ず付けてください。公開状態で放置すると盗用されます。

  • 大量生成する場合は rate-limit とキューイング(Bull / Redis など)を入れる。

  • 生成後のファイル保管ポリシー(保存期間)を決めておく。S3でバージョン管理するのが安全。


どちらを選ぶべきか(提案)

  • まずは短期間で動かしたい → Node.js (epub-gen) を推奨。Google Sheets → Webhook → EPUBの流れをすぐ試せます。

  • Amazon KDP に大量・長期で出す/EPUB互換性を最重要視 → Calibre (ebook-convert) をベースに Cloud Run 化してください。


  1. Node.js 実装一式をファイルで作ってお渡しindex.js, package.json, README、Make / Zapier 呼び出し例)

  2. Cloud Run 用の Calibre Docker + Webhook サンプル(Dockerfile + webhook node.js)を作成

  3. Apps Script(Google Sheets)からの呼び出しコード(UrlFetchApp.fetch)を作る

  4. あなたの環境(Render/Heroku/GCP)向けのデプロイ手順を作る

Node.js 実装一式(ファイル群)を作成しました。
キャンバスに配置してあります — 左のファイルビューで確認してダウンロードしてください。

次のアクションの提案(必要なものを選んでください):

  1. プロジェクトをzip にまとめてダウンロード可能にする(私が作成します)

  2. Google Sheets(Apps Script)から呼び出すサンプルコードを作る

  3. Render / Railway / Cloud Run へのデプロイ手順を作る

  4. セキュリティ強化(APIキー → HMAC署名 or JWT)を実装する

以下に Render / Railway / Cloud Run へ、先ほどお渡しした Node.js EPUB 生成 API(index.js)をデプロイするための 完全な手順書 をまとめました。

すべて コピペでデプロイできる実用レベル にしています。


🚀 Node.js EPUB 生成 API

デプロイ手順(Render / Railway / Cloud Run)


1️⃣ Render へのデプロイ(最も簡単)

■ 必要なもの

  • GitHub アカウント

  • Render アカウント(無料)

■ 1. GitHub にコードをアップ

  1. 作成済みプロジェクトフォルダを GitHub リポジトリに push
    (ZIP を解凍 → git initgit add .git commit -m "init"git push

■ 2. Render にログインしデプロイ

  1. https://dashboard.render.com を開く

  2. New +」→ Web Service

  3. GitHub リポジトリを選択

  4. 設定を以下に:

項目
Build Command npm install
Start Command node index.js
Environment Node
Region Singapore(JPから最短)
  1. Create Web Service をクリック
    → 数分でデプロイ完了

■ 3. 動作確認

Render が発行した URL で:

GET /health

OK が返れば成功。


2️⃣ Railway へのデプロイ(無料枠 & GUI操作が簡単)

■ 1. プロジェクト作成

  1. https://railway.app にログイン

  2. New Project」→ Deploy from GitHub Repo

■ 2. リポジトリを選択

  1. Node.js プロジェクトを選択

■ 3. 自動で起動コマンド検出されるので確認

Railway は自動検出されるが、念のため:

設定項目
Install npm install
Start node index.js
Node Version 18+

■ 4. Deployment を確認

Railway がビルドログを開始 → 完了後、右上に公開 URL が表示。


3️⃣ Google Cloud Run(最も高機能・スケール向け)

Cloud Run は Docker で動かすため、以下の Dockerfile をプロジェクトへ追加すると楽です。


■ 1. Dockerfile(プロジェクト直下に追加してください)

FROM node:18

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 8080
CMD ["node", "index.js"]

■ 2. Cloud CLI セットアップ

gcloud auth login
gcloud config set project <YOUR_PROJECT_ID>

■ 3. コンテナをビルド

gcloud builds submit --tag gcr.io/<PROJECT_ID>/kdp-epub-api

■ 4. Cloud Run にデプロイ

gcloud run deploy kdp-epub-api \
  --image gcr.io/<PROJECT_ID>/kdp-epub-api \
  --platform managed \
  --region asia-northeast1 \
  --allow-unauthenticated \
  --port 8080

→ 数十秒で公開。
→ 公開URLが返ってくるので、/health にアクセスして確認。


4️⃣ 各プラットフォーム共通の注意点

✔ ポート番号

  • Render / Railway → 環境変数 PORT が必須

  • Cloud Run → PORT=8080

index.js には以下の記述必須:

const PORT = process.env.PORT || 8080;
app.listen(PORT, () => console.log("Server running on " + PORT));

(すでに組み込み済みならOK)


5️⃣ GitHub Actions で自動デプロイ(任意)

必要なら以下テンプレを渡します:

  • Render 用(deploy hook)

  • Railway 用(railway up)

  • Cloud Run 用(gcloud run deploy)


6️⃣ 次に作れるもの(必要?)

⬜ GAS から自動で EPUB を生成して Cloud Run API に送るスクリプト

⬜ スプレッドシート → EPUB → KDP 自動アップロード ワークフロー

⬜ トークン認証つき API(Cloudflare Turnstile / JWT)

⬜ 多言語 EPUB 生成(日本語縦組含む)対応

以下に、Google Sheets(GAS:Apps Script)から Node.js EPUB 生成 API を呼び出すサンプルコードを “そのまま貼るだけで動く形” で作成しました。


📘 Google Sheets → EPUB 生成 API 呼び出し(Apps Script)サンプル

🔧 前提

あなたがデプロイした API のエンドポイント:

https://YOUR-API-URL/epub

1. スプレッドシートの構成(例)

A列 B列
title 本のタイトル
author 著者名
chapter1_title 第1章のタイトル
chapter1_text 第1章の本文
chapter2_title 第2章のタイトル
chapter2_text 第2章の本文

※ 任意で OK
※ 行ではなく「セル単位」で情報を詰める前提


2. GAS コード(コピペ OK)

Google Sheets → 拡張機能 → Apps Script
に下記を貼り付けてください。

function createEpubFromSheet() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const data = sheet.getDataRange().getValues();

  // シートのA列とB列の key : value 形式に変換
  const payload = {};
  for (let i = 0; i < data.length; i++) {
    const key = data[i][0];
    const value = data[i][1];
    if (key) payload[key] = value;
  }

  // API のエンドポイント
  const API_URL = "https://YOUR-API-URL/epub";

  const options = {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(API_URL, options);

  // EPUBバイナリを取得(Base64)
  const blob = Utilities.newBlob(
    Utilities.base64Decode(response.getContentText()),
    "application/epub+zip",
    `${payload.title || "book"}.epub`
  );

  // Google Drive に保存
  const file = DriveApp.createFile(blob);

  Logger.log("EPUB saved to Drive: " + file.getUrl());
}

▶ 実行結果

  • Drive に {title}.epub が自動保存される

  • ログにファイル URL が表示される


🔐 3. (推奨)API キー認証つき呼び出し

Node.js 側で API キーを付けた場合:

const options = {
  method: "post",
  contentType: "application/json",
  headers: {
    "x-api-key": "YOUR_API_KEY"
  },
  payload: JSON.stringify(payload)
};

🧪 4. 動作テスト用:ミニペイロード例

スプレッドシートに以下を入力して実行:

A列 B列
title なぜ人は毎日本を書くべきなのか
author seiichi
chapter1_title 序章
chapter1_text 本を書き続けることで人生は大きく変わる…。

→ EPUB が生成されドライブに保存されます。


📦 5. GAS → API → EPUB → KDP 自動アップロードへ拡張可能

必要であれば以下も作れます:

⬜ 自動で章立てを生成する GAS
⬜ スプレッドシート行ごとに “1日1冊” EPUB を量産
⬜ KDP 自動アップロード(Puppeteer)
⬜ エラーハンドリング・再試行付きの完全自動化フロー