導入:AIに「1万文字の本」を自動で書か導入:第91話から大進化!「薄っぺらいAI原稿」を分厚い本に変える魔法
今日も一日、現場仕事お疲れ様です!横浜で清掃業を営む、49歳のYasuです。
第91話で「目次を入れてAIにKindle本を書かせる方法」をご紹介しました。しかし、あの時は手作業のコピペが必要だったうえに、こんな悩みにぶつかりませんでしたか? **「AIが書いた文章、なんだか内容が薄いし、文字数も全然足りないぞ……」**と。
せっかく自動化しても、中身がペラペラでは読者はお金を払ってくれません。AIは基本的に「早く仕事を終わらせたがる」ため、「2000文字で書いて」とお願いしても、平気で800文字くらいで薄くまとめてきやがります。
そこで今回は、Difyの「イテレーション(繰り返し)」とGASを使った完全自動保存システムに加え、AIの怠け癖を叩き直して「濃くて長い文章」を強制的に書かせるプロの極意を公開します!
最初のスタートブロックから順を追って、中学生でも分かるように図解レベルで丁寧に解説します。IT未経験の私でも作れた「完全版の執筆工場」、いざ稼働させましょう!
結論:分厚い本を作るカギは「骨組みの強制」と「最大トークンの解放」
どうすればAIは長い文章を書くのか?答えは2つです。
- プロンプトで「小見出し」を強制する: ただ「長く書け」ではなく、「必ず3つの小見出しを作り、それぞれに具体的な例え話を入れて深掘りしろ」と、作業の骨組みをガチガチに指定します。
- Difyの「最大トークン数」を引き上げる: DifyのLLMブロックは、初期設定だと「短い文章で出力をストップする」設定になっています。このリミッターを外します。
これらをDifyの工場に組み込み、最後にGAS(受付窓口)へぶん投げて、見出し付きのGoogleドキュメントとして全自動保存させます!
手順:Dify×GASで作る「超濃厚・完全自動Kindle執筆工場」
STEP 1:GASで「見出し自動設定付き・ドキュメント受付窓口」を作る
まずは受け取り側です。AIが書いた「##」などの記号を、本物の見出しデザインに翻訳してくれる頑丈な窓口を作ります。 Googleドライブから「Google Apps Script」を新規作成し、以下のコードをまるごとコピペして「ウェブアプリ」として公開(URLをコピー)してください。
▼ コピペ用:エラー絶対回避・頑丈なGASコード
JavaScript
// Difyから送られてきた文章を受け取ってドキュメントを作るメインのプログラムです
function doPost(e) {
// 原稿を入れるための空っぽの箱(変数)を用意します
let markdownText = "";
// 【安全装置1】送られてきたデータがどんな形でも絶対に受け取るための処理です
try {
// 送られてきたデータ(JSON)をプログラムが読める形に変換します
const json = JSON.parse(e.postData.contents);
// もしJSON形式で「text」という箱に入っていたらそれを取り出し、ダメなら中身をそのまま受け取ります
markdownText = json.text || e.postData.contents;
// もしJSON変換でエラーが起きた場合の処理です
} catch (error) {
// JSON形式じゃなくて、ただの文字として送られてきたらそのまま受け取ります
markdownText = e.postData.contents;
// 安全装置1の終わりです
}
// 【安全装置2】万が一、データが空っぽだった場合の処理です
if (!markdownText) {
// ドキュメントにエラーメッセージを書き込むようにテキストを設定します
markdownText = "エラー:文章が空っぽでした。Difyの設定を確認してください。";
// 安全装置2の終わりです
}
// 【安全装置3】ここでどんな荷物も強制的に「純度100%の文字(String)」に変換します!これでエラーは起きません
markdownText = String(markdownText);
// Googleドキュメントを新しく作成し、タイトルを付けます
const doc = DocumentApp.create("【自動生成】Kindle原稿");
// ドキュメントの本文(白い紙の部分)を操作する準備をします
const body = doc.getBody();
// 最初から入っている不要な空行を1つ消しておきます
body.clear();
// 純度100%の文字を「改行」ごとにハサミで切り分けて、1行ずつのリストにします
const lines = markdownText.split("\n");
// 切り分けた1行ずつを順番に最後までチェックして、ドキュメントに書き込んでいく繰り返し処理です
for (let i = 0; i < lines.length; i++) {
// 今チェックしている1行分の文字を取り出します
let line = lines[i];
// もしその行が「### 」(見出し3の記号)から始まっていた場合の処理です
if (line.startsWith("### ")) {
// 先頭の「### 」という記号だけを削り取って消し、見出し3のデザインに設定します
body.appendParagraph(line.replace("### ", "")).setHeading(DocumentApp.ParagraphHeading.HEADING3);
// もしその行が「## 」(見出し2の記号)から始まっていた場合の処理です
} else if (line.startsWith("## ")) {
// 先頭の「## 」という記号だけを削り取って消し、見出し2のデザインに設定します
body.appendParagraph(line.replace("## ", "")).setHeading(DocumentApp.ParagraphHeading.HEADING2);
// もしその行が「# 」(見出し1の記号)から始まっていた場合の処理です
} else if (line.startsWith("# ")) {
// 先頭の「# 」という記号だけを削り取って消し、見出し1のデザインに設定します
body.appendParagraph(line.replace("# ", "")).setHeading(DocumentApp.ParagraphHeading.HEADING1);
// もしその行が何も書かれていない「空っぽの行」だった場合の処理です
} else if (line.trim() === "") {
// ドキュメントにも同じように空行(スペース)を1つ追加します
body.appendParagraph("");
// 上のどれにも当てはまらない、ただの「普通の文章」だった場合の処理です
} else {
// 何もデザインを変えずに、普通の文字としてドキュメントに追加します
body.appendParagraph(line);
// 条件分岐の終わりです
}
// 繰り返し処理の終わりです
}
// 無事に終わったことをDifyのシステムに報告してプログラムを終了します
return ContentService.createTextOutput("ドキュメント保存完了!");
// メインのプログラムの終わりです
}

STEP 2:Difyで「濃厚・自動執筆コンベア」を作る(完全手順)
ここからが本番です!Difyの「ワークフロー」を新規作成し、左から右へ順番にブロックを繋いでいきます。
① 開始ノード(社長の指示出し)
一番左にある「開始」ブロックです。ここで本のテーマを決める箱を作ります。
- ブロック内の「+」を押して「テキスト(String)」を選びます。
- 変数名を
themeにします。(これが本のテーマを入れる箱になります)
② LLMブロック(編集長AI)
開始ノードの右の「+」を押して「LLM」を追加します。ここで目次を作ります。
- プロンプトに以下を入力します。AIのお喋りを封じるのがコツです。以下のテーマで本を書きます。第1章〜第5章の目次を作成してください。 絶対ルール:出力は必ずJSON配列フォーマット
["第1章:〇〇", "第2章:〇〇"]のみとすること。挨拶は不要。 テーマ:{{#開始.theme#}}

③ コード実行ブロック(翻訳係)
LLMの右に「コード実行」を追加します。編集長の文字を「本物のリスト」に変換します。
- 入力変数に
textを作り、前のLLMの出力を選びます。 - 言語を
JavaScriptにして、以下をコピペします。
JavaScript
// 編集長(AI)が書いた文字のリストを、コンベアが読める「本物のリスト(配列)」に変換します
function main({text}) {
// 文字(String)を配列(Array)に変換して、target_arrayという名前で出力します
return { target_array: JSON.parse(text) };
// プログラムの終わりです
}
- 出力変数に
target_array(種類:Array)を設定します。

④ イテレーションブロック(ベルトコンベア)
コード実行の右に「イテレーション」を追加します。
- 「入力配列」の項目で、さっき作った
target_arrayを選びます。これで「5回繰り返すコンベア」の枠組みができました。

⑤ コンベアの中のLLM(ライターAI)★ここが超重要!
イテレーションの「大きな枠の中」にある「+」を押して「LLM」を追加します。 ここで**【文字数爆増プロンプト】と【リミッター解除】**を行います!
- プロンプトに以下をコピペします。
Plaintext
あなたは超一流のブックライターです。以下の【現在の章】について、読者を圧倒するほど濃密で長文の原稿を執筆してください。
【本のテーマ】:{{#開始.theme#}}
【本全体の目次】:{{#コード実行.target_array#}}
【現在の章】:{{#イテレーション.item#}}
**【文字数と深掘りの絶対ルール】**
AI特有の「薄い要約」は厳禁です。以下の構成を必ず守り、限界まで深掘りしてください。
1. 章の導入:読者の悩みに寄り添うフックから始める。
2. 小見出し1〜3(## を使用):必ず3つ以上の小見出しを作り、それぞれに「中学生でもわかる具体的な例え話」を交えて分厚く解説する。
3. 章のまとめ:次の章へ期待を持たせる言葉で締める。
※絶対に「はじめに」「おわりに」などの全体挨拶は書かず、マークダウン形式の原稿のみを出力すること。
- 【超重要】 LLMブロックの設定(歯車マークやパラメータ)を開き、「最大トークン数(Max Tokens)」を
2000〜4000程度まで引き上げます! これをやらないと、AIが途中で書くのをやめてしまいます。 - イテレーション自体の「出力変数」として、このLLMが書いたテキストを設定しておきます。

⑥ コード実行ブロック(製本係)
イテレーションの右側(外側)に「コード実行」を追加します。コンベアから出てきた5つの原稿をガッチャンコします。
- 入力変数に
text_listを作り、イテレーションの出力(Array)を選びます。 - 以下をコピペします。
JavaScript
// バラバラの5章分の文章を受け取って、1つの本にまとめるプログラムです
function main({text_list}) {
// 5つの文章を、改行と区切り線を使って「1つの長い文章」にホッチキスで繋ぎ合わせます
const combinedText = text_list.join("\n\n---\n\n");
// 繋ぎ合わせた完成品の文章を、「final_book」という名前で次の工程へ渡します
return { final_book: combinedText };
// プログラムの終わりです
}
- 出力変数に
final_book(種類:String)を設定します。

⑦ HTTPリクエスト & 終了ブロック(配達員)
いよいよ最後です!コード実行の右に「HTTPリクエスト」を追加します。
- メソッドを
POSTにします。 - URLに「STEP 1でコピーしたGASのウェブアプリURL」を貼り付けます。
- ボディを
JSONにし、以下を入力します。(変数は画面からfinal_bookを選んでください)
JSON
{
"text": "{{#コード実行 2.final_book#}}"
}
- 最後に右端に「終了」ブロックを繋げば……完全自動執筆工場の完成です!!!

まとめ:もう「AIの薄っぺらい文章」とは言わせない

同世代の皆さん、本当にお疲れ様でした! これにて、ただ自動なだけではなく、**「中身がギュッと詰まった分厚いKindle原稿」**がGoogleドキュメントに全自動で生成される最強システムが完成しました。
「文字数が足りない」という壁は、AIに「小見出しを3つ書け」と骨組みを強制し、最大トークン数のリミッターを外すことで一発で解決します。現場仕事と同じで、新人(AI)には「ここを重点的に、こういう手順で深くやってね」と具体的に指示を出すことが、プロの仕上がりを生む秘訣ですね。
PCに張り付くコピペ作業から完全に解放された今、あなたが行うのは「売れそうなテーマを考えること」だけです。この仕組みをフル回転させて、私たちオジサン世代の底力をKindle市場で見せつけてやりましょう!
次回はこのアプリを使って実際にキンドル本の登録をしようと思います。
Difyアプリではないですが、番外編ということで。
この記事が役に立った!という方は、ぜひブラウザのブックマーク登録と、コメント欄へのメッセージをお待ちしております!
次回も是非、お楽しみに!


コメント