<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>POがITでラクする仕事術</title>
	<atom:link href="https://shoelab.jp/feed/" rel="self" type="application/rss+xml" />
	<link>https://shoelab.jp</link>
	<description>ノンプログラマーでも簡単！GASと無料ツールで業務効率化を実現</description>
	<lastBuildDate>Sun, 19 Oct 2025 21:29:43 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://shoelab.jp/wp-content/uploads/2024/02/cropped-e14debba4b651ab77c82b66fca4377bf-32x32.png</url>
	<title>POがITでラクする仕事術</title>
	<link>https://shoelab.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>🧱 初心者向け｜DockerでつくるPHP開発環境（最小テンプレート付き）</title>
		<link>https://shoelab.jp/php/%f0%9f%a7%b1-%e5%88%9d%e5%bf%83%e8%80%85%e5%90%91%e3%81%91%ef%bd%9cdocker%e3%81%a7%e3%81%a4%e3%81%8f%e3%82%8bphp%e9%96%8b%e7%99%ba%e7%92%b0%e5%a2%83%ef%bc%88%e6%9c%80%e5%b0%8f%e3%83%86%e3%83%b3/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sun, 19 Oct 2025 03:00:00 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://shoelab.jp/?p=724</guid>

					<description><![CDATA[こんにちは、イカPOです。今日は Docker を使って PHP の開発環境をつくる 方法を紹介します。 AIによるコーディングが当たり前になった今、「バックエンド（見えない仕組み）をどう設計するか」がとても重要になって [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、イカPOです。<br>今日は <strong>Docker を使って PHP の開発環境をつくる</strong> 方法を紹介します。</p>



<p>AIによるコーディングが当たり前になった今、<br>「<strong>バックエンド（見えない仕組み）をどう設計するか</strong>」がとても重要になってきています。</p>



<p>でも、バックエンドってなんだか難しそう…と思う方も多いはず。<br>そこで今回は、最も手軽に学べるバックエンド言語「<strong>PHP</strong>」を題材に、<br><strong>自分のパソコンで動かせる最小の開発環境</strong> をつくってみましょう。</p>



<p>テンプレートはこちら</p>


<a rel="nofollow" target="_blank"  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://shoelab.jp/download/727/?tmstv=1760930364" id="download-link-727" data-redirect="false" >
	PHP開発環境最小テンプレート	(0 ダウンロード	)
</a>




<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>💬 注意：イカPOはPHP初心者です。<br>本記事は備忘録的にまとめているので、間違いがあればぜひ教えてください！</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc1">🧰 1. 事前準備</span></h2>



<h3 class="wp-block-heading"><span id="toc2">🐳 Docker Desktop をインストール</span></h3>



<p>公式サイト：👉 <a rel="nofollow noopener" target="_blank" href="https://www.docker.com/ja-jp/">https://www.docker.com/ja-jp/</a></p>



<p>Docker Desktopとは、あなたのPCの中に「仮想の小さなサーバー（＝コンテナ）」をつくるツールです。<br>ApacheやPHPを個別インストールしなくても、同じ構成をすぐ再現できます。</p>



<h3 class="wp-block-heading"><span id="toc3">🧩 VS Code（エディタ）を準備</span></h3>



<p>Docker拡張とも相性が良く、設定もシンプル。<br>初心者に最もおすすめのエディタです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc4">📁 2. 作業用フォルダを作る</span></h2>



<p>Windowsの場合は、ユーザーディレクトリ配下がトラブル少なめです。<br>パスに日本語やスペースが無い場所を推奨します。</p>



<p>例：</p>



<pre class="wp-block-code"><code>C:\Users\あなたのユーザー名\Work\php-baseapp-min
</code></pre>



<p>このフォルダに、最小テンプレート一式を置きます。<br>この記事はすでにこの構成を前提にしています。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc5">⚙️ 3. 最小テンプレートを配置する</span></h2>



<p>以下の構成が、今回使用する <strong>イカPOオリジナルの最小PHPテンプレート</strong> です。<br>（このひな形はイカPOが独自に作成したものです）</p>


<a rel="nofollow" target="_blank"  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://shoelab.jp/download/727/?tmstv=1760930364" id="download-link-727" data-redirect="false" >
	PHP開発環境最小テンプレート	(0 ダウンロード	)
</a>




<h3 class="wp-block-heading"><span id="toc6">フォルダ構成</span></h3>



<pre class="wp-block-code"><code>docker-compose.yml
Dockerfile
public/
 ├─ .htaccess
 └─ index.php
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc7">🧾 docker-compose.yml</span></h3>



<pre class="wp-block-code"><code>version: '3.8'

services:
  web:
    build: .
    ports:
      - "8080:80"
    volumes:
      - ./public:/var/www/html
    container_name: php83-apache-min
    environment:
      APP_ENV: local
</code></pre>



<h4 class="wp-block-heading"><span id="toc8">ポイント</span></h4>



<ul class="wp-block-list">
<li><code>build: .</code> → カレントディレクトリの Dockerfile でビルド</li>



<li><code>container_name:</code> → コンテナ名（任意）</li>



<li><code>ports:</code> → ローカル8080 → コンテナ内80番（Apache）</li>



<li><code>volumes:</code> → <strong>ローカルpublicをコンテナのドキュメントルートへマウント</strong></li>



<li><code>environment:</code> → 環境変数。<code>getenv('APP_ENV')</code> で参照可能</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>💡 public 内のファイルを編集すれば、<strong>ブラウザを更新するだけで変更を確認可能</strong>（自動リロードではなく手動更新で反映）。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc9">🐘 Dockerfile</span></h3>



<pre class="wp-block-code"><code>FROM php:8.3-apache
RUN a2enmod rewrite
WORKDIR /var/www/html
</code></pre>



<h4 class="wp-block-heading"><span id="toc10">補足：</span></h4>



<ul class="wp-block-list">
<li>ベース：<code>php:8.3-apache</code></li>



<li><code>a2enmod rewrite</code> → <code>.htaccess</code> のURL書き換え機能を有効化</li>



<li><code>WORKDIR</code> → コンテナの作業フォルダを <code>/var/www/html</code> に指定</li>
</ul>



<p>この3行で「PHP + Apache が動く最小のWebサーバー」が構築されます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc11">💬 public/index.php</span></h3>



<pre class="wp-block-code"><code>&lt;?php
date_default_timezone_set('Asia/Tokyo');
echo "&lt;h1&gt;PHP Minimal Starter&lt;/h1&gt;";
echo "PHP version: " . phpversion() . "&lt;br&gt;";
echo "Time: " . date('Y-m-d H:i:s');
?&gt;
</code></pre>



<p>最小の「動いていることがわかる」サンプルです。<br>編集して保存し、ブラウザを再読み込みすれば即反映します。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc12">🧩 public/.htaccess</span></h3>



<pre class="wp-block-code"><code>RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php &#091;L]
</code></pre>



<p>存在しないURLをすべて <code>index.php</code> に転送するルールです。<br>これにより、PHP側でURLに応じた処理を記述できるようになります。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc13">🚀 4. 起動してみよう</span></h2>



<p>Docker Desktopを起動して</p>



<p>ターミナルでプロジェクトフォルダへ移動し、次を実行👇</p>



<pre class="wp-block-code"><code>docker compose up -d
</code></pre>



<p>初回はベースイメージのダウンロードで少し時間がかかります。<br>完了したらブラウザで：</p>



<p>👉 <a rel="nofollow noopener" target="_blank" href="http://localhost:8080/">http://localhost:8080</a></p>



<p>を開きましょう。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc14">表示例</span></h3>



<pre class="wp-block-code"><code>PHP Minimal Starter
PHP version: 8.3.x
Time: 2025-10-18 12:34:56
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc15">よく使うコマンド</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>操作</th><th>コマンド</th></tr></thead><tbody><tr><td>停止</td><td><code>docker compose down</code></td></tr><tr><td>再起動（構成変更後）</td><td><code>docker compose up -d --build</code></td></tr><tr><td>ログ確認</td><td><code>docker compose logs -f web</code></td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc16">📘 主要3ファイルの説明</span></h2>



<p>ここからは、今回のテンプレートを動かすうえで欠かせない<br>3つの設定ファイルについて、具体的に説明します。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc17">🧩 .htaccess（Apacheの設定ファイル）</span></h3>



<p><code>.htaccess</code> は <strong>Apache サーバーの動作ルールをフォルダ単位で指定する設定ファイル</strong> です。<br>今回の Docker 環境では <code>/var/www/html</code>（＝<code>public/</code>）以下に配置され、<br>URLの書き換えやアクセス制御を行います。</p>



<pre class="wp-block-code"><code>RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php &#091;L]
</code></pre>



<p>これは「アクセスされたパスに実際のファイルやディレクトリがなければ、<br>すべて <code>index.php</code> に処理を渡す」という意味です。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>✅ <code>.htaccess</code> は <strong>「すべてのリクエストをPHPで受け止める」ための設定ファイル</strong> です。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc18">🧱 Dockerfile（PHP+Apache環境を構築する手順書）</span></h3>



<p><code>Dockerfile</code> は <strong>PHP と Apache が動く環境を構築するための設定ファイル</strong> です。<br>Dockerはこのファイルを読み込み、指定された環境を自動的に作ります。</p>



<pre class="wp-block-code"><code>FROM php:8.3-apache
RUN a2enmod rewrite
WORKDIR /var/www/html
</code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>行</th><th>内容</th></tr></thead><tbody><tr><td><code>FROM php:8.3-apache</code></td><td>PHP8.3 と Apache の公式Dockerイメージを使う</td></tr><tr><td><code>RUN a2enmod rewrite</code></td><td><code>.htaccess</code> のURL書き換え機能を有効化する</td></tr><tr><td><code>WORKDIR /var/www/html</code></td><td>コンテナ内の作業ディレクトリを設定</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc19">⚙️ docker-compose.yml（環境全体の構成設定）</span></h3>



<p><code>docker-compose.yml</code> は <strong>複数のコンテナ（サービス）をまとめて起動・管理する設定ファイル</strong> です。<br>今回は PHP サーバーのみですが、MySQLなどを追加する場合もこのファイルで管理します。</p>



<pre class="wp-block-code"><code>version: '3.8'

services:
  web:
    build: .
    ports:
      - "8080:80"
    volumes:
      - ./public:/var/www/html
    container_name: php83-apache-min
    environment:
      APP_ENV: local
</code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>内容</th></tr></thead><tbody><tr><td><code>build:</code></td><td>同フォルダ内の <code>Dockerfile</code> を使って構築</td></tr><tr><td><code>ports:</code></td><td>ホストPCの8080番 → コンテナの80番を接続</td></tr><tr><td><code>volumes:</code></td><td>ローカル <code>public/</code> フォルダを <code>/var/www/html</code> にマウント</td></tr><tr><td><code>container_name:</code></td><td>コンテナ名（任意、変更可能）</td></tr><tr><td><code>environment:</code></td><td>PHP側から取得できる環境変数を設定</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc20">📦 10. ファイル名やプロジェクト名を変えるとき</span></h2>



<p>Dockerは、<strong>フォルダ単位で環境を認識</strong>します。<br>そのため、フォルダ名やファイル名を変更しても動作しますが、<br>いくつかの注意点があります。</p>



<h3 class="wp-block-heading"><span id="toc21">✅ プロジェクトを複製したい場合</span></h3>



<ol class="wp-block-list">
<li>元のフォルダをコピーして、任意の新しい名前をつける <code>php-baseapp-min → php-todoapp</code></li>



<li>ファイル名（<code>docker-compose.yml</code>、<code>Dockerfile</code>）はそのままでOK</li>



<li>ただし、<strong><code>container_name:</code> は変更推奨</strong> 。同名のコンテナが重なると起動エラーになります。<code>docker-compose.ym</code>lは確認しましょう。</li>



<li>起動時は、新しいフォルダへ移動してから <strong><code>docker compose up -d</code> </strong>を実行すれば完了。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc22">🧩 新しいPHPプロジェクトを作るとき</span></h3>



<ol class="wp-block-list">
<li>新しいフォルダを作る（例：<code>php-loginapp</code>）</li>



<li>このテンプレートをコピーして配置</li>



<li><code>public/index.php</code> を必要な内容に変更</li>



<li><code>docker-compose.yml</code> 内の <code>container_name</code> を変更</li>
</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>💡 Dockerは「フォルダ＝1プロジェクト」として扱うため、<br>同じテンプレートを何度でもコピーして新しい環境を作れます。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc23">❌ やってはいけないこと</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>操作</th><th>理由</th></tr></thead><tbody><tr><td>docker-compose.yml を他の場所に移動する</td><td><code>build: .</code> の相対パスが壊れる</td></tr><tr><td>同名のコンテナを同時起動する</td><td>container_name が重複してエラーになる</td></tr><tr><td>public フォルダを削除する</td><td>Apache がルートを見失う</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc24">🧭 11. まとめ</span></h2>



<ul class="wp-block-list">
<li>Dockerを使えば、数分でPHP環境を再現できる</li>



<li><code>docker compose up -d</code> で起動 → <code>http://localhost:8080</code> で確認</li>



<li><code>public</code> を DocumentRoot にすることで安全・シンプル</li>



<li><strong>フォルダ単位で複製・再利用できる（container_name は変更推奨）</strong></li>
</ul>



<p><strong>本記事のテンプレートはイカPOオリジナル設計</strong>です。改善点等あれば教えてください。</p>


<a rel="nofollow" target="_blank"  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://shoelab.jp/download/727/?tmstv=1760930364" id="download-link-727" data-redirect="false" >
	PHP開発環境最小テンプレート	(0 ダウンロード	)
</a>




<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc25">▶ 次回予告</span></h2>



<p>次回は、この環境を使って<br><strong>シンプルなPHPアプリ（ログイン機能つき</strong>）を作っていきます。<br>お楽しみに🦑！</p>



<h6 class="wp-block-heading"><span id="toc26">🛡️ 免責文</span></h6>



<p>本記事は教育・情報提供を目的として作成しています。<br>内容の正確性には細心の注意を払っていますが、<br>動作環境やバージョンによる差異については保証できません。<br>実際の運用はご自身の責任で行ってください。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Python＋gTTS＋MoviePyでブログ記事を自動ナレーション動画化する方法</title>
		<link>https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/python%ef%bc%8bgtts%ef%bc%8bmoviepy%e3%81%a7%e3%83%96%e3%83%ad%e3%82%b0%e8%a8%98%e4%ba%8b%e3%82%92%e8%87%aa%e5%8b%95%e3%83%8a%e3%83%ac%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e5%8b%95%e7%94%bb%e5%8c%96/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sat, 16 Aug 2025 03:00:00 +0000</pubDate>
				<category><![CDATA[AI系]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://shoelab.jp/?p=702</guid>

					<description><![CDATA[こんにちは、イカPOです。 今回は 「ChatGPTとPythonを組み合わせて、画像とナレーションから自動で動画を作る方法」 を紹介します。 記事を ChatGPT で要約し、台本化したテキストを gTTS でナレーシ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、イカPOです。</p>



<p>今回は <strong>「ChatGPTとPythonを組み合わせて、画像とナレーションから自動で動画を作る方法」</strong> を紹介します。</p>



<p>記事を ChatGPT で要約し、台本化したテキストを gTTS でナレーション音声に変換。その音声とスライド画像を MoviePy で結合すれば、ワンクリックで動画が完成します。</p>



<p>手順はシンプルで、</p>



<ol class="wp-block-list">
<li>スライドを用意する</li>



<li>原稿を用意する</li>



<li>Python スクリプトを実行する<br>──これだけです。</li>
</ol>



<p>スライド内容の要約や原稿作成は ChatGPT に任せれば、制作スピードは一気に加速。発表のアーカイブや、社内向けの教育・共有コンテンツを短時間で動画化したい場面に最適です。</p>



<p>さらに記事内には <strong>サンプルコードとZIPファイル（bat付き）</strong> を添付しています。Pythonさえインストールすれば、そのまま実行できる仕組みになっていますので、ぜひ試してみてください。</p>


<a rel="nofollow" target="_blank"  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://shoelab.jp/download/710/?tmstv=1760930365" id="download-link-710" data-redirect="false" >
	サンプルコード	(20 ダウンロード	)
</a>




<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc1">ライブラリ紹介 — gTTS と MoviePy をかんたん解説</span></h2>



<ul class="wp-block-list">
<li><strong>gTTS</strong>：文章→音声への変換が得意。声のイントネーションや句読点もキレイに反映してくれるのが最高。</li>



<li><strong>MoviePy</strong>：動画編集がコードで完結。Slidesスライドの結合〜ナレーションとの合体まで、一気に処理できる優れもの。</li>
</ul>



<p>どちらも「自動化」「再現性」「テキスト軸」の強みがあって、<strong>記事やスライドから動画コンテンツを自動生成したい</strong>って人には超おすすめです。</p>



<h3 class="wp-block-heading"><span id="toc2">gTTS（Google Text-to-Speech）</span></h3>



<p>Google 翻訳の読み上げ機能を Python から扱えるライブラリで、文章をそのまま <strong>MP3音声ファイル</strong> に変換できます。<br><code>lang="ja"</code> を指定すれば日本語の読み上げも可能で、句読点を多めに入れるとより自然な読み上げになります。<br>軽量で導入が簡単であり、読み仮名や略語の補正など前処理で発音をコントロールできる点も特徴です。</p>



<p>インストールはターミナルまたはコマンドプロンプトで</p>



<pre class="wp-block-code"><code>pip install gTTS</code></pre>



<p>と入力するだけです。<br>例えば、以下のコードで簡単に音声ファイルが作成できます。</p>



<pre class="wp-block-code"><code>from gtts import gTTS
tts = gTTS("こんにちは、ブログを音声にします。", lang="ja")
tts.save("output.mp3")</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc3">MoviePy（Pythonで動画編集まるごと）</span></h3>



<p>Python で動画編集を自動化できるライブラリです。カット、連結、タイトル挿入、音声合成、速度変更などをスクリプトでまとめて処理できます。<br>GIF や MP4 など多数のフォーマットに対応し、裏では ffmpeg を利用して高品質な動画を生成します。直感的な API で、数行のコードでも複雑な編集が可能です。</p>



<p>インストールはターミナルまたはコマンドプロンプトで</p>



<pre class="wp-block-code"><code>pip install moviepy</code></pre>



<p>としますが、もし</p>



<pre class="wp-block-code"><code>ModuleNotFoundError: No module named 'moviepy.editor'</code></pre>



<p>というエラーが出た場合は、安定して動くこちらのバージョンを使ってください。</p>



<pre class="wp-block-code"><code>pip install moviepy==2.0.0.dev2</code></pre>



<h5 class="wp-block-heading"><span id="toc4">サンプルコード（画像→動画）</span></h5>



<p>まず、<strong>ダミー画像</strong>をダウンロードして、スクリプトと同じフォルダに置きます。<br><a target="_blank" href="https://shoelab.jp/wp-content/uploads/2025/08/dummy_image.png">📷 dummy_image.png をダウンロード</a></p>



<p>そのうえで、以下のコードを <code>img_to_video.py</code> として保存し、実行します。</p>



<pre class="wp-block-code"><code># img_to_video.py
from moviepy.editor import ImageClip

# ダミー画像（同一フォルダの dummy_image.png）を5秒の動画に変換
clip = ImageClip("dummy_image.png").set_duration(5)

# mp4として出力（24fps）
clip.write_videofile("result_from_image.mp4", fps=24)
</code></pre>



<h6 class="wp-block-heading"><span id="toc5">ディレクトリ構成（最小）</span></h6>



<pre class="wp-block-code"><code>moviepy_image_sample/
├─ img_to_video.py # コード
├─ dummy_image.png      # ← ダウンロードした画像をここに置く
└─ result_from_image.mp4  # 実行後に生成</code></pre>



<p><br>こんな感じのディレクトリ構成でサンプルは動きます。<br>了解。<strong>実装編</strong>を「必要なもの」中心に再構成しました。サンプルコードは出さず、**ディレクトリ構成（最小）**だけ掲載しています。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc6">実装編。画像とナレーションテキストを用意して動画をつくろう</span></h2>



<p>実際に画像とナレーションを用意して動画を作る方法を紹介します。サンプルコードも用意しているので試しに動かしてみてください。記事の最後にクリックで動くbat付きZIＰファイルを用意してるので、そちらも参考にしてください。</p>



<h3 class="wp-block-heading"><span id="toc7">コードを動かすのに必要なものリスト</span></h3>



<ul class="wp-block-list">
<li><strong>Python 3.11</strong><br>本ワークフローは 3.11 系で動作確認しています。</li>



<li><strong><code>main_simple.py</code></strong><br>この記事で配布しているスクリプト。<code>narration.txt</code> の本文をそのまま gTTS で読み上げます。</li>



<li><strong>ナレーションテキスト</strong>（<code>input/narration.txt</code>）<br>セクションは <code>#</code> で区切り、<strong>1行目がタイトル／2行目以降が本文</strong>。本文が音声になります。</li>



<li><strong>画像（任意）</strong><br><code>input/slide_0.png</code>, <code>input/slide_1.jpg</code>… のように番号付きで置くと、そのセクションの静止画として差し込みます。画像が無いセクションは自動生成のタイトルカード（黒地＋タイトル）になります。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc8">ディレクトリ構成（最小）</span></h3>



<pre class="wp-block-code"><code>project/
├─ main.py
├─ input/
│  ├─ narration.txt      # 原稿（本文）— 「#」で区切り、1行目=タイトル／以降=本文
│  ├─ slide_0.png        # 任意：セクション0の画像
│  └─ slide_1.jpg        # 任意：セクション1の画像…
├─ output/               # 自動出力（final_video.mp4）
└─ temp/                 # 中間ファイル（音声など）
</code></pre>



<h3 class="wp-block-heading"><span id="toc9">サンプルコード</span></h3>



<pre class="wp-block-code"><code>import os
from gtts import gTTS
from moviepy.editor import (
    AudioFileClip, ImageClip, CompositeVideoClip, ColorClip,
    concatenate_videoclips, vfx
)
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import contextlib

# ===== 設定 =====
INPUT_DIR  = "input"
OUTPUT_DIR = "output"
TEMP_DIR   = "temp"
SIZE       = (1280, 720)
FPS        = 24

os.makedirs(OUTPUT_DIR, exist_ok=True)
os.makedirs(TEMP_DIR, exist_ok=True)

# ===== タイトル画像生成（スライドが無い場合用） =====
def make_title_clip(title: str, duration: float, size=SIZE):
    w, h = size
    img = Image.new("RGB", size, (0, 0, 0))
    draw = ImageDraw.Draw(img)

    font_candidates = &#091;
        "Yu Gothic UI.ttf", "YuGothR.ttc", "Meiryo.ttc",
        "/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc",
    ]
    font = None
    for path in font_candidates:
        try:
            font = ImageFont.truetype(path, size=64)
            break
        except:
            pass
    if font is None:
        font = ImageFont.load_default()

    max_w = int(w * 0.9)
    lines, line = &#091;], ""
    for ch in title:
        tw, _ = draw.textbbox((0, 0), line + ch, font=font)&#091;2:]
        if tw &lt;= max_w:
            line += ch
        else:
            lines.append(line)
            line = ch
    if line:
        lines.append(line)

    total_h = sum(draw.textbbox((0, 0), l, font=font)&#091;3] for l in lines) + 10 * (len(lines) - 1)
    y = (h - total_h) // 2
    for l in lines:
        _, _, tw, th = draw.textbbox((0, 0), l, font=font)
        x = (w - tw) // 2
        draw.text((x, y), l, fill=(255, 255, 255), font=font)
        y += th + 10

    return ImageClip(np.array(img)).set_duration(duration)

def find_slide_image(index: int):
    for ext in (".png", ".jpg", ".jpeg", ".webp"):
        p = os.path.join(INPUT_DIR, f"slide_{index}{ext}")
        if os.path.exists(p):
            return p
    return None

# ===== 原稿読み込み =====
with open(os.path.join(INPUT_DIR, "narration.txt"), "r", encoding="utf-8") as f:
    raw = f.read()

# 「#」区切りでセクション分割
sections = &#091;s.strip() for s in raw.split("#") if s.strip()]

video_clips = &#091;]

for i, section in enumerate(sections):
    lines = section.splitlines()
    if not lines:
        continue

    title = lines&#091;0].strip()
    body = "\n".join(lines&#091;1:]).strip()
    if not body:
        continue

    # 音声生成
    voice_path = os.path.join(TEMP_DIR, f"voice_{i}.mp3")
    tts = gTTS(body, lang="ja")
    tts.save(voice_path)

    audio_clip = AudioFileClip(voice_path)
    duration = audio_clip.duration

    # 画像
    image_path = find_slide_image(i)
    if image_path:
        img_clip = ImageClip(image_path).set_duration(duration)
    else:
        bg = ColorClip(size=SIZE, color=(0, 0, 0), duration=duration)
        title_clip = make_title_clip(title, duration)
        img_clip = CompositeVideoClip(&#091;bg, title_clip.set_position("center")], size=SIZE).set_duration(duration)

    clip = img_clip.set_audio(audio_clip)
    video_clips.append((clip, audio_clip))

# ===== 出力 =====
if not video_clips:
    raise RuntimeError("動画にできるクリップがありません。")

final = concatenate_videoclips(&#091;vc for vc, _ in video_clips], method="compose")
final = final.fx(vfx.speedx, 1.5)

out_path = os.path.join(OUTPUT_DIR, "final_video.mp4")
final.write_videofile(out_path, fps=FPS)

# 後片付け
with contextlib.suppress(Exception):
    final.close()
for vc, ac in video_clips:
    with contextlib.suppress(Exception):
        vc.close()
        ac.close()

print(f"&#091;done] {out_path}")</code></pre>



<h3 class="wp-block-heading"><span id="toc10">メモ（調整ポイントだけ）</span></h3>



<ul class="wp-block-list">
<li><strong>再生速度</strong>は <code>main.py</code> の終盤、<code>vfx.speedx(1.5)</code> の係数を変更（等速=1.0）。</li>



<li><strong>出力サイズ</strong>は <code>SIZE = (1280, 720)</code> を変更（例：縦動画は <code>(720, 1280)</code>）。</li>
</ul>



<p>以上を揃えれば、原稿と画像を置くだけで動画が書き出せます。</p>



<h4 class="wp-block-heading"><span id="toc11">画像ついての注意点</span></h4>



<div class="wp-block-group is-style-alert-box is-layout-constrained wp-block-group-is-layout-constrained">
<p><strong>画像ファイルは必ず連番で命名</strong><br>例：<code>slide_0.png</code>, <code>slide_1.jpg</code>, <code>slide_2.png</code> …</p>



<p><strong>slide_0 は特別枠（タイトル用）</strong></p>



<ul class="wp-block-list">
<li><code>slide_0.xxx</code> があれば冒頭のタイトルシーンに使われます</li>



<li>無ければ自動で黒背景＋タイトルテキストが生成されます</li>
</ul>



<p><strong>slide_1 以降が本文のスライド</strong></p>



<ul class="wp-block-list">
<li>それぞれのセクションに対応</li>



<li>拡張子は <code>.png</code>, <code>.jpg</code>, <code>.jpeg</code>, <code>.webp</code> のいずれでもOK</li>
</ul>



<p><strong>スライドが存在しない場合</strong></p>



<ul class="wp-block-list">
<li>そのセクションは黒背景＋タイトルテキストが表示されます</li>
</ul>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc12">簡単に実行手順</span></h2>



<p>Pythonの知識は不要です。ZIPを解凍して下記の順に進めるだけでOK。</p>



<p>サンプルコードはこちら</p>


<a rel="nofollow" target="_blank"  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://shoelab.jp/download/710/?tmstv=1760930365" id="download-link-710" data-redirect="false" >
	サンプルコード	(20 ダウンロード	)
</a>




<ol class="wp-block-list">
<li><strong>Python 3.11 をインストール</strong>
<ul class="wp-block-list">
<li><a rel="nofollow noopener" target="_blank" href="https://www.python.org/downloads/release/python-3119/">公式サイト</a>から入手</li>



<li>インストール時に「Add Python to PATH」に必ずチェック</li>



<li>確認：<code>python --version</code> → <code>Python 3.13.x</code> と表示されればOK</li>
</ul>
</li>



<li><strong>添付のZIPファイルを解凍</strong><br>解凍後のフォルダに <code>main.py</code>、<code>run.bat</code>、<code>input</code> フォルダがあります。</li>



<li><strong>ナレーションテキストに原稿を貼る</strong>
<ul class="wp-block-list">
<li><code>input/narration.txt</code> に動画化したい原稿を貼り付け</li>



<li># 原稿（本文）— 「#」で区切りで</li>
</ul>
</li>



<li><strong>スライド画像を入れる</strong>
<ul class="wp-block-list">
<li><code>input/slide_0.png</code>、<code>input/slide_1.jpg</code>… の形式で置くと、そのシーンに反映</li>



<li>無ければ自動でタイトルカード生成</li>
</ul>
</li>



<li><strong><code>run.bat</code> をクリック</strong>
<ul class="wp-block-list">
<li>初回は必要なライブラリが自動インストールされます</li>



<li>完成動画は <code>output/final_video.mp4</code> に出力</li>
</ul>
</li>
</ol>



<h4 class="wp-block-heading"><span id="toc13">ナレーションテキストのルール</span></h4>



<ol class="wp-block-list">
<li><strong>区切りは「#」</strong>
<ul class="wp-block-list">
<li>各セクションは <code>#</code> から始めます。</li>



<li><code>#</code> の行は「スライドタイトル」になり、動画に表示されます。</li>
</ul>
</li>



<li><strong>読み上げは本文のみ</strong>
<ul class="wp-block-list">
<li><code>#</code> 行（スライドタイトル）は読み上げません。</li>



<li>読ませたい場合は、タイトルを本文にも書きます。</li>
</ul>
</li>



<li><strong>空行は無視</strong>
<ul class="wp-block-list">
<li>空白行は自動的にスキップされます。</li>
</ul>
</li>



<li><strong>日本語はそのまま書けばOK</strong>
<ul class="wp-block-list">
<li>gTTS が自然に読み上げます。</li>



<li>読みにくい場合は句読点（、。）を増やすと自然になります。</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h5 class="wp-block-heading"><span id="toc14">サンプル（input/narration.txt の例）</span></h5>



<pre class="wp-block-code"><code># はじめに
はじめに
この動画では Python と MoviePy を使って、
画像とナレーションから動画を自動生成する方法を紹介します。

# ライブラリについて
ライブラリについて
まず gTTS で日本語音声を生成し、
MoviePy で動画に合成します。

# まとめ
まとめ
Python と数行のコードで、
スライドつきのナレーション動画が作成できます。
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc15">まとめ</span></h2>



<p>ChatGPTで作成した原稿を gTTS で音声化し、MoviePy で画像と結合することで、誰でも手軽にスライド付きの動画を自動生成できます。画像がなくても自動でタイトルカードを生成でき、速度やサイズもコードの一部を変えるだけで調整可能です。発表のアーカイブや社内資料の動画化など、時短に役立つワークフローなのでぜひ活用してみてください。</p>



<p>サンプルコードはこちらから</p>


<a rel="nofollow" target="_blank"  data-e-Disable-Page-Transition="true" class="download-link" title="" href="https://shoelab.jp/download/710/?tmstv=1760930365" id="download-link-710" data-redirect="false" >
	サンプルコード	(20 ダウンロード	)
</a>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ChatGPTは本当に役立つのか？ 現場で試した義肢装具士が教える良いところ・悪いところ</title>
		<link>https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/chatgpt%e3%81%af%e6%9c%ac%e5%bd%93%e3%81%ab%e5%bd%b9%e7%ab%8b%e3%81%a4%e3%81%ae%e3%81%8b%ef%bc%9f-%e7%8f%be%e5%a0%b4%e3%81%a7%e8%a9%a6%e3%81%97%e3%81%9f%e7%be%a9%e8%82%a2%e8%a3%85%e5%85%b7%e5%a3%ab/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sun, 29 Jun 2025 03:00:00 +0000</pubDate>
				<category><![CDATA[AI系]]></category>
		<guid isPermaLink="false">https://shoelab.jp/?p=692</guid>

					<description><![CDATA[こんにちは。イカPOです。今回は、ChatGPT Plus に1年間課金して使ってみて「これは便利！」と思ったこと、逆に「これはちょっとなぁ…」と思ったことをまとめてみました。 「AIって流行ってるけど、結局何ができるの [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。イカPOです。<br>今回は、ChatGPT Plus に1年間課金して使ってみて「これは便利！」と思ったこと、逆に「これはちょっとなぁ…」と思ったことをまとめてみました。</p>



<p>「AIって流行ってるけど、結局何ができるの？」「自分の仕事には関係ないんじゃ？」と思っている人や、「試してみたけど、あまりうまく使えなかった」という人に向けて、義肢装具士として現場で働きながら感じたリアルな感想をお届けします。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc1">ChatGPT Plusをどう活用？利用環境とスタイルを徹底紹介</span></h2>



<h3 class="wp-block-heading"><span id="toc2">使っているAIはChatGPT Plus</span></h3>



<p>ChatGPT Plus（有料版）を使っています。対話の上限数を増やすために課金しました。あとは単純。課金してるから「使わなきゃ損」という気持ちでいろいろ試してきました。</p>



<h3 class="wp-block-heading"><span id="toc3">PC・iPad・iPhone別｜ChatGPTが最も“使える”シーン</span></h3>



<ul class="wp-block-list">
<li><strong>PC（Windows）</strong><br>自宅や事務所などで、腰を据えて作業するときに使用。マルチモニター環境が一番快適です。</li>



<li><strong>iPad（第10世代）</strong><br>出先や移動中の作業に活用。画面も大きく、軽く使うには十分です。</li>



<li><strong>iPhone SE（第3世代）</strong><br>隙間時間にメモ代わりに使ったり、文章のアイデア出しなど簡易的な用途に便利。Apple Intelligence は使えませんが、GPTで十分です。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc4">ChatGPT便利ワザ5選で業務効率化</span></h2>



<h3 class="wp-block-heading"><span id="toc5">【メリット①】メール・報告書を秒速仕上げ！ChatGPT文章術</span></h3>



<p>メールや報告書、ブログ記事など、文章を書く時間が大幅に減りました。<br>書きたいことをざっと箇条書きにして渡せば、用途に合わせた文体で整えてくれる。<br>特に「上司向け」「報告書用」「ブログ向け」といった指示で、それっぽく仕上げてくれるのがありがたいです。<br>義肢装具士の仕事は“文章でお金を稼ぐ”わけではないので、ここが短縮できるのは本当に助かります。</p>



<h3 class="wp-block-heading"><span id="toc6">【メリット②】AI壁打ちでアイデア整理がはかどる理由</span></h3>



<p>業務アイデアの整理はもちろん、<strong>ブログ運営や引っ越し計画、ダイエット、家族イベントの段取り</strong>まで──とにかく何でも ChatGPT に壁打ちしています。やり方はシンプルで、</p>



<ol class="wp-block-list">
<li><strong>思考の“素材”をそのまま投げる</strong>
<ul class="wp-block-list">
<li>例）「来月引っ越すか迷ってる。メリット・デメリットを箇条書きで整理したい」</li>



<li>例）「ブログのネタが渋滞中。カテゴリ別に優先順位を付けて一覧化して」</li>
</ul>
</li>



<li><strong>GPTが骨組みを作る</strong>
<ul class="wp-block-list">
<li>引っ越しなら“家賃／通勤時間／保育園の空き状況”など評価軸をテーブル化</li>



<li>ブログなら“検索ボリューム／競合性／自分の得意度”でスコアリング</li>
</ul>
</li>



<li><strong>自分の視点を上書き</strong>
<ul class="wp-block-list">
<li>「家賃は多少上がっても通勤が楽ならOK」など条件を追記</li>



<li>GPTが再度リストを更新、優先順位を再計算</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading"><span id="toc7">メモリー機能を絡めると、さらに便利</span></h4>



<ul class="wp-block-list">
<li><strong>過去の計画を自動で持ち出す</strong><br>「去年立てた“体脂肪率18％計画”と今回のダイエット案、どこが変わった？」と聞くと、前回の食事スケジュールや運動メニューを引用しながら違いを比較してくれる。</li>



<li><strong>“思考ログ”としての役割</strong><br>週1で「今週やったこと／来週やること」を GPT にメモするだけで、自分用の業務週報が出来上がる。1か月後に振り返ると「先月は勉強時間が足りてなかったですね」と GPT が指摘し、改善案を提案してくれるのが地味に刺さる。</li>



<li><strong>家族タスクの進捗管理にも転用</strong><br>引っ越し準備リストをメモリーに保存 → 新しい ToDo を投げると「それは『粗大ごみの手配』ステップですね」と紐づけてくれる。妻との共有メモをわざわざ更新しなくても、会話を進めるだけで自分専用の進捗表が育つ感覚。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>要は <strong>「頭の中のモヤ → 具体的な文字列」</strong> へ瞬時に変換してくれるので、<strong>考える労力より“判断するエネルギー”にリソースを割ける</strong> のが最大のメリット。メモリー機能を併用すると、<strong>過去の自分との“差分”が見える→PDCAが自然に回る</strong> 感覚がクセになります。</p>



<h3 class="wp-block-heading"><span id="toc8">【メリット③】コードも丸投げもやり方次第！プロトタイプ生成時短効果</span></h3>



<p>趣味で Web制作や会社のコンテンツづくりもしていますが、GPTがいないともう無理です。<br>「こういうことをしたい」と投げると、サンプルコードを一瞬で作ってくれる。<br>そこからちょっとずつ改良していく、という使い方が定着しました。<br>プロトタイプ（試作品）は丸投げしてもそこそこの形に仕上がるので、スピード重視の時は非常に便利。</p>



<p>例えばこんな感じのプロトタイプも一瞬で作ってくれます。</p>



<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="OPVqoNa" data-pen-title="Untitled" data-user="ysk-tmzw" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a rel="nofollow noopener" target="_blank" href="https://codepen.io/ysk-tmzw/pen/OPVqoNa">
  Untitled</a> by ysk tmzw (<a rel="nofollow noopener" target="_blank" href="https://codepen.io/ysk-tmzw">@ysk-tmzw</a>)
  on <a rel="nofollow noopener" target="_blank" href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc9">【メリット④】受注データを自動集計！ChatGPT×Python活用例</span></h3>



<p>下肢装具の受注データを集計する作業があり、GPTに具体的な要件を渡して Python スクリプトを書かせたら、なんと動きました。<br>「担当者別・装具別の月次集計」「法別の集計」など、細かい条件を一つずつ指定し、それを確認させながら進めることで思った通りの表が完成。<br>これはかなり感動しました。</p>



<p>実際にGPTに投げたプロンプトは、以下のようなものです：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<div class="wp-block-group is-style-information-box is-layout-constrained wp-block-group-is-layout-constrained">
<p>下肢装具の受注件数を集計し表を作成してください。</p>



<h5 class="wp-block-heading"><span id="toc10">必要な表</span></h5>



<ul class="wp-block-list">
<li>月単位での担当者別の長下肢装具、短下肢装具の受注件数</li>



<li>担当者単位で月ごとの集計（長下肢装具、短下肢装具の受注件数）</li>



<li>法別の集計</li>
</ul>



<h6 class="wp-block-heading"><span id="toc11">集計する対象列</span></h6>



<ul class="wp-block-list">
<li>担当者：K列</li>



<li>対象項：R列</li>



<li>法別：G列</li>
</ul>



<h5 class="wp-block-heading"><span id="toc12">月の条件（E列：受注年月日）</span></h5>



<p>7月度：2024年6月20日 ～ 2024年7月19日<br>8月度：2024年7月20日 ～ 2024年8月19日<br>9月度：2024年8月20日 ～ 2024年9月19日<br>10月度：2024年9月20日 ～ 2024年10月19日<br>11月度：2024年10月20日 ～ 2024年11月19日<br>12月度：2024年11月20日 ～ 2024年12月19日<br>1月度：2024年12月20日 ～ 2025年1月19日<br>2月度：2025年1月20日 ～ 2025年2月19日<br>3月度：2025年2月20日 ～ 2025年3月19日<br>4月度：2025年3月20日 ～ 2025年4月19日<br>5月度：2025年4月20日 ～ 2025年5月19日<br>6月度：2025年5月20日 ～ 2025年6月19日</p>



<h5 class="wp-block-heading"><span id="toc13">月単位での担当者別集計レイアウト</span></h5>



<ul class="wp-block-list">
<li>シート名：担当者名</li>



<li>列：長下肢装具、短下肢装具</li>



<li>行：月度（7月度から6月度まで）<br>※各担当者ごとにシートを作成すること</li>
</ul>



<h5 class="wp-block-heading"><span id="toc14">月度ごとの集計レイアウト（担当者単位）</span></h5>



<ul class="wp-block-list">
<li>シート名：月度</li>



<li>列：長下肢装具、短下肢装具、合計</li>



<li>行：担当者名（各担当者につき1行）<br>※月度ごとにシートを作成すること</li>
</ul>



<h5 class="wp-block-heading"><span id="toc15">法別の集計</span></h5>



<ul class="wp-block-list">
<li>シート名：法別集計</li>



<li>列：法別名（各法別ごとに列）</li>



<li>行：担当者名（各担当者ごとに表を作成）</li>
</ul>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>このプロンプトを投げて、GPTの出力内容を確認しながら「条件を理解しているか？」を逐一チェック。<br>そのうえで Python スクリプトを書かせたところ、想像以上に正確な出力が得られました。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>このように、「やってほしいことを明確に言語化する」ことで、AIとのやりとりは格段にうまくいくようになります。<br>逆に、こちらの曖昧な指示がミスの原因になることも多いので、<strong>言葉にする力（プロンプト力）</strong>が大事だと感じた事例でした。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc16">【メリット⑤】メモリー機能で“専属AI化”！回答精度が劇的UP</span></h3>



<p>Plus版ではメモリー機能が使えるので、私の職業や住んでいる地域、過去の相談内容などを覚えたうえで会話ができます。<br>ちょっとしたお出かけの相談でも「その距離なら疲れそうですね」と返ってきたり、転職や家計の見直しも“前提”を踏まえて考えてくれる。<br>まさに「相棒」的な存在になってくれています。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc17">ChatGPTの落とし穴4つと対策｜ハルシネーション・疲労感ほか</span></h2>



<h3 class="wp-block-heading"><span id="toc18">【デメリット①】ハルシネーション対策：嘘を見抜くチェック法</span></h3>



<p>とにかく、真偽が怪しい情報を平気で出してきます。<br>コーディングでも、文章でも、「一見それっぽいけど中身が違う」ということは日常茶飯事。<br>人間が最終確認しないと、普通に事故ります。<br>これはChatGPTだけでなく、他のAIにも共通する課題だと思います。</p>



<p>対策としては：</p>



<ul class="wp-block-list">
<li>丸投げしすぎない</li>



<li>出力を必ず自分の目で確認する</li>



<li>必要に応じて別の専門AIを使う</li>
</ul>



<p>です。</p>



<h3 class="wp-block-heading"><span id="toc19">【デメリット②】コピペが意外とめんどくさい</span></h3>



<p>メールの文章を生成して、それをコピペして貼る。<br>コードを生成して、それをIDEに貼る。<br>これ、回数が増えると地味に面倒です。<br>「コピペすらめんどくさい」と感じるくらい、楽に慣れてしまったんですね。</p>



<p>解決策としては、GPTと直結したアプリ（Gmail、Notion、VSCodeなど）やAPIを使うと、かなり楽になります。</p>



<h3 class="wp-block-heading"><span id="toc20">【デメリット③】スマホで使いにくい？PCマルチモニター最強説</span></h3>



<p>スマホや iPad でも ChatGPT は動くので「どこでも使える」のは確かです。<br>ただ──<strong>がっつり作業する場面ではデメリットが目立ちます。</strong></p>



<ul class="wp-block-list">
<li><strong>画面が狭い</strong><br>プロンプト欄と回答欄でほぼ画面が埋まり、スプレッドシートや資料を並べて確認できない。結局「戻る→確認→また戻る」の往復でストレス倍増。</li>



<li><strong>キーボード入力が遅い</strong><br>長文プロンプトやコードを打つとき、ソフトウェアキーボードでは指がつってしまうレベル。外付けキーボードを常に持ち歩くなら話は別ですが、荷物が増えて本末転倒です。</li>



<li><strong>アプリ切り替えの手間</strong><br>メール返信→GPT→メールにコピペ──のような流れで、アプリを行ったり来たり。PCならウィンドウを横に並べるだけで済むのに、スマホでは毎回スワイプ祭り。</li>



<li><strong>マルチモニター不可</strong><br>情報量が多いタスクでは「GPT 出力」と「編集対象ファイル」を同時表示できるかが勝負。スマホ画面ではどう頑張っても一望できず、<strong>集中力が削がれる</strong>一方です。</li>
</ul>



<p>要するに、<strong>“消費”にはスマホが最適でも、“創造”にはPCがまだまだ最強</strong>。<br>私は「下書きのメモ取り」「移動中の簡単な質問」まではスマホで済ませ、<strong>本格的なプロンプト作成や結果の精査はPC＋デュアルモニター</strong>と割り切っています。</p>



<h3 class="wp-block-heading"><span id="toc21">【デメリット④】AIを使うと、めちゃくちゃ疲れる</span></h3>



<p>これは完全に個人的な話なんですが、ChatGPT を使うと脳がめっちゃ疲れます。<br>仮説→検証→結果確認→再検証、のサイクルが早すぎて、思考体力を消耗してしまうんですね。<br>あと、意思決定の連続が脳のリソースを奪っていく感覚があります。</p>



<p>私の対策は「意思決定の省略」</p>



<ul class="wp-block-list">
<li>朝昼は同じメニューを食べる</li>



<li>通勤ルートを固定する</li>



<li>服装をルーチン化する<br>など、“考えないで済む”生活習慣を意識しています。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc22">4. まとめ：ChatGPTは「正しい使い分け」で最強の業務効率化ツールに</span></h2>



<p>ChatGPTは魔法の道具ではありません。<br>でも「やりたいことを言語化できる人」にとっては、ものすごく便利なツールです。</p>



<p>義肢装具士のように実際に身体を動かす仕事でも、「文章を書く」「考えをまとめる」「事務を効率化する」などの場面では、強力な相棒になってくれます。</p>



<p>使いこなすためには：</p>



<ul class="wp-block-list">
<li>嘘を前提に、出力を疑う力</li>



<li>作業を切り分け、AIに頼れるところを選ぶ判断</li>



<li>疲れないための工夫と習慣づくり</li>
</ul>



<p>こうした視点を持てば、AIは“敵”ではなく、味方になります。<br>小さな作業から、少しずつ試してみてはいかがでしょうか？</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[GASでWEBアプリ] doPostでHTML＋Bootstrapフォームからスプレッドシートへ自動書き込み</title>
		<link>https://shoelab.jp/gas/gas%e3%81%a7web%e3%82%a2%e3%83%97%e3%83%aa-dopost%e3%81%a7html%ef%bc%8bbootstrap%e3%83%95%e3%82%a9%e3%83%bc%e3%83%a0%e3%81%8b%e3%82%89%e3%82%b9%e3%83%97%e3%83%ac%e3%83%83%e3%83%89%e3%82%b7%e3%83%bc/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sat, 21 Jun 2025 03:00:00 +0000</pubDate>
				<category><![CDATA[GAS]]></category>
		<guid isPermaLink="false">https://shoelab.jp/?p=680</guid>

					<description><![CDATA[こんにちは。イカPOです。GASで作ったWEBアプリからスプレッドシートに書き込む、シンプルな方法を紹介します。オリジナルの入力画面を作ってスプレッドシートに書き込むことができるようになるので、仕事が楽なります。もっとリ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。イカPOです。GASで作ったWEBアプリからスプレッドシートに書き込む、シンプルな方法を紹介します。オリジナルの入力画面を作ってスプレッドシートに書き込むことができるようになるので、仕事が楽なります。もっとリッチなコードにすれば、スマホ一台で在庫の確認と数の更新ができるようになったり…そんな話の基礎を今回は紹介します。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc1">HTML フォームを作ろう</span></h2>



<figure class="wp-block-image aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="792" height="521" src="https://shoelab.jp/wp-content/uploads/2025/06/940b551227b654eabe67a6ecbebac5c4-1.webp" alt="フォームの画面。Bootstrapを使っているのでそれっぽい画面に" class="wp-image-683" style="width:840px;height:auto" srcset="https://shoelab.jp/wp-content/uploads/2025/06/940b551227b654eabe67a6ecbebac5c4-1.webp 792w, https://shoelab.jp/wp-content/uploads/2025/06/940b551227b654eabe67a6ecbebac5c4-1-300x197.webp 300w, https://shoelab.jp/wp-content/uploads/2025/06/940b551227b654eabe67a6ecbebac5c4-1-768x505.webp 768w" sizes="(max-width: 792px) 100vw, 792px" /><figcaption class="wp-element-caption">実際の画面。Bootstrapをしたシンプルなフォームの画面です。</figcaption></figure>



<p>まずは <strong><code>form.html</code></strong> をプロジェクトに追加し、下記のようなシンプルな問い合わせフォームを用意します。Bootstrap 5 を読み込んでいるので、ほぼ手を加えなくても見栄え良く整います。</p>



<pre class="wp-block-code"><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;base target="_top"&gt;
    &lt;!-- Bootstrap 5 --&gt;
    &lt;link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"&gt;
  &lt;/head&gt;

  &lt;body class="container py-5"&gt;
    &lt;h1 class="h4 mb-4"&gt;お問い合せ&lt;/h1&gt;

    &lt;!-- ★ ここがポイント --&gt;
    &lt;form method="POST" action="&lt;?!= deployURL ?&gt;"&gt;
      &lt;div class="mb-3"&gt;
        &lt;label for="name" class="form-label"&gt;お名前&lt;/label&gt;
        &lt;input type="text" id="name" name="name" class="form-control" required&gt;
      &lt;/div&gt;

      &lt;div class="mb-3"&gt;
        &lt;label for="email" class="form-label"&gt;メールアドレス&lt;/label&gt;
        &lt;input type="email" id="email" name="email" class="form-control" required&gt;
      &lt;/div&gt;

      &lt;div class="mb-4"&gt;
        &lt;label for="msg" class="form-label"&gt;メッセージ&lt;/label&gt;
        &lt;textarea id="msg" name="msg" rows="4" class="form-control" required&gt;&lt;/textarea&gt;
      &lt;/div&gt;

      &lt;button type="submit" class="btn btn-primary"&gt;送信&lt;/button&gt;
    &lt;/form&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>



<h3 class="wp-block-heading"><span id="toc2">ここだけは押さえよう — フォームの核心ポイント</span></h3>



<ul class="wp-block-list">
<li><strong><code>&lt;form method="POST" …&gt;</code></strong><br>フォーム送信時に <strong>HTTP POST</strong> を使う指定です。<br><code>doPost(e)</code> が受け取るのは POST データなので、ここを GET にしてしまうと <code>doGet(e)</code> が呼ばれ、パラメータが URL に丸見えになります（セキュリティ面・文字数制限の両方で不利）。</li>



<li><strong><code>action="&lt;?!= deployURL ?&gt;"</code></strong><br><code>deployURL</code> はサーバー側（<code>Code.gs</code> のテンプレート）で差し込むウェブアプリの公開 URL。<br>ウェブアプリは再デプロイのたびに URL が変わるため、アドレスを直書きするとすぐ動かなくなるのが落とし穴。テンプレートに埋め込んでおけば、コードをいじらずに常に最新の URL へ自動追従できます。</li>



<li><strong>input / textarea 各フィールド</strong><br><code>name="name"</code>, <code>name="email"</code>, <code>name="msg"</code> は <strong>キー</strong> となり、GAS 側では <code>e.parameter.name</code> / <code>e.parameter.email</code> / <code>e.parameter.msg</code> として受け取れます。</li>



<li><strong><code>required</code></strong><br>ブラウザレベルの簡易バリデーション。空欄で送信ボタンを押すと警告を出してくれるので、スクリプト側のチェックを減らせます。</li>



<li><strong>Bootstrap の読み込み</strong><br>CDN を 1 行書くだけでフォームが即“それっぽく”整います。GAS の HTMLService は外部 CSS の読み込みも OK なので、今回は最小構成として CDN を採用しています。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc3">doGet でフォームを表示する</span></h2>



<p>まずは <strong><code>Code.gs</code></strong> に次の関数を用意します。これで先ほど作った <code>form.html</code> をブラウザに表示できるようになります。</p>



<pre class="wp-block-code"><code>function doGet(e) {
  // ① テンプレート（form.html）を読み込む
  const template = HtmlService.createTemplateFromFile('form');

  // ② デプロイ URL をテンプレートに渡す
  template.deployURL = ScriptApp.getService().getUrl();

  // ③ テンプレートを評価して HTMLOutput を生成
  const htmlOutput = template.evaluate();

  // ④ スマホ対応＆タイトル設定（お好みで）
  htmlOutput.addMetaTag('viewport', 'width=device-width, initial-scale=1');
  htmlOutput.setTitle('フォームだよ');

  // ⑤ ブラウザへ返却
  return htmlOutput;
}
</code></pre>



<h3 class="wp-block-heading"><span id="toc4">template.deployURL の役割</span></h3>



<ul class="wp-block-list">
<li><strong>何をしている？</strong><br><code>template.deployURL = ScriptApp.getService().getUrl();</code> で取得しているのは、ウェブアプリをデプロイしたときに発行される <strong>公開 URL</strong>（例：<code>https://script.google.com/macros/s/AKfycb.../exec</code>）。</li>



<li><strong>なぜ必要？</strong><br>ウェブアプリは再デプロイのたびに URL が変わるため、HTML 側に URL を直書きするとすぐ動かなくなります。<br><code>deployURL</code> をテンプレート変数として渡しておけば、<code>form.html</code> の <code>&lt;form method="POST" action="&lt;?!= deployURL ?&gt;"&gt;</code> がテンプレート評価時に <strong>最新の URL に自動置換</strong> され、フォームは常に正しいエンドポイントへ POST できます。</li>



<li><strong>ポイントまとめ</strong>
<ol class="wp-block-list">
<li>サーバー側（<code>doGet</code>）で URL を取得 → テンプレート変数に格納</li>



<li>クライアント側（<code>form.html</code>）でその変数を展開し <code>action</code> に埋め込む</li>



<li>再デプロイしてもコード修正ゼロで動き続ける</li>
</ol>
</li>
</ul>



<p>これでフォームの表示は完成です。続いて <strong><code>doPost</code></strong> を実装し、入力内容をスプレッドシートへ保存しましょう！</p>



<p>HTMLの表示方法については以下の記事でも紹介しています。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/gas/gas%e3%81%ae%e5%b0%8f%e6%8a%80%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88html%e3%81%a7%e3%83%a9%e3%82%af%e3%83%a9%e3%82%afweb%e3%82%a2%e3%83%97%e3%83%aa%e5%8c%96/" title="【GASの小技】テンプレートHTMLでラクラクWebアプリ化！HtmlService.createTemplateFromFile()の基本と使い方" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-300x169.webp 300w, https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-1024x576.webp 1024w, https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-768x432.webp 768w, https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-320x180.webp 320w, https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13.webp 1280w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【GASの小技】テンプレートHTMLでラクラクWebアプリ化！HtmlService.createTemplateFromFile()の基本と使い方</div><div class="blogcard-snippet internal-blogcard-snippet">Google Apps Scriptの HtmlService.createTemplateFromFile() の最小構成からスプレッドシート連携・Bootstrap適用までを徹底解説。テンプレートHTMLを活用してノンプログラマーでもリッチなWebアプリを簡単に作る手順とポイントをまとめました。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.06.08</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/gas/%e3%80%90gas%e5%b0%8f%e6%8a%80%e3%80%91createhtmloutputfromfile-createtemplatefromfile-%e5%be%b9%e5%ba%95%e6%b4%bb%e7%94%a8-%e2%94%80-css-js%e5%88%86%e5%89%b2%e3%81%a8%e5%85%b1%e9%80%9a%e3%83%98/" title="【GAS小技】createHtmlOutputFromFile / createTemplateFromFile 徹底活用 ─ CSS/JS分割と共通ヘッダー・フッターで更新爆速化！" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-300x169.webp 300w, https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-1024x576.webp 1024w, https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-768x432.webp 768w, https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-320x180.webp 320w, https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51.webp 1280w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【GAS小技】createHtmlOutputFromFile / createTemplateFromFile 徹底活用 ─ CSS/JS分割と共通ヘッダー・フッターで更新爆速化！</div><div class="blogcard-snippet internal-blogcard-snippet">Google Apps ScriptでCSSとJavaScriptを別ファイル化し、include関数でヘッダー・フッターをコンポーネント化。Bootstrap併用でも崩れない設定とコピペOKコードで保守性と開発効率を一気に向上！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.06.14</div></div></div></div></a>
</div></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc5">スクリプトをウェブアプリとしてデプロイする</span></h2>



<ol class="wp-block-list">
<li><strong>エディタ右上［デプロイ ▸ 新しいデプロイ］をクリック</strong></li>



<li>「説明」はメモ程度で OK（例：初回公開）</li>



<li><strong>種類を選択 ▸ ウェブアプリ</strong></li>



<li><strong>実行するユーザー：自分</strong>
<ul class="wp-block-list">
<li>自分の権限でスプレッドシートに書き込むため</li>
</ul>
</li>



<li><strong>アクセス権：全員（匿名可）</strong>
<ul class="wp-block-list">
<li>社外に公開しない場合は「組織内のみ」でも可</li>
</ul>
</li>



<li>［デプロイ］→ 表示された <strong>公開 URL</strong> をコピー
<ul class="wp-block-list">
<li>これが <code>ScriptApp.getService().getUrl()</code> で取得できる URL</li>
</ul>
</li>



<li>完了！　この URL にアクセスすると <code>doGet()</code> のフォームが開きます。</li>
</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>ポイント</strong><br>再デプロイ（コード更新→バージョンアップ）のたびに URL が変わるため、フォームの <code>action</code> を固定文字列にしないのが鉄則です。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc6">doPost でスプレッドシートに書き込む</span></h2>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="800" height="600" src="https://shoelab.jp/wp-content/uploads/2025/06/ddf038a3537d7db832d827a1bd0463fe-1.webp" alt="フォーム入力後、送信ボタンを押すと、スプレッドシートに書き込まれる" class="wp-image-686" srcset="https://shoelab.jp/wp-content/uploads/2025/06/ddf038a3537d7db832d827a1bd0463fe-1.webp 800w, https://shoelab.jp/wp-content/uploads/2025/06/ddf038a3537d7db832d827a1bd0463fe-1-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/06/ddf038a3537d7db832d827a1bd0463fe-1-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><code>Code.gs</code> に次の関数を追記します。</p>



<pre class="wp-block-code"><code>function doPost(e) {
  // 1 受信パラメータを取得
  const name    = e.parameter.name  || '';
  const email   = e.parameter.email || '';
  const message = e.parameter.msg   || '';

  // 2 シートに追記
  const sheet   = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const nextRow = sheet.getLastRow() + 1;          // 最下行の 1 つ下
  sheet.getRange(nextRow, 1, 1, 3)                 // A〜C 列 1 行
       .setValues(&#91;&#91;name, email, message]]);

  // 3 応答を返す
  return HtmlService.createHtmlOutput('保存しました！');
}
</code></pre>



<h3 class="wp-block-heading"><span id="toc7">① 受信パラメータを取得</span></h3>



<ul class="wp-block-list">
<li><code>e.parameter.&lt;name属性&gt;</code> でフォームの値を取り出します。</li>



<li><code>|| ''</code> は「値が空または undefined のときは空文字を入れる」保険です。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc8">② シートに追記</span></h3>



<ol class="wp-block-list">
<li><strong>シート取得</strong> <code>const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();</code></li>



<li><strong>書き込み行決定</strong> <code>const nextRow = sheet.getLastRow() + 1;</code></li>



<li><strong>範囲指定 &amp; 書き込み</strong> <code>sheet .getRange(nextRow, 1, 1, 3) // A〜C列の 1 行 .setValues([[name, email, message]]); // まとめて書き込む</code> <code>[[name, email, message]]</code> という <strong>2 重配列</strong> を渡すことで、<br><code>name → A 列</code>, <code>email → B 列</code>, <code>message → C 列</code> が一発で書き込まれます。</li>
</ol>



<h3 class="wp-block-heading"><span id="toc9">③ 応答を返す</span></h3>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="600" src="https://shoelab.jp/wp-content/uploads/2025/06/ae147ca3be5cee1dfb16c67a1615c1d6.webp" alt="" class="wp-image-684" srcset="https://shoelab.jp/wp-content/uploads/2025/06/ae147ca3be5cee1dfb16c67a1615c1d6.webp 800w, https://shoelab.jp/wp-content/uploads/2025/06/ae147ca3be5cee1dfb16c67a1615c1d6-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/06/ae147ca3be5cee1dfb16c67a1615c1d6-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">成功時に表示される画面。保存しました！とブラウザに表示されていればOKです。</figcaption></figure>



<ul class="wp-block-list">
<li><code>HtmlService.createHtmlOutput('保存しました！')</code> を返して、送信後のブラウザに完了メッセージを表示します。</li>



<li>複数行の HTML を返してサンクスページを作っても OK です。</li>
</ul>



<p>このページも参考にしてください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/gas/%e3%80%90gas%e3%81%ae%e5%b0%8f%e6%8a%80%e3%80%91%e3%82%b9%e3%83%97%e3%83%ac%e3%83%83%e3%83%89%e3%82%b7%e3%83%bc%e3%83%88%e3%82%92web%e3%83%9a%e3%83%bc%e3%82%b8%e5%8c%96%ef%bc%81htmlservice-createhtmlo/" title="【GASの小技】スプレッドシートをWEBページ化！HtmlService.createHtmlOutput()の基本と使い方" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-300x169.webp 300w, https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-1024x576.webp 1024w, https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-768x432.webp 768w, https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-320x180.webp 320w, https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45.webp 1280w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【GASの小技】スプレッドシートをWEBページ化！HtmlService.createHtmlOutput()の基本と使い方</div><div class="blogcard-snippet internal-blogcard-snippet">スプレッドシートを3分でWEBページ化！GASのHtmlService.createHtmlOutput()を使い、最小コードと表表示サンプルで初心者にも解説。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.06.01</div></div></div></div></a>
</div></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc10">doGet と doPost の違いを理解しよう</span></h2>



<ul class="wp-block-list">
<li><strong>doGet(e)</strong><br>ブラウザが <strong>HTTP GET</strong> でアクセスしたときに呼ばれ、パラメータは URL の末尾に付く。主に <em>表示専用</em> の処理に使います。</li>



<li><strong>doPost(e)</strong><br>フォームが <strong>HTTP POST</strong> で送信したときに呼ばれ、パラメータはリクエストボディに入る。データの <em>追加・更新・削除</em> などサーバー処理に最適です。</li>
</ul>



<p>フォーム入力 → 保存 という典型的な “書き込み処理” では <strong>GET で表示／POST で保存</strong> のペアが王道パターンです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc11">まとめ</span></h2>



<p>これで <strong>HTML フォーム → doPost → スプレッドシート保存</strong> という最小構成が完成しました。流れをもう一度振り返ると──</p>



<ol class="wp-block-list">
<li><strong>フォームを用意</strong><br><code>method="POST"</code> と <code>action="&lt;?!= deployURL ?&gt;"</code> を忘れずに。</li>



<li><strong>doGet でフォームを表示</strong><br><code>ScriptApp.getService().getUrl()</code> で最新の公開 URL をテンプレートに渡す。</li>



<li><strong>ウェブアプリとしてデプロイ</strong><br>実行ユーザー：自分／アクセス権：用途に合わせて設定。</li>



<li><strong>doPost で受信 &amp; 追記</strong><br><code>e.parameter</code> で値を取り出し、<code>sheet.setValues()</code> で A〜C 列に一括書き込み。</li>
</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>⚠️ <strong>公開範囲に注意：</strong> フォームをインターネット公開すると、URL を知っている誰でも書き込み可能になるので、公開範囲には注意してください。</p>
</blockquote>



<p>この基礎が動けば、スマホで在庫管理・社内アンケートなど応用は無限大。まずは試しにフォームを送信し、スプレッドシートにデータが増える様子を確認してみてください！</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【GAS小技】createHtmlOutputFromFile / createTemplateFromFile 徹底活用 ─ CSS/JS分割と共通ヘッダー・フッターで更新爆速化！</title>
		<link>https://shoelab.jp/gas/%e3%80%90gas%e5%b0%8f%e6%8a%80%e3%80%91createhtmloutputfromfile-createtemplatefromfile-%e5%be%b9%e5%ba%95%e6%b4%bb%e7%94%a8-%e2%94%80-css-js%e5%88%86%e5%89%b2%e3%81%a8%e5%85%b1%e9%80%9a%e3%83%98/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sat, 14 Jun 2025 03:00:00 +0000</pubDate>
				<category><![CDATA[GAS]]></category>
		<guid isPermaLink="false">https://shoelab.jp/?p=650</guid>

					<description><![CDATA[こんにちは、イカPOです。今回は Google Apps Script（GAS）で Web アプリを作るときに、STEP1｜ノンプログラマーでもできる！CSSとJSを別ファイルに分ける を紹介します。ソースを分けておくと [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、イカPOです。<br>今回は Google Apps Script（GAS）で Web アプリを作るときに、STEP1｜ノンプログラマーでもできる！CSSとJSを別ファイルに分ける を紹介します。ソースを分けておくとコードの見通しがグッと良くなり、あとからデザインやロジックを修正するときも超ラクちん。<br>さらに、この仕組みを応用すれば ヘッダーやフッターなどの共通パーツをコンポーネント化 できるので、複数ページに散らばる同じ要素を一括で更新できて作業効率が爆上がりします。<br>覚えておいて損はありません！　GAS で Web アプリ／Web サイトを作るときは、ぜひ今回のテクニックを活用してみてくださいね 🦑</p>



<h2 class="wp-block-heading"><span id="toc1">CSS と JavaScript を“別ファイル化”する方法</span></h2>



<p>ソースを分けて管理してみよう。</p>



<h3 class="wp-block-heading"><span id="toc2">① style.html と script.html をちゃちゃっと作成</span></h3>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="800" height="600" src="https://shoelab.jp/wp-content/uploads/2025/06/4e536296b128d2321aebb8ac265140ca.webp" alt="style.htmlとscript.htmlを作成" class="wp-image-652" srcset="https://shoelab.jp/wp-content/uploads/2025/06/4e536296b128d2321aebb8ac265140ca.webp 800w, https://shoelab.jp/wp-content/uploads/2025/06/4e536296b128d2321aebb8ac265140ca-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/06/4e536296b128d2321aebb8ac265140ca-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>CSSとJavaScriptだけを別のファイルに記述します。<br>今回はCSS用のstyle.htmlとJS用のscript.htmlの2つを作成します。（※ 原文の &#8220;funtion.html&#8221; という表記は誤植なので修正しています）<br>cssは タグ、jsは タグでしっかり囲ってください。<br>特別な記法はありません。最終的に 1 つの HTML ファイルに CSS と JS をインラインで書き込んだのと同じ形でブラウザに渡るイメージで記述すればOKです。</p>



<h4 class="wp-block-heading"><span id="toc3">style.html</span></h4>



<pre class="wp-block-code"><code>&lt;style&gt;
  body { padding: 1rem; }
  /* ───────────  テーブル全体  ─────────── */
  #itemTable {
    --bs-table-striped-bg: #f6faff;   /* 奇数行色 */
    --bs-table-hover-bg:   #edf4ff;   /* ホバー色 */
    border-radius: .5rem;
    overflow: hidden;
    box-shadow: 0 .125rem .75rem rgba(0,0,0,.05);
  }
  /* ───────────  ヘッダー  ─────────── */
  #itemTable thead th {
    background: #0d6efd;
    color: #fff;
    font-weight: 600;
    position: sticky; top: 0; z-index: 2;
  }
  /* ───────────  セルの配置調整  ─────────── */
  #itemTable tbody td:nth-child(1){text-align:center;}
  #itemTable tbody td:nth-child(4){text-align:right;}
  /* ───────────  カテゴリーをバッジ風  ─────────── */
  #itemTable tbody td:nth-child(3){
    font-weight: 500; padding:.35rem .75rem; border-radius:9999px;
    background:#e8f1ff; color:#0d6efd;
  }
&lt;/style&gt;
</code></pre>



<h4 class="wp-block-heading"><span id="toc4">script.html</span></h4>



<pre class="wp-block-code"><code>&lt;script&gt;
  // デモ用：ダミーデータで行を追加
  document.getElementById('addRowBtn').addEventListener('click', () =&gt; {
    const tbody = document.querySelector('#itemTable tbody');
    const newRow = tbody.insertRow();
    const idCell = newRow.insertCell();
    const nameCell = newRow.insertCell();
    const categoryCell = newRow.insertCell();
    const stockCell = newRow.insertCell();

    const nextId = 1000 + tbody.rows.length;
    idCell.textContent = nextId;
    nameCell.textContent = 'デモ用品';
    categoryCell.textContent = 'テスト';
    stockCell.textContent = Math.floor(Math.random() * 10) + 1;
  });
&lt;/script&gt;
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>コード解説</strong></p>



<ul class="wp-block-list">
<li><code>&lt;style></code> / <code>&lt;script></code> タグを使う点は通常の HTML と同じ。</li>



<li>GAS ではファイル拡張子が <code>.html</code> であればテンプレートとして読み込めるため、<strong>CSS も JS も “HTMLラッパー” に包む</strong>のがポイントです。</li>
</ul>
</blockquote>



<h3 class="wp-block-heading"><span id="toc5">② コピペOK！include(filename) 関数を用意</span></h3>



<p>今度はコード.gsにinclude関数を作成します。includeは関数の名前なので何でもいいです。</p>



<pre class="wp-block-code"><code>function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}
</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://shoelab.jp/wp-content/uploads/2025/06/image-1.png" alt="" class="wp-image-657" srcset="https://shoelab.jp/wp-content/uploads/2025/06/image-1.png 1024w, https://shoelab.jp/wp-content/uploads/2025/06/image-1-300x300.png 300w, https://shoelab.jp/wp-content/uploads/2025/06/image-1-150x150.png 150w, https://shoelab.jp/wp-content/uploads/2025/06/image-1-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>この関数の役割は極めてシンプルです。<br>指定されたファイルの中身を取得し、HTML として返します。これだけです。<br>ここで返される HTML は<strong>エスケープされずに</strong>そのままテンプレートへ差し込まれるため、<code>&lt;style&gt;</code> や <code>&lt;script&gt;</code> に限らず、共通パーツの <code>&lt;header&gt;</code> なども自在に読み込めます。</p>



<h4 class="wp-block-heading"><span id="toc6">コード.gs全文</span></h4>



<pre class="wp-block-code"><code>function doGet(e) {
  const template = HtmlService.createTemplateFromFile('table');
  const htmlOutput = template.evaluate();
  htmlOutput.addMetaTag('viewport', 'width=device-width, initial-scale=1');
  htmlOutput.setTitle('WEBページだよ');
  return htmlOutput;
}

function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>コード解説</strong></p>



<ul class="wp-block-list">
<li><code>HtmlService.createTemplateFromFile('table')</code> で <code>table.html</code> をテンプレートとして読み込みます。</li>



<li><code>include()</code> は <strong>GAS テンプレートの中からだけ</strong>呼び出せるヘルパー。</li>



<li>返り値は文字列なので、<code>&lt;?!= … ?></code> タグで “エスケープなし” で展開します。（<code>&lt;?= … ?></code> との違いに注意！）</li>
</ul>
</blockquote>



<p>doget内でtable.htmlを読み込んでます。htmlの表示方法は別の記事を参考にしてください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/gas/gas%e3%81%ae%e5%b0%8f%e6%8a%80%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88html%e3%81%a7%e3%83%a9%e3%82%af%e3%83%a9%e3%82%afweb%e3%82%a2%e3%83%97%e3%83%aa%e5%8c%96/" title="【GASの小技】テンプレートHTMLでラクラクWebアプリ化！HtmlService.createTemplateFromFile()の基本と使い方" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-300x169.webp 300w, https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-1024x576.webp 1024w, https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-768x432.webp 768w, https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13-320x180.webp 320w, https://shoelab.jp/wp-content/uploads/2025/06/37a4ef47ef2ccc9382a6ed83883a1d13.webp 1280w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【GASの小技】テンプレートHTMLでラクラクWebアプリ化！HtmlService.createTemplateFromFile()の基本と使い方</div><div class="blogcard-snippet internal-blogcard-snippet">Google Apps Scriptの HtmlService.createTemplateFromFile() の最小構成からスプレッドシート連携・Bootstrap適用までを徹底解説。テンプレートHTMLを活用してノンプログラマーでもリッチなWebアプリを簡単に作る手順とポイントをまとめました。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.06.08</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc7">③ include() で CSS／JS をページに注入</span></h3>



<p>include関数を呼び出し、ファイル名を指定しましょう。<br>今回スタイルとJSを適応させたい、ファイルはtable.htmlなので、table.htmlに以下のコードを追加します。</p>



<pre class="wp-block-code"><code>&lt;?!= include('style') ?>
&lt;?!= include('script') ?></code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>解説</strong></p>



<ul class="wp-block-list">
<li><code>&lt;?!= … ?></code> は <strong>テンプレート式の“非エスケープ出力”</strong>。<code>style.html</code> / <code>script.html</code> の中身をそのまま挿入します。</li>



<li>ファイル名は拡張子なしで OK。<code>include('style')</code> と書けば <code>style.html</code> が対象になります。</li>
</ul>
</blockquote>



<h3 class="wp-block-heading"><span id="toc8">table.html コード全文</span></h3>



<pre class="wp-block-code"><code>&lt;!DOCTYPE html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;base target="_top"&gt;
  &lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;

  &lt;!-- Bootstrap 5 CDN --&gt;
  &lt;link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"&gt;

  &lt;title&gt;WEBアプリだよ&lt;/title&gt;

  &lt;?!= include('style') ?&gt; &lt;!-- GASのテンプレートでCSSを読み込み --&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1 class="h4 mb-3"&gt;WEBアプリだよ&lt;/h1&gt;
  &lt;p class="mb-4"&gt;以下のように &amp;lt;table&amp;gt; タグで作成できます。&lt;/p&gt;

  &lt;div class="table-responsive"&gt;
    &lt;table id="itemTable" class="table table-striped table-hover align-middle"&gt;
      &lt;thead class="table-primary"&gt;
        &lt;tr&gt;&lt;th&gt;商品ID&lt;/th&gt;&lt;th&gt;商品名&lt;/th&gt;&lt;th&gt;カテゴリー&lt;/th&gt;&lt;th&gt;在庫数&lt;/th&gt;&lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;1001&lt;/td&gt;
          &lt;td&gt;シャンプー&lt;/td&gt;
          &lt;td&gt;風呂&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;1002&lt;/td&gt;
          &lt;td&gt;リンス&lt;/td&gt;
          &lt;td&gt;風呂&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
  &lt;div class="d-flex gap-2 mt-4"&gt;
    &lt;button id="addRowBtn" class="btn btn-primary btn-sm"&gt;行を追加&lt;/button&gt;
  &lt;/div&gt;

  &lt;?!= include('script') ?&gt; &lt;!-- GASのテンプレートでJSを読み込み --&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>ポイント</strong></p>



<ul class="wp-block-list">
<li>テーブルに <strong>Bootstrap 5</strong> のクラスを当てつつ、細かいデザインを <code>style.html</code> で上書きしています。</li>



<li>行追加ボタンは <code>script.html</code> のハンドラで動的に行を増やします。</li>
</ul>
</blockquote>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="800" height="600" src="https://shoelab.jp/wp-content/uploads/2025/06/6478fbd9d12d4c60215fc7db97678886.webp" alt="完成イメージ図" class="wp-image-653" srcset="https://shoelab.jp/wp-content/uploads/2025/06/6478fbd9d12d4c60215fc7db97678886.webp 800w, https://shoelab.jp/wp-content/uploads/2025/06/6478fbd9d12d4c60215fc7db97678886-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/06/6478fbd9d12d4c60215fc7db97678886-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">完成した画面です。CSSでリッチな見た目を作りつつ、JSで簡単なアクションを追加しています。</figcaption></figure>



<h2 class="wp-block-heading"><span id="toc9">STEP2｜共通ヘッダー＆フッターを部品化して更新ラクラク</span></h2>



<p>複数のページで使いまわす、ヘッダーとフッター要素をコンポーネント化することで、編集が楽になります。</p>



<h3 class="wp-block-heading"><span id="toc10">① header.html と footer.html を作成</span></h3>



<h4 class="wp-block-heading"><span id="toc11">header.html</span></h4>



<pre class="wp-block-code"><code>&lt;!-- header.html  -->
&lt;header class="mb-4">
  &lt;nav class="navbar navbar-expand-lg navbar-dark bg-primary">
    &lt;div class="container-fluid">
      &lt;!-- サイトタイトル／ロゴ -->
      &lt;a class="navbar-brand fw-bold" href="&lt;?= deployURL ?>">イカPOアプリ&lt;/a>

      &lt;!-- スマホ用ハンバーガーボタン -->
      &lt;button
        class="navbar-toggler"
        type="button"
        data-bs-toggle="collapse"
        data-bs-target="#navbarNav"
        aria-controls="navbarNav"
        aria-expanded="false"
        aria-label="Toggle navigation">
        &lt;span class="navbar-toggler-icon">&lt;/span>
      &lt;/button>

      &lt;!-- メニュー -->
      &lt;div class="collapse navbar-collapse" id="navbarNav">
        &lt;ul class="navbar-nav ms-auto gap-lg-2">
          &lt;li class="nav-item">
            &lt;a class="nav-link" href="&lt;?= deployURL ?>">ホーム&lt;/a>
          &lt;/li>
          &lt;li class="nav-item">
            &lt;a class="nav-link" href="&lt;?= deployURL ?>?page=list">一覧&lt;/a>
          &lt;/li>
          &lt;li class="nav-item">
            &lt;a class="nav-link" href="&lt;?= deployURL ?>?page=about">このアプリについて&lt;/a>
          &lt;/li>
        &lt;/ul>
      &lt;/div>
    &lt;/div>
  &lt;/nav>
&lt;/header></code></pre>



<h4 class="wp-block-heading"><span id="toc12">footer.html</span></h4>



<pre class="wp-block-code"><code>&lt;!-- footer.html -->
&lt;footer class="bg-light text-center py-4 mt-auto shadow-sm">
  &lt;div class="container small text-muted">
    &lt;div class="mb-2">
      &lt;a href="&lt;?= deployURL ?>?page=privacy" class="link-secondary me-3">プライバシーポリシー&lt;/a>
      &lt;a href="&lt;?= deployURL ?>?page=contact"  class="link-secondary">お問い合わせ&lt;/a>
    &lt;/div>
    &lt;div>
      &amp;copy; &lt;script>document.write(new Date().getFullYear())&lt;/script> イカPO All&amp;nbsp;Rights&amp;nbsp;Reserved.
    &lt;/div>
  &lt;/div>
&lt;/footer></code></pre>



<p>header.htmlとfooter.htmlを用意します。</p>



<h3 class="wp-block-heading"><span id="toc13">② include() でヘッダー／フッターを読み込み</span></h3>



<p>あとはCSSとjsと同じく</p>



<pre class="wp-block-code"><code>&lt;?!= include('header') ?>
&lt;?!= include('footer') ?></code></pre>



<p>追加したいところにこのコードを書きましょう。</p>



<p>table.html コード全文 ヘッダーとフッター追加版</p>



<pre class="wp-block-code"><code>&lt;!DOCTYPE html>
&lt;html lang="ja">
&lt;head>
  &lt;meta charset="UTF-8">
  &lt;base target="_top">
  &lt;meta name="viewport" content="width=device-width, initial-scale=1">
  &lt;!-- Bootstrap 5 -->
  &lt;link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
  &lt;title>WEBアプリだよ&lt;/title>
  &lt;?!= include('style') ?>
&lt;/head>
&lt;body>
 <strong> &lt;?!= include('header') ?></strong>

  &lt;h1 class="h4 mb-3">WEBアプリだよ&lt;/h1>
  &lt;p class="mb-4">以下のように &amp;lt;table&amp;gt; タグで作成できます。&lt;/p>

  &lt;div class="table-responsive">
    &lt;table id="itemTable" class="table table-striped table-hover align-middle">
      &lt;thead class="table-primary">
        &lt;tr>&lt;th>商品ID&lt;/th>&lt;th>商品名&lt;/th>&lt;th>カテゴリー&lt;/th>&lt;th>在庫数&lt;/th>&lt;/tr>
      &lt;/thead>
      &lt;tbody>
        &lt;tr>
          &lt;td>1001&lt;/td>
          &lt;td>シャンプー&lt;/td>
          &lt;td>風呂&lt;/td>
          &lt;td>1&lt;/td>
        &lt;/tr>
        &lt;tr>
          &lt;td>1002&lt;/td>
          &lt;td>リンス&lt;/td>
          &lt;td>風呂&lt;/td>
          &lt;td>1&lt;/td>
        &lt;/tr>
      &lt;/tbody>
    &lt;/table>
  &lt;/div>
  &lt;div class="d-flex gap-2 mt-4">
    &lt;button id="addRowBtn" class="btn btn-primary btn-sm">行を追加&lt;/button>
  &lt;/div>
<strong>  &lt;?!= include('footer') ?></strong>
  &lt;?!= include('script') ?>
&lt;/body>
&lt;/html>
</code></pre>



<h2 class="wp-block-heading"><span id="toc14">まとめ｜これでメンテナンスが爆速に！</span></h2>



<p>ヘルパー関数を作成することで、別ファイルのCSSとJSを呼び出すことができます。<br>同じ関数を使ってヘッダーやフッターをコンポーネント化して別のページでも使いまわすこともできます。<br><code>return HtmlService.createHtmlOutputFromFile(filename).getContent();</code> の仕組みを使うだけ。便利なテクなので、開発のお供に是非。</p>



<p>それでは、また</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【GASの小技】テンプレートHTMLでラクラクWebアプリ化！HtmlService.createTemplateFromFile()の基本と使い方</title>
		<link>https://shoelab.jp/gas/gas%e3%81%ae%e5%b0%8f%e6%8a%80%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88html%e3%81%a7%e3%83%a9%e3%82%af%e3%83%a9%e3%82%afweb%e3%82%a2%e3%83%97%e3%83%aa%e5%8c%96/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sun, 08 Jun 2025 03:00:00 +0000</pubDate>
				<category><![CDATA[GAS]]></category>
		<guid isPermaLink="false">https://shoelab.jp/?p=642</guid>

					<description><![CDATA[こんにちは、イカPOです。今回は HtmlService.createTemplateFromFile を使うと、テンプレートファイルを使用して HTML をブラウザに表示できます。 テンプレートファイルを作成するとコー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>こんにちは、イカPOです。<br>今回は <strong>HtmlService.createTemplateFromFile</strong> を使うと、テンプレートファイルを使用して HTML をブラウザに表示できます。</p>



<p>テンプレートファイルを作成するとコードの管理が楽になります。GAS で HTML を表示させるなら、前回紹介した <strong>HtmlService.createHtmlOutput()</strong> よりもおススメです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc1">HtmlService.createTemplateFromFile（）の最小構成</span></h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>ここでは「とにかく 1 画面出すだけ」の最短サンプル</strong>を示します。テンプレ分離のイメージをつかんでください。</p>
</blockquote>



<h3 class="wp-block-heading"><span id="toc2">index.html</span></h3>



<pre class="wp-block-code"><code>&lt;!DOCTYPE html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;base target="_top"&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;WEBアプリだよ&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>



<ul class="wp-block-list">
<li><code>&lt;base target="_top"&gt;</code> … 外部リンクを「親タブ」で開くためのおまじない。必須ではありませんが、Apps Script では入れておくのが通例です。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc3">コード.gs</span></h3>



<pre class="wp-block-code"><code>function doGet(e) {
  const template = HtmlService.createTemplateFromFile('index');
  const htmlOutput = template.evaluate();
  return htmlOutput;
}
</code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>処理</th><th>内容</th></tr></thead><tbody><tr><td><code>createTemplateFromFile('index')</code></td><td><strong>index.html を読み込み</strong>テンプレートオブジェクトを生成</td></tr><tr><td><code>evaluate()</code></td><td>テンプレートを <strong>HtmlOutput</strong> に変換</td></tr><tr><td><code>return htmlOutput</code></td><td>ブラウザへ返却（<code>doGet</code> / <code>doPost</code> は必ず HtmlOutput を返す）</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc4">手順①：テンプレート HTML を作成する</span></h3>



<p>HTML ファイル（ここでは <code>index.html</code>）をプロジェクト内に用意します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="600" src="https://shoelab.jp/wp-content/uploads/2025/06/9277af6ecb957b4aa17d6291e85eb886.webp" alt="メニューの＋ボタンを押し、HTMLファイルを作成" class="wp-image-643" srcset="https://shoelab.jp/wp-content/uploads/2025/06/9277af6ecb957b4aa17d6291e85eb886.webp 800w, https://shoelab.jp/wp-content/uploads/2025/06/9277af6ecb957b4aa17d6291e85eb886-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/06/9277af6ecb957b4aa17d6291e85eb886-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>その際に</p>



<pre class="wp-block-code"><code>&lt;base target="_top"&gt;</code></pre>



<p>を入れておくと、テンプレート内リンクが iframe ではなく親ウィンドウで開くようになります。<strong>“GAS で HTML を表示するときのお作法”</strong> と覚えておくとラクです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc5">手順②：doGet / doPost でテンプレートを読み込む</span></h3>



<p><code>doGet(e)</code> 内で、先ほど作ったテンプレートファイルを読み込みます。</p>



<pre class="wp-block-code"><code>const template = HtmlService.createTemplateFromFile('index');</code></pre>



<p><code>HtmlService.createTemplateFromFile('ファイル名')</code> で使用できます。今回作成したファイル名は「index」なので <code>('index')</code> と書きます。</p>



<pre class="wp-block-code"><code>const htmlOutput = template.evaluate();</code></pre>



<p>読み込んだ HTML ファイルを <strong>HtmlOutput オブジェクト</strong> に変換します。<code>doGet()</code> / <code>doPost()</code> では <em>文字列</em> ではなく <strong>このオブジェクトを return する</strong> のが約束事です。</p>



<pre class="wp-block-code"><code>return htmlOutput;</code></pre>



<p>変換したオブジェクトを表示します。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>まとめ</strong><br>“ファイルを読み込む → テンプレートを展開する → <code>return</code> でブラウザに返す”<br>これが <strong>createTemplateFromFile</strong> の基本フローです。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc6">生出力タグで GAS 生成のテーブル HTML をそのまま描画する</span></h2>



<p><code>&lt;?!= … ?&gt;</code> をテンプレート内で使用すると、<strong>GAS で作った HTML 要素</strong>をそのまま出力できます。以下に実例を載せます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc7">使用例</span></h2>



<h3 class="wp-block-heading"><span id="toc8">index.html</span></h3>



<pre class="wp-block-code"><code>&lt;!DOCTYPE html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;base target="_top"&gt;

  &lt;title&gt;WEBアプリだよ&lt;/title&gt;

  &lt;style&gt;
    body { padding: 1rem; }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

  &lt;h1&gt;WEBアプリだよ&lt;/h1&gt;
  &lt;p&gt;以下のように &amp;lt;table&amp;gt; タグで作成できます。&lt;/p&gt;

  &lt;div&gt;
    &lt;?!= itemTable ?&gt;
  &lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;
</code></pre>



<ul class="wp-block-list">
<li><code>&lt;?!= itemTable ?&gt;</code> … <strong>エスケープせずに生 HTML</strong> をそのまま挿入します。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc9">コード.gs</span></h3>



<pre class="wp-block-code"><code>function doGet(e) {
  const template = HtmlService.createTemplateFromFile('table');
  template.itemTable = getItem();        // ← getItem() が返すテーブル HTML を渡す
  const htmlOutput = template.evaluate();
  return htmlOutput;
}
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc10">getItem() ― スプレッドシート → HTML テーブル変換</span></h3>



<pre class="wp-block-code"><code>/**
 * 商品一覧シートからデータを取得し、HTML テーブル文字列を返す
 */
function getItem() {
  // ① アクティブなスプレッドシートを取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  // ② 「商品一覧」シートを取得
  const sheet = ss.getSheetByName('商品一覧');
 
  // ③ シート全体の値を 2 次元配列で取得
  //    data&#91;0] がヘッダー行、data&#91;1] 以降がデータ行
  const data = sheet.getDataRange().getValues();

  // ④ 先頭行（ヘッダー）を取り出し、残りをデータとして保持
  const headers = data.shift();   // headers = &#91;"商品ID", "商品名", "カテゴリー", "在庫数"]

  // ⑤ ヘッダー名 → 列インデックス の対応表を生成
  //    例: headerMap&#91;"商品名"] === 1
  const headerMap = {};
  headers.forEach(function(header, index) {
    headerMap&#91;header] = index;
  });

  // ⑥ &lt;thead&gt; 部分 ─ ヘッダー配列を &lt;th&gt; で包み、空文字区切りで連結
  const thRow = headers
    .map(function(head) { return `&lt;th&gt;${head}&lt;/th&gt;`; })
    .join('');

  // ⑦ &lt;tbody&gt; 部分 ─ 各データ行を &lt;tr&gt;&lt;td&gt;…&lt;/td&gt;&lt;/tr&gt; 形式の文字列に変換
  const tdRow = data
    .map(function(itemData) {
      return `
      &lt;tr&gt;
        &lt;td&gt;${parseInt(itemData&#91;headerMap&#91;"商品ID"]], 10) || 0}&lt;/td&gt;
        &lt;td&gt;${itemData&#91;headerMap&#91;"商品名"]]}&lt;/td&gt;
        &lt;td&gt;${itemData&#91;headerMap&#91;"カテゴリー"]]}&lt;/td&gt;
        &lt;td&gt;${parseInt(itemData&#91;headerMap&#91;"在庫数"]], 10) || 0}&lt;/td&gt;
      &lt;/tr&gt;`;
    })
    .join('');

  // ⑧ 最終的な HTML テーブルを組み立て
  const html = `
    &lt;table id="itemTable" class="table table-striped table-hover align-middle"&gt;
      &lt;thead class="table-primary"&gt;
        &lt;tr&gt;${thRow}&lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;${tdRow}&lt;/tbody&gt;
    &lt;/table&gt;`;

  // ⑨ 呼び出し元へ HTML 文字列を返す
  return html;
}
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>ポイント</strong></p>



<ul class="wp-block-list">
<li>⑥で <code>&lt;thead&gt;</code>、⑦で <code>&lt;tbody&gt;</code> を個別に組み立てると、後でスタイルを付けやすくなります。</li>



<li>数値列には <code>parseInt()</code> をかませておくと “空セル → 0” のフォールバックが効きます。</li>
</ul>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>まず、<a target="_blank" href="https://shoelab.jp/gas/%e3%80%90gas%e3%81%ae%e5%b0%8f%e6%8a%80%e3%80%91%e3%82%b9%e3%83%97%e3%83%ac%e3%83%83%e3%83%89%e3%82%b7%e3%83%bc%e3%83%88%e3%82%92web%e3%83%9a%e3%83%bc%e3%82%b8%e5%8c%96%ef%bc%81htmlservice-createhtmlo/">前回</a>も使用した <strong>商品一覧シート → HTML テーブル文字列</strong> を返す <code>getItem()</code> でテーブルを作成します。</p>



<pre class="wp-block-code"><code>template.itemTable = getItem();</code></pre>



<p>その後、<code>doGet</code> 内で <strong>itemTable</strong> を定義し、テーブルの HTML 要素をテンプレートに渡します。</p>



<p>index.html 内の</p>



<pre class="wp-block-code"><code>&lt;div&gt;
  &lt;?!= itemTable ?&gt;
&lt;/div&gt;</code></pre>



<p>で <strong>itemTable</strong> を呼び出しています。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc11">HtmlService.createHtmlOutput() と HtmlService.createTemplateFromFile() のちがいについて</span></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-center" data-align="center">比較項目</th><th>createHtmlOutput()</th><th>createTemplateFromFile()</th></tr></thead><tbody><tr><td class="has-text-align-center" data-align="center">目的例</td><td>すぐに “Hello world” を出したい</td><td>HTML/CSS/JS を分割管理したい</td></tr><tr><td class="has-text-align-center" data-align="center">HTML の書き方</td><td>JS 文字列で直接書く</td><td>外部 .html をテンプレートとして読み込む</td></tr><tr><td class="has-text-align-center" data-align="center">変数の埋め込み</td><td><code>replace()</code> 等で手動置換</td><td><code>&lt;?= var ?&gt;</code> / <code>&lt;?!= var ?&gt;</code> でワンタッチ</td></tr><tr><td class="has-text-align-center" data-align="center">保守性</td><td>長い HTML だと可読性↓</td><td>ファイル分離で可読性◎</td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>用途まとめ</strong></p>



<ul class="wp-block-list">
<li><strong>createHtmlOutput()</strong> … デバッグ用、ワンライナーで済ませたいとき</li>



<li><strong>createTemplateFromFile()</strong> … 本番 UI、複数ページ、リッチ画面を作るとき</li>
</ul>
</blockquote>



<p><strong>createHtmlOutput()</strong>についての記事はこちらも</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/gas/%e3%80%90gas%e3%81%ae%e5%b0%8f%e6%8a%80%e3%80%91%e3%82%b9%e3%83%97%e3%83%ac%e3%83%83%e3%83%89%e3%82%b7%e3%83%bc%e3%83%88%e3%82%92web%e3%83%9a%e3%83%bc%e3%82%b8%e5%8c%96%ef%bc%81htmlservice-createhtmlo/" title="【GASの小技】スプレッドシートをWEBページ化！HtmlService.createHtmlOutput()の基本と使い方" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-300x169.webp 300w, https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-1024x576.webp 1024w, https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-768x432.webp 768w, https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45-320x180.webp 320w, https://shoelab.jp/wp-content/uploads/2025/05/1236a9e8464e78f2f265d7fa843c3c45.webp 1280w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【GASの小技】スプレッドシートをWEBページ化！HtmlService.createHtmlOutput()の基本と使い方</div><div class="blogcard-snippet internal-blogcard-snippet">スプレッドシートを3分でWEBページ化！GASのHtmlService.createHtmlOutput()を使い、最小コードと表表示サンプルで初心者にも解説。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.06.01</div></div></div></div></a>
</div></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc12">スタイル &amp; JavaScript の組み込み</span></h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>以下は Bootstrap + カスタム CSS + JavaScript の例</strong><br>コードは原文そのまま掲載し、誤記タグのみ訂正しています。</p>
</blockquote>



<pre class="wp-block-code"><code>&lt;!DOCTYPE html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;base target="_top"&gt;
  &lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;

  &lt;!-- Bootstrap 5 --&gt;
  &lt;link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"&gt;


  &lt;title&gt;WEBアプリだよ&lt;/title&gt;

  &lt;style&gt;
    body { padding: 1rem; }
    /* ───────────  テーブル全体  ─────────── */
    #itemTable {
      --bs-table-striped-bg: #f6faff;   /* 奇数行色 */
      --bs-table-hover-bg:   #edf4ff;   /* ホバー色 */
      border-radius: .5rem;
      overflow: hidden;
      box-shadow: 0 .125rem .75rem rgba(0,0,0,.05);
    }
    /* ───────────  ヘッダー  ─────────── */
    #itemTable thead th {
      background: #0d6efd;
      color: #fff;
      font-weight: 600;
      position: sticky; top: 0; z-index: 2;
    }
    /* ───────────  セルの配置調整  ─────────── */
    #itemTable tbody td:nth-child(1){text-align:center;}
    #itemTable tbody td:nth-child(4){text-align:right;}
    /* ───────────  カテゴリーをバッジ風  ─────────── */
    #itemTable tbody td:nth-child(3){
      font-weight: 500; padding:.35rem .75rem; border-radius:9999px;
      background:#e8f1ff; color:#0d6efd;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

  &lt;h1 class="h4 mb-3"&gt;WEBアプリだよ&lt;/h1&gt;
  &lt;p class="mb-4"&gt;以下のように &amp;lt;table&amp;gt; タグで作成できます。&lt;/p&gt;

  &lt;div class="table-responsive"&gt;
    &lt;?!= itemTable ?&gt;   &lt;!-- テーブルを挿入 --&gt;
  &lt;/div&gt;

  &lt;div class="d-flex gap-2 mt-4"&gt;
    &lt;button id="addRowBtn" class="btn btn-primary btn-sm"&gt;行を追加&lt;/button&gt;
  &lt;/div&gt;

  &lt;script&gt;
    // デモ用：ダミーデータで行を追加
    document.getElementById('addRowBtn').addEventListener('click', () =&gt; {
      const tbody = document.querySelector('#itemTable tbody');
      const newRow = tbody.insertRow();
      const idCell = newRow.insertCell();
      const nameCell = newRow.insertCell();
      const categoryCell = newRow.insertCell();
      const stockCell = newRow.insertCell();

      const nextId = 1000 + tbody.rows.length;
      idCell.textContent = nextId;
      nameCell.textContent = 'デモ用品';
      categoryCell.textContent = 'テスト';
      stockCell.textContent = Math.floor(Math.random() * 10) + 1;
    });
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>



<p>テンプレートファイル内に <strong>CSS と JavaScript</strong> を自由に書けるので、Bootstrap も組み合わせれば簡単にリッチな Web ページが作れます。外部ファイルにまとめて読み込む方法もありますが、それはまた別の記事で！</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/gas/%e3%80%90gas%e5%b0%8f%e6%8a%80%e3%80%91createhtmloutputfromfile-createtemplatefromfile-%e5%be%b9%e5%ba%95%e6%b4%bb%e7%94%a8-%e2%94%80-css-js%e5%88%86%e5%89%b2%e3%81%a8%e5%85%b1%e9%80%9a%e3%83%98/" title="【GAS小技】createHtmlOutputFromFile / createTemplateFromFile 徹底活用 ─ CSS/JS分割と共通ヘッダー・フッターで更新爆速化！" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-300x169.webp 300w, https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-1024x576.webp 1024w, https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-768x432.webp 768w, https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51-320x180.webp 320w, https://shoelab.jp/wp-content/uploads/2025/06/b5544c22ff825fca82801adb1d4e9c51.webp 1280w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【GAS小技】createHtmlOutputFromFile / createTemplateFromFile 徹底活用 ─ CSS/JS分割と共通ヘッダー・フッターで更新爆速化！</div><div class="blogcard-snippet internal-blogcard-snippet">Google Apps ScriptでCSSとJavaScriptを別ファイル化し、include関数でヘッダー・フッターをコンポーネント化。Bootstrap併用でも崩れない設定とコピペOKコードで保守性と開発効率を一気に向上！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.06.14</div></div></div></div></a>
</div></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc13">まとめ</span></h2>



<ol class="wp-block-list">
<li><strong>テンプレートファイルを分離</strong>すると、HTML/CSS/JS と GAS ロジックをきれいに分けられる。</li>



<li><code>createTemplateFromFile()</code> → <code>evaluate()</code> → <code>return</code> の 3 ステップが基本形。</li>



<li><code>&lt;?!= … ?&gt;</code> タグで <strong>GAS から渡した生 HTML</strong> をそのまま描画できる。</li>



<li>Bootstrap などの外部ライブラリも普通の HTML と同じ要領で利用可能。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【GASの小技】スプレッドシートをWEBページ化！HtmlService.createHtmlOutput()の基本と使い方</title>
		<link>https://shoelab.jp/gas/%e3%80%90gas%e3%81%ae%e5%b0%8f%e6%8a%80%e3%80%91%e3%82%b9%e3%83%97%e3%83%ac%e3%83%83%e3%83%89%e3%82%b7%e3%83%bc%e3%83%88%e3%82%92web%e3%83%9a%e3%83%bc%e3%82%b8%e5%8c%96%ef%bc%81htmlservice-createhtmlo/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sun, 01 Jun 2025 03:02:00 +0000</pubDate>
				<category><![CDATA[GAS]]></category>
		<guid isPermaLink="false">https://shoelab.jp/?p=637</guid>

					<description><![CDATA[こんにちは、イカPOです。Google Apps Script（GAS）の HtmlService.createHtmlOutput() を使えば、スクリプトだけで HTML をブラウザに表示できます。 この記事では 1 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、イカPOです。<br>Google Apps Script（GAS）の <strong><code>HtmlService.createHtmlOutput()</code></strong> を使えば、スクリプトだけで HTML をブラウザに表示できます。</p>



<p>この記事では <strong>1) とりあえずページが出る最小構成</strong> と <strong>2) スプレッドシートのデータをテーブルに出す実践サンプル</strong> の２本立てで解説します。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc1">1. HtmlService.createHtmlOutput() の最小構成</span></h2>



<pre class="wp-block-code"><code>// 最小構成
function doGet(e) {
  return HtmlService
    .createHtmlOutput('&lt;h1&gt;Hello from GAS Web App!&lt;/h1&gt;');
}
</code></pre>



<h3 class="wp-block-heading"><span id="toc2">ここがポイント 🔍</span></h3>



<ul class="wp-block-list">
<li><strong>たった１行で HTML を返せる</strong><br><code>createHtmlOutput()</code> に文字列を渡すだけ。超シンプルです。</li>



<li><strong>必ず <code>doGet(e)</code>（または <code>doPost(e)</code>）の中で返す</strong><br>GAS Web アプリの入口はこの２つ。ここから返したものがブラウザに届きます。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc3">2. doGet(e) と doPost(e) の違い</span></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-center" data-align="center">用途</th><th class="has-text-align-center" data-align="center">使うメソッド</th></tr></thead><tbody><tr><td class="has-text-align-center" data-align="center">ページを見に来たとき</td><td class="has-text-align-center" data-align="center"><strong>doGet(e)</strong></td></tr><tr><td class="has-text-align-center" data-align="center">フォーム送信などでデータを渡すとき</td><td class="has-text-align-center" data-align="center"><strong>doPost(e)</strong></td></tr></tbody></table></figure>



<p>ページ表示だけなら <strong><code>doGet(e)</code></strong> だけ覚えれば OK です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc4">3. スプレッドシートを読み込んで HTML に表示するサンプル</span></h2>



<h3 class="wp-block-heading"><span id="toc5">3-1. コード全文</span></h3>



<pre class="wp-block-code"><code>function doGet(e) {
  // ① テーブル部分の HTML を作る
  const html = getItem();
  // ② そのままブラウザに返す
  return HtmlService.createHtmlOutput(html);
}

/**
 * 商品一覧シートからデータを取得し、HTML テーブル文字列を返す
 */
function getItem() {
  // ① アクティブなスプレッドシートを取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  // ② 「商品一覧」シートを取得
  const sheet = ss.getSheetByName('商品一覧');

  // ③ シート全体の値を２次元配列で取得
  const data = sheet.getDataRange().getValues();

  // ④ １行目（ヘッダー行）を取り出す
  const headers = data.shift();   // → &#91;"商品ID","商品名",…]

  // ⑤ ヘッダーと列番号の辞書を作る
  const headerMap = {};
  headers.forEach((header, index) =&gt; headerMap&#91;header] = index);

  // ⑥ ヘッダー行を &lt;th&gt; で包む
  const thRow = headers.map(h =&gt; `&lt;th&gt;${h}&lt;/th&gt;`).join('');

  // ⑦ データ行を &lt;tr&gt;&lt;td&gt;…&lt;/td&gt;&lt;/tr&gt; に変換
  const tdRow = data.map(item =&gt; `
    &lt;tr&gt;
      &lt;td&gt;${parseInt(item&#91;headerMap&#91;"商品ID"]], 10) || 0}&lt;/td&gt;
      &lt;td&gt;${item&#91;headerMap&#91;"商品名"]]}&lt;/td&gt;
      &lt;td&gt;${item&#91;headerMap&#91;"カテゴリー"]]}&lt;/td&gt;
      &lt;td&gt;${parseInt(item&#91;headerMap&#91;"在庫数"]], 10) || 0}&lt;/td&gt;
    &lt;/tr&gt;`
  ).join('');

  // ⑧ テーブル完成
  const html = `
    &lt;table border="1" cellspacing="0" cellpadding="5"&gt;
      &lt;thead&gt;&lt;tr&gt;${thRow}&lt;/tr&gt;&lt;/thead&gt;
      &lt;tbody&gt;${tdRow}&lt;/tbody&gt;
    &lt;/table&gt;`;

  // ⑨ HTML 文字列を返す
  return html;
}
</code></pre>



<h3 class="wp-block-heading"><span id="toc6">3-2. スプレッドシートをコードに取り込む４ステップ</span></h3>



<ol class="wp-block-list">
<li><strong>シートを指名（②）</strong><br><code>const sheet = ss.getSheetByName('商品一覧');</code><br>→ 職員室で「商品一覧の名簿ください！」と声を掛けるイメージ。</li>



<li><strong>データを全部コピー（③）</strong><br><code>getDataRange().getValues()</code> で <strong>A1 から右下端まで</strong> を２次元配列として取得。<br>例：<code>data[0][1]</code> は「１行目２列目」のセル。</li>



<li><strong>ヘッダー行を抜き取る（④）</strong><br><code>const headers = data.shift();</code><br><code>shift()</code> は先頭行をスポッと抜いて返す。<code>data</code> からはヘッダーが消え、純粋データだけが残る。</li>



<li><strong>列名⇔番号の辞書を作る（⑤）</strong> <code>const headerMap = {}; headers.forEach((h,i)=&gt;headerMap[h]=i); // → { "商品ID":0, "商品名":1, "カテゴリー":2, "在庫数":3 }</code> これで <code>item[headerMap["商品名"]]</code> のように「名前で列を指定」でき、列順が変わっても安全。</li>
</ol>



<p>マッピングについてはこちらの記事も参考に</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/gas/gas%e3%81%ae%e5%b0%8f%e6%8a%80-1%e8%a1%8c%e7%9b%ae%e3%82%92%e3%83%98%e3%83%83%e3%83%80%e3%83%bc%e3%81%ab%ef%bc%81%e5%8f%96%e5%be%97%e3%81%97%e3%81%9f%e9%85%8d%e5%88%97%e3%83%87%e3%83%bc%e3%82%bf/" title="[GASの小技] 1行目をヘッダーに！取得した配列データを加工してスプレッドシートに書き込む方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/03/7f641ffeb4ea49cda83807eeef3ea18a-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/03/7f641ffeb4ea49cda83807eeef3ea18a-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/03/7f641ffeb4ea49cda83807eeef3ea18a-300x169.webp 300w, https://shoelab.jp/wp-content/uploads/2025/03/7f641ffeb4ea49cda83807eeef3ea18a-1024x576.webp 1024w, https://shoelab.jp/wp-content/uploads/2025/03/7f641ffeb4ea49cda83807eeef3ea18a-768x432.webp 768w, https://shoelab.jp/wp-content/uploads/2025/03/7f641ffeb4ea49cda83807eeef3ea18a-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/03/7f641ffeb4ea49cda83807eeef3ea18a-320x180.webp 320w, https://shoelab.jp/wp-content/uploads/2025/03/7f641ffeb4ea49cda83807eeef3ea18a.webp 1280w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">[GASの小技] 1行目をヘッダーに！取得した配列データを加工してスプレッドシートに書き込む方法</div><div class="blogcard-snippet internal-blogcard-snippet">Google Apps Script（GAS）を使ってスプレッドシートを操作する際に便利なヘッダー取得とマッピングの方法を解説。配列の扱い方やスプレッドシートへの書き込み時の注意点も丁寧に解説しています。初心者にも分かりやすく、コードを劇的に読みやすくするための小技を紹介します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.03.09</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc7">3-3. HTML テーブルを組み立てる３ステップ</span></h3>



<ol class="wp-block-list">
<li><strong>ヘッダーを <code>&lt;th&gt;</code> に包む（⑥）</strong><br><code>headers.map()</code> で包み紙を付け、<code>.join('')</code> で連結 → <code>&lt;th&gt;商品ID&lt;/th&gt;…</code> が完成。</li>



<li><strong>データ行を <code>&lt;tr&gt;&lt;td&gt;</code> に変換（⑦）</strong><br><code>data.map()</code> 内でテンプレートリテラルに流し込み、<code>.join('')</code> で tbody 用の長い文字列に。<br>数値列は <code>parseInt()</code>＋<code>|| 0</code> で安全に整数化。</li>



<li><strong>テーブルを組み立てる（⑧）</strong><br><code>&lt;thead&gt;</code> に <code>thRow</code>、<code>&lt;tbody&gt;</code> に <code>tdRow</code> を入れてテーブル完成。<br>装飾は Bootstrap などを使うならクラス名に差し替えれば OK。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc8">4. 使用方法</span></h2>



<ol class="wp-block-list">
<li>スプレッドシートに <strong>「商品一覧」</strong> シートを作成<br>列は <strong>商品ID / 商品名 / カテゴリー / 在庫数</strong>（順番厳守）。</li>



<li>スクリプトエディタに上記コードを貼り付ける</li>



<li><strong>デプロイ → 新しいデプロイ → ウェブアプリ</strong> を選択</li>



<li>公開 URL を開くと、シートの内容が表になって表示されます 🎉</li>
</ol>



<figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td>商品ID</td><td>商品名</td><td>カテゴリー</td><td>在庫数</td></tr><tr><td>1001</td><td>シャンプー</td><td>風呂</td><td>1</td></tr><tr><td>1002</td><td>リンス</td><td>風呂</td><td>1</td></tr><tr><td>1003</td><td>ボディソープ</td><td>風呂</td><td>1</td></tr><tr><td>1004</td><td>トイレットペーパー</td><td>トイレ</td><td>1</td></tr><tr><td>1005</td><td>トイレ用洗剤</td><td>トイレ</td><td>1</td></tr><tr><td>1006</td><td>トイレ掃除シート</td><td>トイレ</td><td>1</td></tr><tr><td>1007</td><td>歯ブラシ</td><td>整容</td><td>1</td></tr></tbody></table><figcaption class="wp-element-caption">[商品一覧]シートの例</figcaption></figure>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="800" height="600" src="https://shoelab.jp/wp-content/uploads/2025/05/2e792b41dba50526aebb81bdf5ff7e8a.webp" alt="スプレッドシートの内容が表示されていれば成功" class="wp-image-638" srcset="https://shoelab.jp/wp-content/uploads/2025/05/2e792b41dba50526aebb81bdf5ff7e8a.webp 800w, https://shoelab.jp/wp-content/uploads/2025/05/2e792b41dba50526aebb81bdf5ff7e8a-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/05/2e792b41dba50526aebb81bdf5ff7e8a-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">アプリの表示例</figcaption></figure>



<p>URLをクリックしてスプレッドシートの内容が表示されていれば成功です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc9">5. まとめ</span></h2>



<ul class="wp-block-list">
<li><strong><code>HtmlService.createHtmlOutput()</code></strong> で GAS だけでも簡単に Web ページが作れる。</li>



<li>まずは <strong><code>doGet(e)</code> に HTML 文字列を返す</strong> だけで OK。</li>



<li>スプレッドシートと組み合わせれば、在庫リストや一覧表もサクッと表示。</li>
</ul>



<p>スプレッドシートのデータをそのまま Web ページ化すると、<strong>「表示に特化した専用ビュー」</strong> が手に入るので視認性がグッと向上します。<br>とくに――</p>



<ul class="wp-block-list">
<li><strong>現場のスマホ閲覧</strong><br>画面の小さなスマホでも余計な列やメニューを省いたテーブルだけを表示できるため、スクロール地獄から解放。</li>



<li><strong>リンク１発で共有</strong><br>「シートを開いて、フィルタを掛けて…」という手間がなく、URL をタップすれば即ダッシュボード。</li>



<li><strong>編集と閲覧の役割分担</strong><br>シート側は “データ入力専用”、Web 側は “見る専用” と切り分けられるので、誤操作や表示ズレのリスクが減ります。</li>
</ul>



<p>たとえば <strong>見本品の一覧や在庫表</strong> を管理しているケースなら、営業や製作スタッフが外出先・作業現場でも「在庫いくつ？」「最新の貸出ステータスは？」を一目で確認できます。業務の合間にスプレッドシート全体を開く時間を削減できるため、<strong>“探す時間” が “判断する時間” に置き換わり、結果として業務効率が大幅アップ</strong>。</p>



<p>「現場ですぐ見たい！」と少しでも感じたら、今回のコードをコピペしてまず動かしてみてください。たった数十行で、あなたのスプレッドシートが即席の Web ダッシュボードに早変わりします。</p>



<p>それでは、また。</p>



<p>テンプレートを使った方法はこちらの記事から</p>





<a target="_blank" href="https://shoelab.jp/%e8%a3%9c%e8%a3%85%e5%85%b7%e3%83%bb%e7%be%a9%e8%82%a2%e8%a3%85%e5%85%b7%e9%96%a2%e4%bf%82/%e3%80%90%e3%80%91gas%e3%81%ae%e5%b0%8f%e6%8a%80%e3%80%91%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88html%e3%81%a7%e3%83%a9%e3%82%af%e3%83%a9%e3%82%afweb%e3%82%a2%e3%83%97%e3%83%aa%e5%8c%96" title="https://shoelab.jp/%e8%a3%9c%e8%a3%85%e5%85%b7%e3%83%bb%e7%be%a9%e8%82%a2%e8%a3%85%e5%85%b7%e9%96%a2%e4%bf%82/%e3%80%90%e3%80%91gas%e3%81%ae%e5%b0%8f%e6%8a%80%e3%80%91%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88html%e3%81%a7%e3%83%a9%e3%82%af%e3%83%a9%e3%82%afweb%e3%82%a2%e3%83%97%e3%83%aa%e5%8c%96" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fshoelab.jp%2F%25e8%25a3%259c%25e8%25a3%2585%25e5%2585%25b7%25e3%2583%25bb%25e7%25be%25a9%25e8%2582%25a2%25e8%25a3%2585%25e5%2585%25b7%25e9%2596%25a2%25e4%25bf%2582%2F%25e3%2580%2590%25e3%2580%2591gas%25e3%2581%25ae%25e5%25b0%258f%25e6%258a%2580%25e3%2580%2591%25e3%2583%2586%25e3%2583%25b3%25e3%2583%2597%25e3%2583%25ac%25e3%2583%25bc%25e3%2583%2588html%25e3%2581%25a7%25e3%2583%25a9%25e3%2582%25af%25e3%2583%25a9%25e3%2582%25afweb%25e3%2582%25a2%25e3%2583%2597%25e3%2583%25aa%25e5%258c%2596?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">https://shoelab.jp/%e8%a3%9c%e8%a3%85%e5%85%b7%e3%83%bb%e7%be%a9%e8%82%a2%e8%a3%85%e5%85%b7%e9%96%a2%e4%bf%82/%e3%80%90%e3%80%91gas%e3%81%ae%e5%b0%8f%e6%8a%80%e3%80%91%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88html%e3%81%a7%e3%83%a9%e3%82%af%e3%83%a9%e3%82%afweb%e3%82%a2%e3%83%97%e3%83%aa%e5%8c%96</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp/%e8%a3%9c%e8%a3%85%e5%85%b7%e3%83%bb%e7%be%a9%e8%82%a2%e8%a3%85%e5%85%b7%e9%96%a2%e4%bf%82/%e3%80%90%e3%80%91gas%e3%81%ae%e5%b0%8f%e6%8a%80%e3%80%91%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88html%e3%81%a7%e3%83%a9%e3%82%af%e3%83%a9%e3%82%afweb%e3%82%a2%e3%83%97%e3%83%aa%e5%8c%96" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">shoelab.jp</div></div></div></div></a>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>第3回・総仕上げ！Deep Research発の“絵本プロンプト”で思考を省エネ化する</title>
		<link>https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/%e7%ac%ac3%e5%9b%9e%e3%83%bb%e7%b7%8f%e4%bb%95%e4%b8%8a%e3%81%92%ef%bc%81deep-research%e7%99%ba%e3%81%ae%e7%b5%b5%e6%9c%ac%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e3%81%a7/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sun, 20 Apr 2025 13:00:00 +0000</pubDate>
				<category><![CDATA[AI系]]></category>
		<guid isPermaLink="false">https://shoelab.jp/?p=611</guid>

					<description><![CDATA[こんにちは、イカPOです。第1回「ストーリー＆キャラ設定編」、続くの 第2回「画像生成編」 を読んでくださった方、お待たせしました。シリーズ締めくくりとなる今回は―― 「プロンプトを使って “思考” をテンプレ化し、エネ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、イカPOです。第1回「<a target="_blank" href="https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/%e7%ac%ac1%e5%9b%9e%e3%80%8cchatgpt%e3%81%a7%e5%ad%90%e4%be%9b%e7%94%a8%e3%81%ae%e7%b5%b5%e6%9c%ac%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%ef%bc%9a%e3%82%b9%e3%83%88%e3%83%bc%e3%83%aa/">ストーリー＆キャラ設定編</a>」、続くの 第2回「<a target="_blank" href="https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/%e7%ac%ac2%e5%9b%9e%ef%bc%9achatgpt%e3%81%a7%e5%ad%90%e4%be%9b%e7%94%a8%e3%81%ae%e7%b5%b5%e6%9c%ac%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%ef%bc%9a%e7%94%bb%e5%83%8f%e7%94%9f%e6%88%90/">画像生成編</a>」 を読んでくださった方、お待たせしました。シリーズ締めくくりとなる今回は――</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>「プロンプトを使って “思考” をテンプレ化し、エネルギーを節約する方法」</strong></p>
</blockquote>



<p>をまとめます。<br>前回までに <em>「絵本を1冊作る道のり」</em> は体験済み。やってみて痛感したのは <strong>“毎回ゼロから指示を書くと頭がしんどい”</strong> という現実でした。そこで、生まれたのが今回のプロンプトです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc1">これまでの試行錯誤をテンプレにしたプロンプトを作成</span></h2>



<h3 class="wp-block-heading"><span id="toc2">第1回・第2回の学びを“ぜんぶ盛り”した決定版プロンプト</span></h3>



<p>今回作成したプロンプトです。</p>



<details>
<summary>クリックで全文表示（コピペは自由にどうぞ）</summary>
<p>1〜2歳児向け絵本をデザインしたいので、絵本作家兼イラストレーターとしてストーリー原案と各ページのイラスト＋文章を制作してください。</p>
<p>【目的】<br>
言語・認知・視覚・情緒を同時に刺激し、1〜2歳児の発達を支援する絵本をデザイン。</p>
<p>【必須要素】<br>
1. オノマトペ：音と意味を直結し、語彙習得を促進<br>
2. 繰り返し構造：同一展開を2〜3回繰り返し、4回目で変化やオチ<br>
3. シンプル背景：不要装飾を抑え、主要モチーフに注視誘導<br>
4. 原色＋大図形：高コントラスト原色と大きなシルエットで興味喚起<br>
5. 語数ガイドライン：1ページ3〜13語で短くリズミカルに<br>
6. 大きめの字＋短文：1ページ1〜2文、読みやすいフォントサイズ<br>
7. 三の法則的リズム：3回の反復→4回目に変化で集中と飽きを防止  </p>
<p>【イラスト仕様】<br>
– タッチ：フラットカラー＋柔らかな線<br>
– カラー：原色中心／パレット［赤・青・黄・緑・オレンジ］<br>
– 解像度：300dpi、アスペクト比4:3 作成する画像は全て同じサイズで固定<br>
– ページ番号：左上に小さく挿入  </p>
<p>【制作フロー】<br>
1. **ストーリー原案の要素確認**<br>
   – 取り入れたいテーマやキャラクター設定を質問。<br>
2. **ストーリー案提示→承認**<br>
   – 回答を受け、ストーリー原案を提示。承認を得たら次へ。<br>
3. **1ページ目の制作**<br>
   – 〈イラスト構成＋テキスト〉を作成し提示。<br>
   – 文章に連動して自動的にイラストを生成し、テキストと合わせて提示。<br>
   – 生成画像で絵柄（タッチ・線の太さ・色使いなど）を確認し、承認を得る。<br>
   – 承認後は、絵柄を以降すべてのページで固定。  </p>
<p>4. **本文ページ制作 ＆ 進捗確認**<br>
   – 各ページごとに、テキストを作成すると同時に自動でイラストを生成し合わせて提示。<br>
   – ページ完成ごとに「←※今ここ」で現在ページを示し、次ページ制作の許可を確認。<br>
   – 必須要素とストーリーの整合性をチェックし、問題あれば都度提案・修正。 </p>
<p>5. **本文ページ完了後 → タイトルページ作成**<br>
   – 最後の本文ページ完成後、タイトル案（3〜5案）を提示。<br>
   – 承認を得たら、これまでの絵柄・サイズでタイトルページを作成。<br>
6. **タイトルページ承認後 → おまけページ提案 ＆ 作成**<br>
   – 本の総ページ数を調整するための「おまけ」ページ案を提示（キャラ紹介など）。<br>
   – 提案承認後、同じ絵柄・サイズでおまけページを作成。<br>
   – おまけには必ず本編に登場したキャラクターを含める。  </p>
<p>【ページ構成テンプレート】<br>
※ユーザー提示のストーリー原案シーン数に合わせて、以下のように動的にページ数 N を設定し、進捗確認を行ってください。<br>
1〜N: ユーザー原案の各シーン（N は原案のシーン数）<br>
N+1: タイトルページ<br>
N+2: おまけページ（キャラ紹介・ミニゲーム等）<br>
N+3: 裏表紙：おしまい・あいさつ（任意）  </p>
<p>（例：原案が10シーンなら本文ページ1〜10、11がタイトル、12がおまけ、13が裏表紙となります）  </p>
</details>



<h3 class="wp-block-heading"><span id="toc3">何を根拠に必須項目を決めたのか？Deep Researchを使ったデザイン法</span></h3>



<p>今回の絵本デザインの下敷きは、ChatGPT の <strong>Deep Research</strong> 機能で作成した<br>『0〜2歳児向け絵本デザインのための調査レポート（全32 ページ）』。<br>発達心理・市場動向・ベストセラー分析まで一気に掘り下げた私家版資料です。<br>“論文レベルの厳密エビデンス” とまでは言えませんが、<strong>自分で読んで腑に落ちた</strong> ので今回のテンプレに採用しました。</p>



<p>PDF は記事末尾に置いておくので、数値や引用元を深掘りしたい方はぜひ。<br>むしろ「ここ違うかも？」という検証コメント、大歓迎です。</p>



<h3 class="wp-block-heading"><span id="toc4">7つの必須要素 ― ざっくり解説</span></h3>



<ol class="wp-block-list">
<li><strong>オノマトペ</strong><br>「ワンワン」「ゴロゴロ」など、音と意味が直結した言葉を多用すると、耳に入った瞬間に情景が浮かびやすく、0〜2歳児の語彙取り込みがスムーズになります。</li>



<li><strong>繰り返し構造</strong><br>同じ展開を2〜3回くり返し、4回目で変化やオチを入れるパターン。<br>先が読める安心感と、“おっ！”という意外性を両取りできるので、最後まで集中が切れません。</li>



<li><strong>シンプル背景</strong><br>余計な装飾をそぎ落とし、主役だけを大きく配置。<br>視線が散らからず、キャラクターや仕掛けにフォーカスできます。</li>



<li><strong>原色＋大図形</strong><br>ビビッドな赤・青・黄などを、はっきりした形で示す。<br>乳児は高コントラストが大好物。ページをめくった瞬間に興味をグッと引き込めます。</li>



<li><strong>語数ガイドライン</strong><br>1ページ3〜13語の短いリズム文にすることで、聴覚への負荷を下げつつテンポ良く読み進められます。長文だと飽きやすいので注意。</li>



<li><strong>大きめの字＋短文</strong><br>1ページ1〜2文、フォントは大きく太め。<br>親が指でなぞり読みしやすく、子どもも「これが文字なんだ」と気づきやすいレイアウトです。</li>



<li><strong>三の法則的リズム</strong><br>「同じ→同じ→同じ→変化！」という4拍子リズム。<br>反復で理解を深めたところに変化を差し込むと、最後に「わっ！」と情緒を刺激できます。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>これら7項目は、Deep Researchで作成した調査レポートの実験・市場データにもとづいて抽出。テンプレに組み込み、毎回ゼロから悩まずに絵本構成を再現することを狙っています。</p>



<h3 class="wp-block-heading"><span id="toc5">なぜテンプレが必要なのか</span></h3>



<p><strong>テンプレを導入すると何がラクになるの？</strong></p>



<ul class="wp-block-list">
<li><strong>ページ構成の確認</strong>
<ul class="wp-block-list">
<li><em>都度考えると…</em>
<ul class="wp-block-list">
<li>「タイトルは何ページ目？」「おまけページを入れる？」で毎回迷う</li>
</ul>
</li>



<li><em>テンプレ化すると…</em>
<ul class="wp-block-list">
<li>固定フォーマットに当てはめるだけ。迷う余地ゼロ</li>
</ul>
</li>
</ul>
</li>



<li><strong>画像仕様の指示</strong>
<ul class="wp-block-list">
<li><em>都度考えると…</em>
<ul class="wp-block-list">
<li>dpi／アスペクト比／SEED などをその都度ググってコピペ</li>
</ul>
</li>



<li><em>テンプレ化すると…</em>
<ul class="wp-block-list">
<li>指示は最初から埋め込み済み。出来上がった画像の良しあしだけ判断すればOK</li>
</ul>
</li>
</ul>
</li>



<li><strong>発達エビデンスの挿入</strong>
<ul class="wp-block-list">
<li><em>都度考えると…</em>
<ul class="wp-block-list">
<li>論文を探して要約し、文章に手動で差し込む手間が発生</li>
</ul>
</li>



<li><em>テンプレ化すると…</em>
<ul class="wp-block-list">
<li>引用文と出典リンクを雛形に格納済み。必要なら項目をON/OFFするだけ</li>
</ul>
</li>
</ul>
</li>
</ul>



<p><strong>目的は時短ではなく “脳みその省エネ”。</strong><br>たとえば10冊シリーズを作るなら、最初の1冊で徹底的にテンプレを育て、2冊目以降は “中身の発想” にだけ集中できる――そんな運用を目指してプロンプトを作成しました。</p>



<h2 class="wp-block-heading"><span id="toc6">まとめ – 「考えないための考え方」</span></h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>手間のかかる操作はAIに押し付け、<strong>“ここは人間が決めたい”</strong> コア部分だけに思考リソースを注ぐ。</p>
</blockquote>



<p>シリーズ第1回・第2回で味わった試行錯誤を、テンプレという形で“脳の外”に追い出しました。<br>これで次に絵本を作るときは <strong>「テーマを差し替える → 走らせる → 目視チェック」</strong> の3ステップでOK。ぜひ皆さんも自分流に改造して、<strong>量産フェーズの相棒</strong> にしてみてください。</p>



<h4 class="wp-block-heading"><span id="toc7">今回作った調査レポートのPDF</span></h4>



<div data-wp-interactive="core/file" class="wp-block-file"><object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://shoelab.jp/wp-content/uploads/2025/04/98b95c5ba00ce2b55171929c6670227b.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="0〜2歳児向け絵本デザインのための調査レポートの埋め込み。"></object><a target="_blank" id="wp-block-file--media-af504a91-fd9e-4b7e-b6ba-08a953057b52" href="https://shoelab.jp/wp-content/uploads/2025/04/98b95c5ba00ce2b55171929c6670227b.pdf">0〜2歳児向け絵本デザインのための調査レポート</a><a target="_blank" href="https://shoelab.jp/wp-content/uploads/2025/04/98b95c5ba00ce2b55171929c6670227b.pdf" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-af504a91-fd9e-4b7e-b6ba-08a953057b52">ダウンロード</a></div>



<h5 class="wp-block-heading"><span id="toc8">関連記事</span></h5>



<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/%e7%ac%ac1%e5%9b%9e%e3%80%8cchatgpt%e3%81%a7%e5%ad%90%e4%be%9b%e7%94%a8%e3%81%ae%e7%b5%b5%e6%9c%ac%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%ef%bc%9a%e3%82%b9%e3%83%88%e3%83%bc%e3%83%aa/" title="第1回 ChatGPTで子供用の絵本を作ってみた：ストーリーとキャラ設定編" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/04/27238395c330881392165373d5097daa-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/04/27238395c330881392165373d5097daa-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/04/27238395c330881392165373d5097daa-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/04/27238395c330881392165373d5097daa-320x180.webp 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">第1回 ChatGPTで子供用の絵本を作ってみた：ストーリーとキャラ設定編</div><div class="blogcard-snippet internal-blogcard-snippet">ChatGPTで子供向け絵本をゼロから制作！ストーリー構成の考え方や主人公キャラの作成方法を、実際の会話ログとともに詳しく解説しています。AI初心者でも絵本づくりの第一歩が踏み出せる内容です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.04.06</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/%e7%ac%ac2%e5%9b%9e%ef%bc%9achatgpt%e3%81%a7%e5%ad%90%e4%be%9b%e7%94%a8%e3%81%ae%e7%b5%b5%e6%9c%ac%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%ef%bc%9a%e7%94%bb%e5%83%8f%e7%94%9f%e6%88%90/" title="第2回：ChatGPTで子供用の絵本を作ってみた：画像生成編" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/04/ce8d9f7e08c6b0cbf3caccdf71837d24-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/04/ce8d9f7e08c6b0cbf3caccdf71837d24-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/04/ce8d9f7e08c6b0cbf3caccdf71837d24-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/04/ce8d9f7e08c6b0cbf3caccdf71837d24-320x180.webp 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">第2回：ChatGPTで子供用の絵本を作ってみた：画像生成編</div><div class="blogcard-snippet internal-blogcard-snippet">※この記事は前回の続きです。前編ではストーリーとキャラ設定を紹介しています。イラストの製作を依頼してみた基本設定やストーリーを元に、イラスト製作の依頼をしてみます。早速問題発生。1ページから3ページまでのイラスト製作何も考えずに「1ページか...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.04.13</div></div></div></div></a>
</div></figure>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>第2回：ChatGPTで子供用の絵本を作ってみた：画像生成編</title>
		<link>https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/%e7%ac%ac2%e5%9b%9e%ef%bc%9achatgpt%e3%81%a7%e5%ad%90%e4%be%9b%e7%94%a8%e3%81%ae%e7%b5%b5%e6%9c%ac%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%ef%bc%9a%e7%94%bb%e5%83%8f%e7%94%9f%e6%88%90/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sun, 13 Apr 2025 13:00:00 +0000</pubDate>
				<category><![CDATA[AI系]]></category>
		<guid isPermaLink="false">https://shoelab.jp/?p=547</guid>

					<description><![CDATA[※この記事は前回の続きです。 前編ではストーリーとキャラ設定を紹介しています。 イラストの製作を依頼してみた 基本設定やストーリーを元に、イラスト製作の依頼をしてみます。早速問題発生。 1ページから3ページまでのイラスト [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>※この記事は<a target="_blank" href="https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/%e7%ac%ac1%e5%9b%9e%e3%80%8cchatgpt%e3%81%a7%e5%ad%90%e4%be%9b%e7%94%a8%e3%81%ae%e7%b5%b5%e6%9c%ac%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%ef%bc%9a%e3%82%b9%e3%83%88%e3%83%bc%e3%83%aa/" data-wplink-edit="true">前回の続き</a>です。</strong></p>
<p>前編ではストーリーとキャラ設定を紹介しています。</p>
<h2><span id="toc1">イラストの製作を依頼してみた</span></h2>
<p>基本設定やストーリーを元に、イラスト製作の依頼をしてみます。<br />早速問題発生。</p>
<h3><span id="toc2">1ページから3ページまでのイラスト製作</span></h3>
<p>何も考えずに「1ページから3ページまでのイラストを作成して」とお願いしました。</p>
<p><!-- 画像出力結果（見切れた1〜3ページ画像） --></p>
<p>出力された画像です。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-595" src="https://shoelab.jp/wp-content/uploads/2025/04/56e11283451fbc1e0e6c42efb7a8ff46-1024x683.png" alt="失敗例" width="1024" height="683" srcset="https://shoelab.jp/wp-content/uploads/2025/04/56e11283451fbc1e0e6c42efb7a8ff46-1024x683.png 1024w, https://shoelab.jp/wp-content/uploads/2025/04/56e11283451fbc1e0e6c42efb7a8ff46-300x200.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/56e11283451fbc1e0e6c42efb7a8ff46-768x512.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/56e11283451fbc1e0e6c42efb7a8ff46.png 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>メッチャ見切れてる。。。</p>
<p>あまりに見切れているので、スライドすれば見切れているところは勘違いしたほどです。<br />実はChatGPTの画像生成機能では、よくある現象のようです。</p>
<p>大きめの画像を作成しようとすると、枠内に収まらず見切れる現象が発生してしまいます。<br />合計3枚の画像を作成してもらうつもりで依頼しましたが、1ページ目から3ページ目をまとめて1枚の画像で出力してくれようとした結果、見切れてしまった…のかなと考察しています。</p>
<p>しかし、キャラクター、ストーリーの進め方は私の狙いどおりの回答だったので、この画像を1枚ずつ出力するように依頼しなおします。</p>
<h3><span id="toc3">1ページずつ画像を作成するように再依頼</span></h3>
<p>出力してくれた画像が見切れて見えないことと、1枚ずつ出力してほしいことを伝えています。</p>
<p>１枚目</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-592" src="https://shoelab.jp/wp-content/uploads/2025/04/3049c2470eaf4704fb41bb63698e23af-300x300.webp" alt="ページ1" width="300" height="300" srcset="https://shoelab.jp/wp-content/uploads/2025/04/3049c2470eaf4704fb41bb63698e23af-300x300.webp 300w, https://shoelab.jp/wp-content/uploads/2025/04/3049c2470eaf4704fb41bb63698e23af-150x150.webp 150w, https://shoelab.jp/wp-content/uploads/2025/04/3049c2470eaf4704fb41bb63698e23af-768x768.webp 768w, https://shoelab.jp/wp-content/uploads/2025/04/3049c2470eaf4704fb41bb63698e23af.webp 1024w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>2枚目</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-579" src="https://shoelab.jp/wp-content/uploads/2025/04/f47095c9de59ae529a7726511439b230-300x300.png" alt="ページ2" width="300" height="300" srcset="https://shoelab.jp/wp-content/uploads/2025/04/f47095c9de59ae529a7726511439b230-300x300.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/f47095c9de59ae529a7726511439b230-150x150.png 150w, https://shoelab.jp/wp-content/uploads/2025/04/f47095c9de59ae529a7726511439b230-768x768.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/f47095c9de59ae529a7726511439b230.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>3枚目</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-580" src="https://shoelab.jp/wp-content/uploads/2025/04/13bbb43246e76983ba06e18f5d6d1b3c-300x300.png" alt="ページ3" width="300" height="300" srcset="https://shoelab.jp/wp-content/uploads/2025/04/13bbb43246e76983ba06e18f5d6d1b3c-300x300.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/13bbb43246e76983ba06e18f5d6d1b3c-150x150.png 150w, https://shoelab.jp/wp-content/uploads/2025/04/13bbb43246e76983ba06e18f5d6d1b3c-768x768.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/13bbb43246e76983ba06e18f5d6d1b3c.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p><!-- 画像出力結果（2ページ目） --><br /><!-- 画像出力結果（3ページ目） --></p>
<p>狙い通りの3枚を作成できました。</p>
<p>探検に出かける → 茂みの中に隠れてる動物に注目する → 動物を見つけるのパターンを完全に理解し、イラストを出力しています。<br />文言も絵本でよく見かける文言らしくてばっちりです。</p>
<h3 class="" data-start="67" data-end="94"><span id="toc4">ChatGPTで次のシーンをそのまま作っていく</span></h3>
<p class="" data-start="96" data-end="195">赤いきつねを見つけたので、次は青いペンギンを登場させるシーンを作ることにしました。<br data-start="137" data-end="140" />ここでもChatGPTに指示を出して、4ページ目「ペンギンを探しているシーン」のイラストを作成してもらいます。</p>
<p data-start="96" data-end="195"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-585" src="https://shoelab.jp/wp-content/uploads/2025/04/c2baf0626664c099e967014c65a1e2e7-300x300.png" alt="" width="300" height="300" srcset="https://shoelab.jp/wp-content/uploads/2025/04/c2baf0626664c099e967014c65a1e2e7-300x300.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/c2baf0626664c099e967014c65a1e2e7-150x150.png 150w, https://shoelab.jp/wp-content/uploads/2025/04/c2baf0626664c099e967014c65a1e2e7-768x768.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/c2baf0626664c099e967014c65a1e2e7.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p class="" data-start="197" data-end="274">お願いした内容に対して、GPTはちゃんとストーリーの流れを理解してくれていて、<br data-start="236" data-end="239" />期待通りの「影に隠れているペンギンを探す」シーンを出力してくれました。</p>
<p class="" data-start="276" data-end="332">続いて5ページ目。</p>
<p class="" data-start="276" data-end="332"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-586" src="https://shoelab.jp/wp-content/uploads/2025/04/3db155c6d7d0bb3666dbdd4d419df7d9-300x300.png" alt="ページ5" width="300" height="300" srcset="https://shoelab.jp/wp-content/uploads/2025/04/3db155c6d7d0bb3666dbdd4d419df7d9-300x300.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/3db155c6d7d0bb3666dbdd4d419df7d9-150x150.png 150w, https://shoelab.jp/wp-content/uploads/2025/04/3db155c6d7d0bb3666dbdd4d419df7d9-768x768.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/3db155c6d7d0bb3666dbdd4d419df7d9.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /><br data-start="285" data-end="288" />こちらはペンギンが登場して、仲間になるシーンです。少しだけ色味が違いましたが、今回は良しとしています。</p>
<p class="" data-start="334" data-end="358">そのまま6〜9ページ目も、順調に出力されました。</p>
<p class="" data-start="362" data-end="372">黄色い動物を探す</p>
<p data-start="362" data-end="372"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-587" src="https://shoelab.jp/wp-content/uploads/2025/04/53c3c4dbe15add01c5b9c9c88af7baa4-300x300.png" alt="ページ6" width="300" height="300" srcset="https://shoelab.jp/wp-content/uploads/2025/04/53c3c4dbe15add01c5b9c9c88af7baa4-300x300.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/53c3c4dbe15add01c5b9c9c88af7baa4-150x150.png 150w, https://shoelab.jp/wp-content/uploads/2025/04/53c3c4dbe15add01c5b9c9c88af7baa4-768x768.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/53c3c4dbe15add01c5b9c9c88af7baa4.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p class="" data-start="375" data-end="385">黄色いぞうを発見</p>
<p data-start="375" data-end="385"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-588" src="https://shoelab.jp/wp-content/uploads/2025/04/3547dcaf751316e3419bacd3996f9ba4-300x300.png" alt="" width="300" height="300" srcset="https://shoelab.jp/wp-content/uploads/2025/04/3547dcaf751316e3419bacd3996f9ba4-300x300.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/3547dcaf751316e3419bacd3996f9ba4-150x150.png 150w, https://shoelab.jp/wp-content/uploads/2025/04/3547dcaf751316e3419bacd3996f9ba4-768x768.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/3547dcaf751316e3419bacd3996f9ba4.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p class="" data-start="405" data-end="416">上空からの集合写真</p>
<p data-start="405" data-end="416"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-589" src="https://shoelab.jp/wp-content/uploads/2025/04/fad2f2af4050acc8db151d13c02acc2f-300x300.png" alt="" width="300" height="300" srcset="https://shoelab.jp/wp-content/uploads/2025/04/fad2f2af4050acc8db151d13c02acc2f-300x300.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/fad2f2af4050acc8db151d13c02acc2f-150x150.png 150w, https://shoelab.jp/wp-content/uploads/2025/04/fad2f2af4050acc8db151d13c02acc2f-768x768.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/fad2f2af4050acc8db151d13c02acc2f.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p class="" data-start="418" data-end="480">という流れで、ストーリー構成もイラスト内容もばっちり。<br data-start="445" data-end="448" />「なにかな？」「〇〇さんだー！」という絵本らしい展開も抜群です。</p>
<hr class="" data-start="482" data-end="485" />
<h2 data-start="487" data-end="513"><span id="toc5">急に絵柄が変わる！？画風はSEEDで固定せよ</span></h2>
<p class="" data-start="515" data-end="586">さて、最後の「おしまい」のページを依頼したところ、ここで問題発生。<br data-start="548" data-end="551" />ChatGPTが急にこれまでと違うタッチのイラストを出力してきました。<img loading="lazy" decoding="async" class="size-medium wp-image-608 aligncenter" src="https://shoelab.jp/wp-content/uploads/2025/04/9c2215a873ccc7e4b46f75e617dee5a2-300x300.webp" alt="おしまいの失敗例" width="300" height="300" srcset="https://shoelab.jp/wp-content/uploads/2025/04/9c2215a873ccc7e4b46f75e617dee5a2-300x300.webp 300w, https://shoelab.jp/wp-content/uploads/2025/04/9c2215a873ccc7e4b46f75e617dee5a2-150x150.webp 150w, https://shoelab.jp/wp-content/uploads/2025/04/9c2215a873ccc7e4b46f75e617dee5a2-768x768.webp 768w, https://shoelab.jp/wp-content/uploads/2025/04/9c2215a873ccc7e4b46f75e617dee5a2.webp 1024w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p class="" data-start="588" data-end="618">ちょっとこれは……違う。画風が一気に変わってしまっています。</p>
<p class="" data-start="620" data-end="750">このような事態を避けるため、<strong data-start="634" data-end="654">画像生成時の「SEED値」を固定</strong>するという方法を使います。<br data-start="667" data-end="670" />SEEDとは、画像を生成する際のランダム要素を決定する「タネ」のようなもの。<br data-start="708" data-end="711" />これを固定することで、似た雰囲気のイラストを連続して作成できるようになります。</p>
<blockquote data-start="752" data-end="827">
<p class="" data-start="754" data-end="827">🔗 参考：<br data-start="760" data-end="763" /><a rel="nofollow noopener" target="_blank" class="" href="https://romptn.com/article/21543" data-start="765" data-end="827">画像生成のSEED値とは？ &#8211; romptn.com</a></p>
</blockquote>
<p class="" data-start="829" data-end="932">「同じ構図・テイストでSEEDを指定した状態で、最後のページを作りたい」と依頼したところ、<br data-start="874" data-end="877" />再び狙い通りのテイストで画像を生成してくれました。<br data-start="902" data-end="905" />ややズレた部分もありましたが、これは愛嬌ということで。</p>
<p data-start="829" data-end="932"><img loading="lazy" decoding="async" class="size-medium wp-image-597 aligncenter" src="https://shoelab.jp/wp-content/uploads/2025/04/cc4996dc76f49141a4fba5be4f0061e3-1-300x300.png" alt="おしまい" width="300" height="300" srcset="https://shoelab.jp/wp-content/uploads/2025/04/cc4996dc76f49141a4fba5be4f0061e3-1-300x300.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/cc4996dc76f49141a4fba5be4f0061e3-1-150x150.png 150w, https://shoelab.jp/wp-content/uploads/2025/04/cc4996dc76f49141a4fba5be4f0061e3-1-768x768.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/cc4996dc76f49141a4fba5be4f0061e3-1.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<hr class="" data-start="934" data-end="937" />
<h3 class="" data-start="939" data-end="953"><span id="toc6">表紙も依頼して完成！</span></h3>
<p class="" data-start="955" data-end="974">最後に、表紙のイラストも依頼しました。</p>
<p data-start="955" data-end="974"><img loading="lazy" decoding="async" class="aligncenter wp-image-581 size-medium" src="https://shoelab.jp/wp-content/uploads/2025/04/77d0d6a051d6497df8380beb1c9e20b3-300x300.png" alt="タイトル" width="300" height="300" srcset="https://shoelab.jp/wp-content/uploads/2025/04/77d0d6a051d6497df8380beb1c9e20b3-300x300.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/77d0d6a051d6497df8380beb1c9e20b3-150x150.png 150w, https://shoelab.jp/wp-content/uploads/2025/04/77d0d6a051d6497df8380beb1c9e20b3-768x768.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/77d0d6a051d6497df8380beb1c9e20b3.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<ul data-start="976" data-end="1051">
<li class="" data-start="976" data-end="998">
<p class="" data-start="978" data-end="998">タイトルは「いろいろ みーつけた！」</p>
</li>
<li class="" data-start="999" data-end="1026">
<p class="" data-start="1001" data-end="1026">葵ちゃんは仁王立ちで、首から双眼鏡を下げている</p>
</li>
<li class="" data-start="1027" data-end="1051">
<p class="" data-start="1029" data-end="1051">動物たちは茂みに隠れて、お尻だけが見えている</p>
</li>
</ul>
<p class="" data-start="1053" data-end="1089">といった細かな希望を伝えてみたところ、イメージ通りの表紙が完成しました。</p>
<hr class="" data-start="1091" data-end="1094" />
<h3 class="" data-start="1096" data-end="1114"><span id="toc7">印刷してみた</span></h3>
<p data-start="1116" data-end="1210"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-598" src="https://shoelab.jp/wp-content/uploads/2025/04/441b263cba983f3ba67c0302fde6165a-1024x590.webp" alt="実際に印刷した画像" width="1024" height="590" srcset="https://shoelab.jp/wp-content/uploads/2025/04/441b263cba983f3ba67c0302fde6165a-1024x590.webp 1024w, https://shoelab.jp/wp-content/uploads/2025/04/441b263cba983f3ba67c0302fde6165a-300x173.webp 300w, https://shoelab.jp/wp-content/uploads/2025/04/441b263cba983f3ba67c0302fde6165a-768x443.webp 768w, https://shoelab.jp/wp-content/uploads/2025/04/441b263cba983f3ba67c0302fde6165a-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/04/441b263cba983f3ba67c0302fde6165a.webp 1528w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p class="" data-start="1116" data-end="1210">完成した絵本をコンビニで印刷。<br data-start="1156" data-end="1159" />紙芝居風に仕上がった絵本を娘に渡すと、めちゃくちゃ喜んでくれました（そしてすぐ分解されました……笑）。</p>
<p class="" data-start="1212" data-end="1293">あとで気づいたのですが、製本を意識した余白調整などは全然できておらず……<br data-start="1248" data-end="1251" />「絵本」というよりは「紙芝居」に近い出来でした。<br data-start="1275" data-end="1278" />このあたりは今後の課題ですね。</p>
<hr class="" data-start="1295" data-end="1298" />
<h2 data-start="1300" data-end="1328"><span id="toc8">まとめ：ChatGPTで絵本を作るときのポイント</span></h2>
<p class="" data-start="1330" data-end="1355">最後に、今回の制作で得られたポイントをまとめます。</p>
<ul data-start="1357" data-end="1509">
<li class="" data-start="1357" data-end="1405">
<p class="" data-start="1359" data-end="1405">ChatGPTに<strong data-start="1367" data-end="1378">役割を持たせる</strong>と、良い回答が返ってくる（例：絵本作家になってもらう）</p>
</li>
<li class="" data-start="1406" data-end="1424">
<p class="" data-start="1408" data-end="1424">出力の<strong data-start="1411" data-end="1424">進行はこまめに確認</strong></p>
</li>
<li class="" data-start="1425" data-end="1450">
<p class="" data-start="1427" data-end="1450"><strong data-start="1427" data-end="1441">1ページずつ依頼する</strong>ことでミスを防げる</p>
</li>
<li class="" data-start="1451" data-end="1478">
<p class="" data-start="1453" data-end="1478"><strong data-start="1453" data-end="1471">SEED値を使って画風を固定</strong>すると安定する</p>
</li>
<li class="" data-start="1479" data-end="1509">
<p class="" data-start="1481" data-end="1509">印刷を前提にするなら<strong data-start="1491" data-end="1506">余白・裁ち落としの配慮</strong>が必要</p>
</li>
</ul>
<p class="" data-start="1511" data-end="1588">ChatGPTは、まさに「東大卒の新入社員」的な賢さとズレをあわせ持つAIです。<br data-start="1551" data-end="1554" />こちらの意図を丁寧に伝えれば、すごいポテンシャルを発揮してくれます。</p>
<blockquote data-start="1590" data-end="1751">
<p class="" data-start="1592" data-end="1751">🧵 引用元：<br data-start="1599" data-end="1602" /><a rel="nofollow noopener" target="_blank" class="" href="https://www.threads.net/@tomomi.insta_/post/DIEZqz7TSYS" data-start="1604" data-end="1718">https://www.threads.net/@tomomi.insta_/post/DIEZqz7TSYS</a></p>
</blockquote>
<hr class="" data-start="1753" data-end="1756" />
<h3 class="" data-start="1758" data-end="1778"><span id="toc9">最後に</span></h3>
<p class="" data-start="1780" data-end="1837">絵本を作って、印刷して、娘に見せたとき。<br data-start="1800" data-end="1803" />こちらの熱意が伝わったのか、すごくニコニコしてくれて嬉しかったです。</p>
<p class="" data-start="1839" data-end="1892">「自分で作ったもので人に喜んでもらう」<br data-start="1858" data-end="1861" />これ、義肢装具士（PO）の仕事にも通じるところがありますよね。</p>
<p data-start="1839" data-end="1892">前回の記事</p>


<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/%e7%ac%ac1%e5%9b%9e%e3%80%8cchatgpt%e3%81%a7%e5%ad%90%e4%be%9b%e7%94%a8%e3%81%ae%e7%b5%b5%e6%9c%ac%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%ef%bc%9a%e3%82%b9%e3%83%88%e3%83%bc%e3%83%aa/" title="第1回 ChatGPTで子供用の絵本を作ってみた：ストーリーとキャラ設定編" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/04/27238395c330881392165373d5097daa-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/04/27238395c330881392165373d5097daa-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/04/27238395c330881392165373d5097daa-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/04/27238395c330881392165373d5097daa-320x180.webp 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">第1回 ChatGPTで子供用の絵本を作ってみた：ストーリーとキャラ設定編</div><div class="blogcard-snippet internal-blogcard-snippet">ChatGPTで子供向け絵本をゼロから制作！ストーリー構成の考え方や主人公キャラの作成方法を、実際の会話ログとともに詳しく解説しています。AI初心者でも絵本づくりの第一歩が踏み出せる内容です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.04.06</div></div></div></div></a>
</div></figure>



<p>絵本作成用のプロンプトはこちらの記事を参照</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/%e7%ac%ac3%e5%9b%9e%e3%83%bb%e7%b7%8f%e4%bb%95%e4%b8%8a%e3%81%92%ef%bc%81deep-research%e7%99%ba%e3%81%ae%e7%b5%b5%e6%9c%ac%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e3%81%a7/" title="第3回・総仕上げ！Deep Research発の“絵本プロンプト”で思考を省エネ化する" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-300x169.webp 300w, https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-1024x576.webp 1024w, https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-768x432.webp 768w, https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-320x180.webp 320w, https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a.webp 1280w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">第3回・総仕上げ！Deep Research発の“絵本プロンプト”で思考を省エネ化する</div><div class="blogcard-snippet internal-blogcard-snippet">ChatGPTのDeep Researchを活用した「0〜2歳児向け絵本」制作テンプレート術を公開。第3回完結編では、毎回の指示作成を省エネ化し、思考リソースを最大化するプロンプト活用法を解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.04.20</div></div></div></div></a>
</div></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>第1回 ChatGPTで子供用の絵本を作ってみた：ストーリーとキャラ設定編</title>
		<link>https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/%e7%ac%ac1%e5%9b%9e%e3%80%8cchatgpt%e3%81%a7%e5%ad%90%e4%be%9b%e7%94%a8%e3%81%ae%e7%b5%b5%e6%9c%ac%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%ef%bc%9a%e3%82%b9%e3%83%88%e3%83%bc%e3%83%aa/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sun, 06 Apr 2025 06:00:00 +0000</pubDate>
				<category><![CDATA[AI系]]></category>
		<guid isPermaLink="false">https://shoelab.jp/?p=533</guid>

					<description><![CDATA[※この記事は全2回の分割構成です。第1回ではストーリー作りとキャラクター設定までを、第2回では画像生成から印刷・製本までを紹介しています。 こんにちは、イカPOです。 ChatGPT-4の画像生成機能が大幅にパワーアップ [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><!-- 第1回：ChatGPTで子供用の絵本を作ってみた：ストーリーとキャラクター設定編 --></p>
<p><strong>※この記事は全2回の分割構成です。</strong><br />第1回ではストーリー作りとキャラクター設定までを、<br />第2回では画像生成から印刷・製本までを紹介しています。</p>
<p>こんにちは、イカPOです。</p>
<p>ChatGPT-4の画像生成機能が大幅にパワーアップして話題になりました。<br />あちこちで取り上げられています。</p>
<p>参考リンク：<br /><a rel="nofollow noopener" target="_blank" href="https://chatgpt-lab.com/n/n8447382996d2">https://chatgpt-lab.com/n/n8447382996d2</a><br /><a rel="nofollow noopener" target="_blank" href="https://note.com/subarasikiai/n/nc3914aef9253">https://note.com/subarasikiai/n/nc3914aef9253</a></p>
<p>さて、我が家には、今年1歳になる娘がいます。毎日絵本を読んで、毎日かじっています。<br />家賃、食費、雑費、バイクのローン、ChatGPT Plusの月額料金、ポケポケのプレミアムパス、アマプラの年会費…。</p>
<p>欲望まみれの現代社会では節約も難しく、安月給の私には、新しい絵本を買う余裕はなかなかありません。<br />娘は、自分でかじったボロボロの絵本を楽しそうに読んでいますが、 親としてはやっぱり新しい絵本も買ってあげたい…。</p>
<p>そこで、ひらめきました。</p>
<p><strong>「あれ？せっかくChatGPT Plusに入ってるなら、子供用の絵本を作れって言えば、作ってくれるんじゃね？」</strong></p>
<p>今回は、ChatGPTと一緒に絵本を作った製作の足跡を紹介します。<br />同じ手順を踏めば、絵本が作れるはずなので、読み終わったあとはお試しください。</p>
<h2><span id="toc1">ストーリー製作を頼んでみた。</span></h2>
<p>まずはストーリーを考えて、そのストーリーを元にイラスト考える手順で、絵本製作を進めることにしました。（chatGPTは言語で指示を出す必要があるのでその手段が妥当だと判断）</p>
<h4><span id="toc2">絵本のテーマやイラストのスタイルなど絵本の基本情報を決める</span></h4>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-551 size-large" src="https://shoelab.jp/wp-content/uploads/2025/04/bbf3a4371fa4a96422c65999a01351c1-1024x440.png" alt=" 赤ちゃん用の絵本を作りたい。イラスト作成を手伝って。" width="1024" height="440" srcset="https://shoelab.jp/wp-content/uploads/2025/04/bbf3a4371fa4a96422c65999a01351c1-1024x440.png 1024w, https://shoelab.jp/wp-content/uploads/2025/04/bbf3a4371fa4a96422c65999a01351c1-300x129.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/bbf3a4371fa4a96422c65999a01351c1-768x330.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/bbf3a4371fa4a96422c65999a01351c1-1536x659.png 1536w, https://shoelab.jp/wp-content/uploads/2025/04/bbf3a4371fa4a96422c65999a01351c1.png 1854w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>まずは、ものすごく雑に「イラストを作りたい」。と依頼しました。すると、絵本の構成や、イラストのスタイルについて聞いてくれました。</p>
<details>
<summary>ChatGPTとの会話全文を表示</summary>
<p><strong>私：</strong><br />赤ちゃん用の絵本を作りたい。イラスト作成を手伝って。</p>
<p><strong>ChatGPT：</strong><br />素敵なアイデアですね！赤ちゃん向け絵本のイラスト作成、ぜひお手伝いします。<br />まず、いくつか確認させてください：<br />■ 絵本のテーマ（例：動物、色、かず、あいさつ、家族 など）<br />■ 対象年齢（例：0歳～1歳、1歳～2歳など）<br />■ ページ数の目安（例：6ページ、10ページなど）<br />■ 登場キャラクターの有無（例：うさぎの赤ちゃん、くまのおとうさん など）<br />■ イラストのスタイル（色味：パステル調／ビビッドカラーなど、タッチ：手描き風／アニメ風など）<br />■ 画像サイズ（印刷用 or デジタル用）<br />■ 表紙の有無、テキストの準備 などなど…<br />よければ、ざっくりでいいので上記の項目を教えてください。<br />それに合わせて、まずは1ページ分のラフイラストを作成し、テイストを確認してから本制作に進めましょう！</p>
</details>
<p>とりあえず絵本を作ることは理解してくれました。<br />絵本をつくるのに必要な要素について色々と提案してくれたので、その提案に乗っかり次の質問を渡します。</p>
<h3><span id="toc3">ChatGPTに「売れっ子絵本作家」のロールを持たせて、ストーリーを整理してもらう</span></h3>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-552 size-large" src="https://shoelab.jp/wp-content/uploads/2025/04/6270c393ed29a6b9f0590da91c532e27-1024x515.png" alt="次にGPTに特定の役割「売れっ子絵本作家」を持たせて、絵本作家の視点から回答してもらうよう依頼しました。" width="1024" height="515" srcset="https://shoelab.jp/wp-content/uploads/2025/04/6270c393ed29a6b9f0590da91c532e27-1024x515.png 1024w, https://shoelab.jp/wp-content/uploads/2025/04/6270c393ed29a6b9f0590da91c532e27-300x151.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/6270c393ed29a6b9f0590da91c532e27-768x386.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/6270c393ed29a6b9f0590da91c532e27-1536x773.png 1536w, https://shoelab.jp/wp-content/uploads/2025/04/6270c393ed29a6b9f0590da91c532e27.png 1634w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p class="" data-start="62" data-end="159">次にGPTに特定の役割「売れっ子絵本作家」を持たせて、絵本作家の視点から回答してもらうよう依頼しました。<br data-start="114" data-end="117" />GPTからの質問には、とにかく思いついたことをどんどん羅列するスタイルで返しました。</p>
<p class="" data-start="161" data-end="334">子供は淡い色よりも原色のほうが認識しやすいって、以前保健師さんが言ってたのを思い出して、原色を使ってほしいとも伝えています。<br data-start="223" data-end="226" />あと、子供が「いないいないばあ」を喜ぶ理由について、<a rel="nofollow noopener" target="_blank" href="https://amzn.to/3GiIyV8">『センスの哲学』</a>に書かれてた理論を思い出して、「隠れて→出てくる」っていう仕組みを取り入れたら、娘への受けもよくなるんじゃね？と思って、そんな原案を提出しています。</p>
<details>
<summary>ChatGPTのストーリー提案全文を見る</summary>
<p>了解しました！それでは、売れっ子絵本作家として、赤ちゃん向け絵本「おともだち どーこだ？」のストーリーを以下のように整理してみました：</p>
<p><strong>絵本タイトル案：</strong><br />『○○（娘の名前）ちゃんと いろいろどうぶつ』</p>
<p><strong>基本構成（全10ページ案）：</strong></p>
<ul>
<li><strong>■ 表紙（1ページ目）</strong><br />タイトルと主人公・○○（娘の名前）ちゃんが笑顔で森に入っていくイラスト。</li>
<li><strong>■ 2ページ目：導入</strong><br />文：<br />「○○（娘の名前）ちゃんは もりへ たんけんに きました。<br />きょうは どんな おともだちに あえるかな？」<br />○○（娘の名前）ちゃんが双眼鏡を持ってわくわくしている様子。</li>
<li><strong>■ 3〜8ページ：色ごとの動物を発見し、一緒に歩く展開（各色1〜2ページ）</strong>
<ul>
<li><strong>● 3〜4ページ：赤い動物</strong><br />文例：<br />「しげみの なかに なにかが いるよ。<br />なにかな？ なにかな？」<br />→「わあ！ あかい きつねさんだ！」<br />→「いっしょに いこう、きつねさん！」<br />茂みの中から赤いキツネが出てくる。<br />次のページで○○（娘の名前）ちゃんとキツネが手をつないで歩く。</li>
<li><strong>● 5〜6ページ：青い動物</strong><br />「おおきな きの うしろに かくれてるよ。<br />だれかな？ だれかな？」<br />→「あおい ぺんぎんさんだー！」<br />街角の壁の陰からペンギンが出てきて、同行。</li>
<li><strong>● 7〜8ページ：黄色の動物</strong><br />「やまの ふもとの くさむらに なにかがいる！<br />だれかな？」<br />→「きいろい ぞうさんだー！」<br />草むらからゾウが出てきて、○○（娘の名前）ちゃんの仲間に。</li>
</ul>
</li>
<li><strong>■ 9ページ目：全員そろって森の中を行進</strong><br />文：<br />「○○（娘の名前）ちゃんと どうぶつたちは、みんなで なかよく あるいていきます。」<br />○○（娘の名前）ちゃん＋キツネ＋ペンギン＋ゾウの行進。</li>
<li><strong>■ 10ページ目：集合写真風の締め</strong><br />文：<br />「みんなで パシャッ！ たからものの しゃしんが とれました。」<br />上空から見た円陣集合写真風イラスト。中央に笑顔の○○（娘の名前）ちゃん。</li>
</ul>
<p><strong>ポイント：</strong><br />色・動物・隠れる→見つかる→仲間になる という反復構造で、赤ちゃんにとって覚えやすく、安心感のある展開。<br />最後の「集合写真」で達成感・一体感を演出。<br />赤ちゃん向けなので、文はすべて平仮名でリズムよく、声に出して読んで楽しいように設計。</p>
<p>次に「ページごとのイラスト案」も作成できますが、まずはこのストーリー案について、修正・追加したい点があれば教えてください！</p>
</details>
<p>ザックリとしたタイトル案や、ストーリーの流れをつくってくれました。<br data-start="104" data-end="107" />大体の流れは概ね気に入ったのと、GPTがポイントとして提供してくれた「色・動物・隠れる→見つかる→仲間になる という反復構造で、赤ちゃんにとって覚えやすく、安心感のある展開」ってやつが、まさに自分の意図通りだったので、「GPT、これは狙いを理解してくれてる……！？？」ってなりました。<br data-start="249" data-end="252" />ということで、ストーリーの流れは修正せず、そのまま次の質問でイラストのスタイル指定に進めることにしました。</p>
<h2><span id="toc4">娘の写真をベースに絵本の主人公のキャラクターを作成</span></h2>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-553 size-large" src="https://shoelab.jp/wp-content/uploads/2025/04/be12e4ece89874f032b9fbece24ba0c0-1024x321.png" alt="娘写真のGPTに渡して主人公のキャラクター作成を依頼しました。" width="1024" height="321" srcset="https://shoelab.jp/wp-content/uploads/2025/04/be12e4ece89874f032b9fbece24ba0c0-1024x321.png 1024w, https://shoelab.jp/wp-content/uploads/2025/04/be12e4ece89874f032b9fbece24ba0c0-300x94.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/be12e4ece89874f032b9fbece24ba0c0-768x241.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/be12e4ece89874f032b9fbece24ba0c0-1536x482.png 1536w, https://shoelab.jp/wp-content/uploads/2025/04/be12e4ece89874f032b9fbece24ba0c0.png 1545w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>娘の写真GPTに渡して主人公のキャラクター作成を依頼しました。<br />イラストのテイストも指定してます。特に子供はアンパンマン様のような丸い形のデザインを視認しやすいと、保健師さんが言っていたので、それを参考にGPTにデザインを依頼しています。<br />後は原色重視かつできるだけシンプルであること、ダメ押しで対象年齢も指定しています。<br />後々に印刷することも踏まえて、印刷する旨も伝えています。大きめの画像を作ってもらうことを指示しています。</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-555 size-medium" src="https://shoelab.jp/wp-content/uploads/2025/04/0d742489cd8d66d039c8a9787622e03f-300x300.png" alt="主人公のメインビジュアル" width="300" height="300" srcset="https://shoelab.jp/wp-content/uploads/2025/04/0d742489cd8d66d039c8a9787622e03f-300x300.png 300w, https://shoelab.jp/wp-content/uploads/2025/04/0d742489cd8d66d039c8a9787622e03f-150x150.png 150w, https://shoelab.jp/wp-content/uploads/2025/04/0d742489cd8d66d039c8a9787622e03f-768x768.png 768w, https://shoelab.jp/wp-content/uploads/2025/04/0d742489cd8d66d039c8a9787622e03f.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p><!-- 画像出力結果（主人公キャラ） --></p>
<p>大体狙い通りのキャラクターができあがりました。服装を再現しつつ色だけ変更してくれているのに凄みを感じます。</p>
<h4><span id="toc5">キャラクター・構成の理解をGPTに整理してもらった</span></h4>
<p>このキャラクターが気に入ったのと、GPTがこれまでの会話を理解しているか、不安になったので、会話の流れの整理を依頼しました。</p>
<details>
<summary>ChatGPTによる整理結果を見る</summary>
<p>了解しました。それでは、赤ちゃん向け絵本『○○（娘の名前）ちゃんと いろいろどうぶつ』のストーリー構成・対象年齢・色の使い方・デザインコンセプトを以下にまとめます。</p>
<p><strong>タイトル（仮）：</strong><br />『○○（娘の名前）ちゃんと いろいろどうぶつ』</p>
<p><strong>対象年齢：</strong><br />1歳〜2歳向け<br />絵と言葉の繰り返しで赤ちゃんの視覚的好奇心を引き出し、言葉の理解や発語のきっかけになる設計。<br />親子の読み聞かせを前提としたテンポの良い短いフレーズ。</p>
<p><strong>ストーリー構成（全10ページ）：</strong></p>
<ul>
<li><strong>導入（表紙＋1P）：</strong><br />森へ出かける○○（娘の名前）ちゃん。「どんなおともだちに あえるかな？」</li>
<li><strong>探検パート（2P〜7P）：</strong><br />色ごとの動物を見つけて、一緒に旅する反復パターン。<br />&#8211; 赤 → 赤いきつね（しげみ）<br />&#8211; 青 → 青いぺんぎん（街角のかげ）<br />&#8211; 黄 → 黄色いぞう（くさむら）<strong>流れ：</strong><br />「なにかな？」→「〇〇の どうぶつだー！」→「いっしょにいこう！」</li>
<li><strong>行進（8P）：</strong><br />○○（娘の名前）ちゃん＋3匹の動物が森の中をなかよく行進</li>
<li><strong>締め（9P）：</strong><br />上空からの集合写真風イラスト「パシャ！」</li>
<li><strong>裏表紙（10P）：</strong><br />おしまいのごあいさつ（「また あそぼうね！」など）</li>
</ul>
<p><strong>色の使い方（配色設計）：</strong></p>
<ul>
<li><strong>基本原色（赤・青・黄）</strong>を中心に使用<br />→ 赤ちゃんの視覚に訴えやすく、色の学習にもつながる。</li>
<li>背景・その他は低彩度でシンプルに<br />→ 主役（○○（娘の名前）ちゃん＋動物）の色が際立つように。</li>
<li>色のコントラスト重視<br />→ 絵本を読む距離（30〜50cm）でも識別しやすく。</li>
</ul>
<p><strong>デザインコンセプト：</strong></p>
<ul>
<li><strong>「まるい・シンプル・やさしい」</strong><br />&#8211; 丸みを帯びたシルエット<br />&#8211; 複雑な線や細部の描写を省略<br />&#8211; 安心感と親しみやすさを重視</li>
<li><strong>「発見とよろこびの連続」</strong><br />&#8211; 隠れている→見つかる→仲間になる のパターン<br />&#8211; 赤ちゃんの「見つける快感」をくすぐる構成</li>
<li><strong>「ことばと絵がリンク」</strong><br />&#8211; 「あかい きつねさん」など、色・動物・名前の3語をセットで提示し、言葉の成長をサポート</li>
</ul>
<p>次のステップとして、1ページ目（導入）〜3ページ目（赤い動物発見）までのレイアウト構成案＋イラスト制作を進めることができます。ご希望あれば、順に制作していきましょうか？</p>
</details>
<p>GPTは、丸いデザイン、原色重視の配色、いないいないばーの原理（＝発見とよろこびの連続）、動物と色のリンクなど、絵本作りで自分が大事にしていたポイントをすべて理解してくれていました。<br data-start="156" data-end="159" />ここから先は、いよいよ本格的にイラスト制作を進めていく流れになります。</p>
<h2><span id="toc6">第1回まとめ：ChatGPTにここまでお願いしたこと</span></h2>
<p>第1回では、絵本づくりの準備段階として、ChatGPTに以下のことをお願いしました。</p>
<ul>
<li>絵本制作の相談（テーマ・ページ数・スタイル）</li>
<li>「売れっ子絵本作家」ロールでストーリー構成を整理</li>
<li>娘の写真を元にした主人公キャラクターの作成</li>
<li>構成・色使い・表現コンセプトの再整理と理解チェック</li>
</ul>
<p>この段階では、ChatGPTは「構成ディレクター兼絵本作家」的な役割で動いてくれてます。<br />次回は、いよいよ画像生成から印刷・製本まで！</p>


<p>第２回はこちらの記事</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/%e7%ac%ac2%e5%9b%9e%ef%bc%9achatgpt%e3%81%a7%e5%ad%90%e4%be%9b%e7%94%a8%e3%81%ae%e7%b5%b5%e6%9c%ac%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%ef%bc%9a%e7%94%bb%e5%83%8f%e7%94%9f%e6%88%90/" title="第2回：ChatGPTで子供用の絵本を作ってみた：画像生成編" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/04/ce8d9f7e08c6b0cbf3caccdf71837d24-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/04/ce8d9f7e08c6b0cbf3caccdf71837d24-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/04/ce8d9f7e08c6b0cbf3caccdf71837d24-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/04/ce8d9f7e08c6b0cbf3caccdf71837d24-320x180.webp 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">第2回：ChatGPTで子供用の絵本を作ってみた：画像生成編</div><div class="blogcard-snippet internal-blogcard-snippet">※この記事は前回の続きです。前編ではストーリーとキャラ設定を紹介しています。イラストの製作を依頼してみた基本設定やストーリーを元に、イラスト製作の依頼をしてみます。早速問題発生。1ページから3ページまでのイラスト製作何も考えずに「1ページか...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.04.13</div></div></div></div></a>
</div></figure>



<p>絵本作成用の記事はこちらから</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-po-it wp-block-embed-po-it"><div class="wp-block-embed__wrapper">

<a target="_blank" href="https://shoelab.jp/ai%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/%e7%ac%ac3%e5%9b%9e%e3%83%bb%e7%b7%8f%e4%bb%95%e4%b8%8a%e3%81%92%ef%bc%81deep-research%e7%99%ba%e3%81%ae%e7%b5%b5%e6%9c%ac%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e3%81%a7/" title="第3回・総仕上げ！Deep Research発の“絵本プロンプト”で思考を省エネ化する" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-300x169.webp 300w, https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-1024x576.webp 1024w, https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-768x432.webp 768w, https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a-320x180.webp 320w, https://shoelab.jp/wp-content/uploads/2025/04/7962adc164174549bc207ab63743fb6a.webp 1280w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">第3回・総仕上げ！Deep Research発の“絵本プロンプト”で思考を省エネ化する</div><div class="blogcard-snippet internal-blogcard-snippet">ChatGPTのDeep Researchを活用した「0〜2歳児向け絵本」制作テンプレート術を公開。第3回完結編では、毎回の指示作成を省エネ化し、思考リソースを最大化するプロンプト活用法を解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://shoelab.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">shoelab.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.04.20</div></div></div></div></a>
</div></figure>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
