<?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>GAS | POがITでラクする仕事術</title>
	<atom:link href="https://shoelab.jp/category/gas/feed/" rel="self" type="application/rss+xml" />
	<link>https://shoelab.jp</link>
	<description>ノンプログラマーでも簡単！GASと無料ツールで業務効率化を実現</description>
	<lastBuildDate>Sat, 21 Jun 2025 03:00:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://shoelab.jp/wp-content/uploads/2024/02/cropped-e14debba4b651ab77c82b66fca4377bf-32x32.png</url>
	<title>GAS | POがITでラクする仕事術</title>
	<link>https://shoelab.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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"/>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">HTML フォームを作ろう</a><ol><li><a href="#toc2" tabindex="0">ここだけは押さえよう — フォームの核心ポイント</a></li></ol></li><li><a href="#toc3" tabindex="0">doGet でフォームを表示する</a><ol><li><a href="#toc4" tabindex="0">template.deployURL の役割</a></li></ol></li><li><a href="#toc5" tabindex="0">スクリプトをウェブアプリとしてデプロイする</a></li><li><a href="#toc6" tabindex="0">doPost でスプレッドシートに書き込む</a><ol><li><a href="#toc7" tabindex="0">① 受信パラメータを取得</a></li><li><a href="#toc8" tabindex="0">② シートに追記</a></li><li><a href="#toc9" tabindex="0">③ 応答を返す</a></li></ol></li><li><a href="#toc10" tabindex="0">doGet と doPost の違いを理解しよう</a></li><li><a href="#toc11" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<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>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">CSS と JavaScript を“別ファイル化”する方法</a><ol><li><a href="#toc2" tabindex="0">① style.html と script.html をちゃちゃっと作成</a><ol><li><a href="#toc3" tabindex="0">style.html</a></li><li><a href="#toc4" tabindex="0">script.html</a></li></ol></li><li><a href="#toc5" tabindex="0">② コピペOK！include(filename) 関数を用意</a><ol><li><a href="#toc6" tabindex="0">コード.gs全文</a></li></ol></li><li><a href="#toc7" tabindex="0">③ include() で CSS／JS をページに注入</a></li><li><a href="#toc8" tabindex="0">table.html コード全文</a></li></ol></li><li><a href="#toc9" tabindex="0">STEP2｜共通ヘッダー＆フッターを部品化して更新ラクラク</a><ol><li><a href="#toc10" tabindex="0">① header.html と footer.html を作成</a><ol><li><a href="#toc11" tabindex="0">header.html</a></li><li><a href="#toc12" tabindex="0">footer.html</a></li></ol></li><li><a href="#toc13" tabindex="0">② include() でヘッダー／フッターを読み込み</a></li></ol></li><li><a href="#toc14" tabindex="0">まとめ｜これでメンテナンスが爆速に！</a></li></ol>
    </div>
  </div>

<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"/>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">HtmlService.createTemplateFromFile（）の最小構成</a><ol><li><a href="#toc2" tabindex="0">index.html</a></li><li><a href="#toc3" tabindex="0">コード.gs</a></li><li><a href="#toc4" tabindex="0">手順①：テンプレート HTML を作成する</a></li><li><a href="#toc5" tabindex="0">手順②：doGet / doPost でテンプレートを読み込む</a></li></ol></li><li><a href="#toc6" tabindex="0">生出力タグで GAS 生成のテーブル HTML をそのまま描画する</a></li><li><a href="#toc7" tabindex="0">使用例</a><ol><li><a href="#toc8" tabindex="0">index.html</a></li><li><a href="#toc9" tabindex="0">コード.gs</a></li><li><a href="#toc10" tabindex="0">getItem() ― スプレッドシート → HTML テーブル変換</a></li></ol></li><li><a href="#toc11" tabindex="0">HtmlService.createHtmlOutput() と HtmlService.createTemplateFromFile() のちがいについて</a></li><li><a href="#toc12" tabindex="0">スタイル &amp; JavaScript の組み込み</a></li><li><a href="#toc13" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<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"/>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">1. HtmlService.createHtmlOutput() の最小構成</a><ol><li><a href="#toc2" tabindex="0">ここがポイント 🔍</a></li></ol></li><li><a href="#toc3" tabindex="0">2. doGet(e) と doPost(e) の違い</a></li><li><a href="#toc4" tabindex="0">3. スプレッドシートを読み込んで HTML に表示するサンプル</a><ol><li><a href="#toc5" tabindex="0">3-1. コード全文</a></li><li><a href="#toc6" tabindex="0">3-2. スプレッドシートをコードに取り込む４ステップ</a></li><li><a href="#toc7" tabindex="0">3-3. HTML テーブルを組み立てる３ステップ</a></li></ol></li><li><a href="#toc8" tabindex="0">4. 使用方法</a></li><li><a href="#toc9" tabindex="0">5. まとめ</a></li></ol>
    </div>
  </div>

<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>[GAS小技].createMenuを使用してGoogleスプレッドシートにカスタムメニューを追加する方法【初心者向けGAS解説】</title>
		<link>https://shoelab.jp/gas/gas%e5%b0%8f%e6%8a%80-createmenu%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%a6google%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%81%ab%e3%82%ab%e3%82%b9%e3%82%bf/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sun, 30 Mar 2025 13:00:00 +0000</pubDate>
				<category><![CDATA[GAS]]></category>
		<guid isPermaLink="false">https://shoelab.jp/?p=513</guid>

					<description><![CDATA[こんにちはイカPOです。スプレッドシートでは、カスタムメニューを自由に作成でき、あらかじめ定義したGoogle Apps Scriptの関数を、そのメニューから簡単に呼び出すことができます。 今回はスプレッドシートにカス [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちはイカPOです。スプレッドシートでは、カスタムメニューを自由に作成でき、あらかじめ定義したGoogle Apps Scriptの関数を、そのメニューから簡単に呼び出すことができます。</p>



<p>今回はスプレッドシートにカスタムメニューを追加する方法について、解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">GASでスプレッドシートにカスタムメニューを追加するコード全文</a></li><li><a href="#toc2" tabindex="0">スクリプトの解説：カスタムメニューの作成手順</a></li><li><a href="#toc3" tabindex="0">メニューをスプレッドシートに表示させる方法</a></li><li><a href="#toc4" tabindex="0">GASでサブメニューを作成する方法</a><ol><li><a href="#toc5" tabindex="0">サブメニューに複数項目を追加する例</a></li><li><a href="#toc6" tabindex="0">サブメニューをあらかじめ定義して管理を楽にする方法</a></li></ol></li><li><a href="#toc7" tabindex="0">メニューに区切り線を追加する方法（.addSeparator）</a></li><li><a href="#toc8" tabindex="0">実践編：カスタムメニューからモーダルフォームを呼び出す</a></li><li><a href="#toc9" tabindex="0">まとめ：スプレッドシートにカスタムメニューを追加する基本メソッド一覧</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">GASでスプレッドシートにカスタムメニューを追加するコード全文</span></h2>



<pre class="wp-block-code"><code>function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('カスタムメニュー')
    .addItem('追加メニュー','menuItem1')
    .addToUi();
}

function menuItem1() {
  SpreadsheetApp.getUi().alert('追加されたメニューをクリックしました');
}
</code></pre>



<h2 class="wp-block-heading"><span id="toc2">スクリプトの解説：カスタムメニューの作成手順</span></h2>



<pre class="wp-block-code"><code>const ui = SpreadsheetApp.getUi();
</code></pre>



<p>スプレッドシートのUIを呼び出します。</p>



<pre class="wp-block-code"><code>ui.createMenu('カスタムメニュー')
  .addItem('追加メニュー','menuItem1')
  .addToUi();
</code></pre>



<ul class="wp-block-list">
<li><code>createMenu('カスタムメニュー')</code> で追加するメニュー名を設定。</li>



<li><code>addItem(表示名, 関数名の文字列)</code> の形式で記述します。</li>



<li>このとき、メニューから呼ばれる関数はグローバル関数として定義する必要があります。 <code>addItem</code> 内で関数を定義して渡すことはできないので注意が必要です（あらかじめ定義しておく必要があります）。</li>
</ul>



<p>今回の例では、 <code>.addItem('追加メニュー','menuItem1')</code> により、<code>menuItem1</code> という関数を文字列として呼び出しています。</p>



<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/03/8877d182da49050f0dbe7bd98e0fc8a7.webp" alt="" class="wp-image-519" srcset="https://shoelab.jp/wp-content/uploads/2025/03/8877d182da49050f0dbe7bd98e0fc8a7.webp 800w, https://shoelab.jp/wp-content/uploads/2025/03/8877d182da49050f0dbe7bd98e0fc8a7-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/03/8877d182da49050f0dbe7bd98e0fc8a7-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<pre class="wp-block-code"><code>function menuItem1() {
  SpreadsheetApp.getUi().alert('追加されたメニューをクリックしました');
}
</code></pre>



<p>この関数ではスプレッドシートのUIにアクセスし、アラートを表示させる動作を記述しています。</p>



<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/03/6d6610ae3940ec552c723732ca556373.webp" alt="スプレッドシート上にアラートが表示される" class="wp-image-520" srcset="https://shoelab.jp/wp-content/uploads/2025/03/6d6610ae3940ec552c723732ca556373.webp 800w, https://shoelab.jp/wp-content/uploads/2025/03/6d6610ae3940ec552c723732ca556373-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/03/6d6610ae3940ec552c723732ca556373-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">実行するとアラートが表示される</figcaption></figure>



<p>最後に <code>.addToUi()</code> を付けることで、<strong>「このメニューをユーザーインターフェース（UI）に追加してね</strong>」という意味になります。</p>



<h2 class="wp-block-heading"><span id="toc3">メニューをスプレッドシートに表示させる方法</span></h2>



<p>エディタで <code>onOpen()</code> を実行すれば、スプレッドシートにメニューが表示されます。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="872" height="510" src="https://shoelab.jp/wp-content/uploads/2025/03/0eaed8559bc097c190adc799886886ad.webp" alt="コードを実行するとメニューが追加される" class="wp-image-517" srcset="https://shoelab.jp/wp-content/uploads/2025/03/0eaed8559bc097c190adc799886886ad.webp 872w, https://shoelab.jp/wp-content/uploads/2025/03/0eaed8559bc097c190adc799886886ad-300x175.webp 300w, https://shoelab.jp/wp-content/uploads/2025/03/0eaed8559bc097c190adc799886886ad-768x449.webp 768w" sizes="(max-width: 872px) 100vw, 872px" /><figcaption class="wp-element-caption">コードを実行するとメニューが追加される</figcaption></figure>



<h2 class="wp-block-heading"><span id="toc4">GASでサブメニューを作成する方法</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/03/f6ca872f7e470ead46a3980958394290.webp" alt="サブメニューを追加" class="wp-image-522" srcset="https://shoelab.jp/wp-content/uploads/2025/03/f6ca872f7e470ead46a3980958394290.webp 800w, https://shoelab.jp/wp-content/uploads/2025/03/f6ca872f7e470ead46a3980958394290-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/03/f6ca872f7e470ead46a3980958394290-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<pre class="wp-block-code"><code>function onSubOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('カスタムメニュー')
    .addItem('追加メニュー','menuItem1')
    .addSeparator()
    .addSubMenu(ui.createMenu('サブメニュー付き')
    .addItem('サブメニュー', 'menuItem2'))
    .addToUi();
}
</code></pre>



<ul class="wp-block-list">
<li><code>.addSubMenu(ui.createMenu('サブメニュー付き')</code> でサブメニューを追加できます。</li>



<li><code>.addItem('サブメニュー', 'menuItem2')</code> とすることで、サブメニューに項目を追加できます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc5">サブメニューに複数項目を追加する例</span></h3>



<pre class="wp-block-code"><code>.addSubMenu(ui.createMenu('サブメニュー付き')
  .addItem('サブメニュー', 'menuItem2')
  .addItem('サブメニュー', 'menuItem2')
  .addItem('サブメニュー', 'menuItem2'))
</code></pre>



<p><code>addSubMenu()</code> の引数内で <code>.addItem()</code> を複数記述することで、サブメニュー内に複数の項目を追加できます。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="706" height="307" src="https://shoelab.jp/wp-content/uploads/2025/03/6df0a85a11795049999237c575bc2a1f.webp" alt="サブメニューを複数表示した場合" class="wp-image-524" srcset="https://shoelab.jp/wp-content/uploads/2025/03/6df0a85a11795049999237c575bc2a1f.webp 706w, https://shoelab.jp/wp-content/uploads/2025/03/6df0a85a11795049999237c575bc2a1f-300x130.webp 300w" sizes="(max-width: 706px) 100vw, 706px" /></figure>



<h3 class="wp-block-heading"><span id="toc6">サブメニューをあらかじめ定義して管理を楽にする方法</span></h3>



<pre class="wp-block-code"><code>const ui = SpreadsheetApp.getUi();
const subMenu = ui.createMenu('サブメニュー付き')
  .addItem('サブメニュー', 'menuItem2')
  .addItem('サブメニュー', 'menuItem2')
  .addItem('サブメニュー', 'menuItem2');

ui.createMenu('カスタムメニュー')
  .addItem('追加メニュー','menuItem1')
  .addSubMenu(subMenu)
  .addToUi();
</code></pre>



<p>予めサブメニューの内容を定義することもできる。項目の追加など管理が楽になるためおススメ。</p>



<h2 class="wp-block-heading"><span id="toc7">メニューに区切り線を追加する方法（.addSeparator）</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/03/87ab8a3c088cc678465808b7a9fb9b23.webp" alt="" class="wp-image-525" srcset="https://shoelab.jp/wp-content/uploads/2025/03/87ab8a3c088cc678465808b7a9fb9b23.webp 800w, https://shoelab.jp/wp-content/uploads/2025/03/87ab8a3c088cc678465808b7a9fb9b23-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/03/87ab8a3c088cc678465808b7a9fb9b23-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><code>.addSeparator()</code> を使用すると、メニュー内に区切り線を入れることができます。</p>



<pre class="wp-block-code"><code>function onSubOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('カスタムメニュー')
    .addItem('追加メニュー','menuItem1')
    .addSeparator()
    .addItem('追加メニュー','menuItem1')
    .addSeparator()
    .addItem('追加メニュー','menuItem1')
    .addSeparator()
    .addSubMenu(ui.createMenu('サブメニュー付き')
      .addItem('サブメニュー', 'menuItem2')
      .addSeparator()
      .addItem('サブメニュー', 'menuItem2')
      .addSeparator()
      .addItem('サブメニュー', 'menuItem2'))
    .addToUi();
}
</code></pre>



<h2 class="wp-block-heading"><span id="toc8">実践編：カスタムメニューからモーダルフォームを呼び出す</span></h2>



<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%e5%b0%8f%e6%8a%80showmodaldialog%e3%81%a7%e3%82%b9%e3%83%97%e3%83%ac%e3%83%83%e3%83%89%e3%82%b7%e3%83%bc%e3%83%88%e5%86%85%e3%81%ab%e3%83%a2%e3%83%bc%e3%83%80%e3%83%ab%e5%85%a5%e5%8a%9b/" title="[GAS小技]showModalDialog()でスプレッドシート内にモーダル入力フォームを作ってみよう[初心者向け]" 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/c6d591f1f5fe69e7c993a6c67054f740-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/03/c6d591f1f5fe69e7c993a6c67054f740-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/03/c6d591f1f5fe69e7c993a6c67054f740-300x169.webp 300w, https://shoelab.jp/wp-content/uploads/2025/03/c6d591f1f5fe69e7c993a6c67054f740-1024x576.webp 1024w, https://shoelab.jp/wp-content/uploads/2025/03/c6d591f1f5fe69e7c993a6c67054f740-768x432.webp 768w, https://shoelab.jp/wp-content/uploads/2025/03/c6d591f1f5fe69e7c993a6c67054f740-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/03/c6d591f1f5fe69e7c993a6c67054f740-320x180.webp 320w, https://shoelab.jp/wp-content/uploads/2025/03/c6d591f1f5fe69e7c993a6c67054f740.webp 1280w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">[GAS小技]showModalDialog()でスプレッドシート内にモーダル入力フォームを作ってみよう[初心者向け]</div><div class="blogcard-snippet internal-blogcard-snippet">Googleスプレッドシートにモーダル入力フォームを表示する方法を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.23</div></div></div></div></a>
</div></figure>



<p>で作成したモーダルフォームを呼び出す機能をメニューに追加しましょう。</p>



<p>コード全文（コード.gsだけで収まるように改良しています）</p>



<pre class="wp-block-code"><code>function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('追加メニュー')
    .addItem('入力フォームを表示','showForm')
    .addToUi();
}

function showForm() {
  const htmlbody = `
        &lt;h3&gt;ユーザー情報&lt;/h3&gt;
        &lt;form id="myForm"&gt;
          名前: &lt;input type="text" name="name"&gt;&lt;br&gt;
          メール: &lt;input type="email" name="email"&gt;&lt;br&gt;&lt;br&gt;
          &lt;input type="button" value="送信" onclick="submitForm()"&gt;
        &lt;/form&gt;

        &lt;script&gt;
          function submitForm() {
            const form = document.getElementById('myForm');
            const data = {
              name: form.name.value,
              email: form.email.value
            };

            google.script.run
              .withSuccessHandler(function() {
                alert('送信完了！');
                google.script.host.close();
              })
              .withFailureHandler(function(error){
                alert('送信に失敗しました。エラー内容: ' + error.message);
              })
              .submitForm(data);
          }
        &lt;/script&gt;
  `;
  const html = HtmlService.createHtmlOutput(htmlbody)
    .setWidth(400)
    .setHeight(300);
  SpreadsheetApp.getUi().showModalDialog(html, '入力フォーム');
}

function submitForm(data) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.appendRow(&#91;data.name, data.email, new Date()]);
}
</code></pre>



<p><code>.addItem('入力フォームを表示','showForm')</code> でモーダルを生成する関数 <code>showForm</code> が登録されています。</p>



<p><code>onOpen()</code> を実行することで、スプレッドシートのメニューに「追加メニュー」の項目が追加されます。</p>



<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/03/6a664c3e17da613579dc80e6c9912fdb.webp" alt="スプレッドシートのメニューに「追加メニュー」の項目が追加されます。" class="wp-image-526" srcset="https://shoelab.jp/wp-content/uploads/2025/03/6a664c3e17da613579dc80e6c9912fdb.webp 800w, https://shoelab.jp/wp-content/uploads/2025/03/6a664c3e17da613579dc80e6c9912fdb-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/03/6a664c3e17da613579dc80e6c9912fdb-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<h2 class="wp-block-heading"><span id="toc9">まとめ：スプレッドシートにカスタムメニューを追加する基本メソッド一覧</span></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>メソッド</th><th>意味</th></tr></thead><tbody><tr><td>createMenu(&#8216;名前&#8217;)</td><td>新しいメニューを作る</td></tr><tr><td>addItem(&#8216;項目名&#8217;, &#8216;関数名&#8217;)</td><td>メニューに実行する項目を追加する</td></tr><tr><td>addSubMenu(サブメニュー)</td><td>メニュー内にサブメニューを追加する</td></tr><tr><td>addSeparator()</td><td>メニュー内に区切り線を追加する</td></tr><tr><td>addToUi()</td><td>そのメニューをスプレッドシートに表示する</td></tr></tbody></table></figure>



<p>上記のメソッドを使うことでスプレッドシートにメニューを追加することができます。</p>



<p>ちなみに、<code>SpreadsheetApp</code> を <code>DocumentApp</code>, <code>SlidesApp</code>, または <code>FormApp</code> に変更することで、Googleドキュメントやスライド、Googleフォームにも同様にメニューを追加することができます。それはまた別の機会に。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[GAS小技]showModalDialog()でスプレッドシート内にモーダル入力フォームを作ってみよう[初心者向け]</title>
		<link>https://shoelab.jp/gas/gas%e5%b0%8f%e6%8a%80showmodaldialog%e3%81%a7%e3%82%b9%e3%83%97%e3%83%ac%e3%83%83%e3%83%89%e3%82%b7%e3%83%bc%e3%83%88%e5%86%85%e3%81%ab%e3%83%a2%e3%83%bc%e3%83%80%e3%83%ab%e5%85%a5%e5%8a%9b/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sun, 23 Mar 2025 13:04:00 +0000</pubDate>
				<category><![CDATA[GAS]]></category>
		<guid isPermaLink="false">https://ikapoit.shoelab.jp/?p=117</guid>

					<description><![CDATA[こんにちは。イカPOです。 今回はGASを使ってスプレッドシート内にモーダルで表示されるHTMLベースの入力フォームを作る方法を紹介します。 目次 モーダルフォームとは？初心者向けにわかりやすく解説GASでモーダルフォー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。イカPOです。 今回はGASを使ってスプレッドシート内にモーダルで表示されるHTMLベースの入力フォームを作る方法を紹介します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">モーダルフォームとは？初心者向けにわかりやすく解説</a></li><li><a href="#toc2" tabindex="0">GASでモーダルフォームを作るためのコード全文</a><ol><li><a href="#toc3" tabindex="0">コード.gs</a></li><li><a href="#toc4" tabindex="0">form.html</a></li></ol></li><li><a href="#toc5" tabindex="0">コード解説：GASとHTMLで作るモーダルフォームのしくみ</a><ol><li><a href="#toc6" tabindex="0">モーダルを表示する関数（showForm）</a><ol><li><a href="#toc7" tabindex="0">モーダルの画面設定</a></li><li><a href="#toc8" tabindex="0">実際にモーダルを呼び出す処理</a></li></ol></li><li><a href="#toc9" tabindex="0">データを処理する関数（submitForm）</a></li><li><a href="#toc10" tabindex="0">フォームからデータを送信する処理（form.html側）</a></li></ol></li><li><a href="#toc11" tabindex="0">実際にモーダルフォームを動かしてみよう</a></li><li><a href="#toc12" tabindex="0">まとめ：GASでモーダル入力フォームを表示するポイント3つ</a></li><li><a href="#toc13" tabindex="0">この記事についてのご意見や間違いのご指摘は、ぜひX（旧Twitter）でお知らせください！</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">モーダルフォームとは？初心者向けにわかりやすく解説</span></h2>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="800" height="600" src="https://shoelab.jp/wp-content/uploads/2025/03/d05a858cefa61dd81060ca7a0197275d.webp" alt="モーダルで実装することでスプレッドシート内にポップアップで入力画面が表示される。" class="wp-image-119" style="width:800px;height:auto" srcset="https://shoelab.jp/wp-content/uploads/2025/03/d05a858cefa61dd81060ca7a0197275d.webp 800w, https://shoelab.jp/wp-content/uploads/2025/03/d05a858cefa61dd81060ca7a0197275d-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/03/d05a858cefa61dd81060ca7a0197275d-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">モーダルウィンドウで表示すれば、画面遷移なしでフォームに入力できる</figcaption></figure>



<p>ポップアップのように表示される入力画面です。 GASでは <code>SpreadsheetApp.getUi().showModalDialog()</code> を使って実装可能です。</p>



<p><strong>メリット：</strong> スプレッドシートの画面を保ったままデータ入力ができること。</p>



<h2 class="wp-block-heading"><span id="toc2">GASでモーダルフォームを作るためのコード全文</span></h2>



<p>コピペでとりあえず動かしたい方向け。 スプレッドシート → 拡張機能 → Apps Script を選択し、下記のコードを記述してください。</p>



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



<pre class="wp-block-code"><code>function showForm() {
  const html = HtmlService.createHtmlOutputFromFile('form')
    .setWidth(400)
    .setHeight(300);
  SpreadsheetApp.getUi().showModalDialog(html, '入力フォーム');
}

function submitForm(data) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.appendRow(&#091;data.name, data.email, new Date()]);
}
</code></pre>



<h3 class="wp-block-heading"><span id="toc4">form.html</span></h3>



<p>エディタ内の「ファイルを追加」ボタンを押して form.html を作成。form.htmlがモーダルで表示されるフォームの元になります。</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://shoelab.jp/wp-content/uploads/2025/03/6b071ec1ae7f006d63a717d97d9a9958.webp" alt="" class="wp-image-122"/></figure>



<p>form.html（全文）</p>



<pre class="wp-block-code"><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;base target="_top"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h3&gt;ユーザー情報&lt;/h3&gt;
    &lt;form id="myForm"&gt;
      名前: &lt;input type="text" name="name"&gt;&lt;br&gt;
      メール: &lt;input type="email" name="email"&gt;&lt;br&gt;&lt;br&gt;
      &lt;input type="button" value="送信" onclick="submitForm()"&gt;
    &lt;/form&gt;

    &lt;script&gt;
      function submitForm() {
        const form = document.getElementById('myForm');
        const data = {
          name: form.name.value,
          email: form.email.value
        };

        google.script.run
          .withSuccessHandler(function() {
            alert('送信完了！');
            google.script.host.close();
          })
          .withFailureHandler(function(error) {
            alert('送信に失敗しました。エラー内容: ' + error.message);
            // 必要に応じて、エラーの詳細をログに出力するなどの処理を追加できます
          })
          .submitForm(data);
      }
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>



<h2 class="wp-block-heading"><span id="toc5">コード解説：GASとHTMLで作るモーダルフォームのしくみ</span></h2>



<h3 class="wp-block-heading"><span id="toc6">モーダルを表示する関数（showForm）</span></h3>



<pre class="wp-block-code"><code>function showForm() {
  const html = HtmlService.createHtmlOutputFromFile('form')
    .setWidth(400)
    .setHeight(300);
  SpreadsheetApp.getUi().showModalDialog(html, '入力フォーム');
}
</code></pre>



<h4 class="wp-block-heading"><span id="toc7">モーダルの画面設定</span></h4>



<pre class="wp-block-code"><code>const html = HtmlService.createHtmlOutputFromFile('form')
  .setWidth(400) // 横幅
  .setHeight(300); // 縦幅
</code></pre>



<ul class="wp-block-list">
<li><code>.createHtmlOutputFromFile('form')</code>：HTMLファイル（form.html）を読み込んでいます。</li>



<li><code>.setWidth()</code> と <code>.setHeight()</code>：モーダルウィンドウのサイズを設定。</li>
</ul>



<h4 class="wp-block-heading"><span id="toc8">実際にモーダルを呼び出す処理</span></h4>



<pre class="wp-block-code"><code>SpreadsheetApp.getUi().showModalDialog(html, '入力フォーム');
</code></pre>



<ul class="wp-block-list">
<li><code>SpreadsheetApp.getUi()</code>：スプレッドシートのUIを取得。</li>



<li><code>.showModalDialog()</code>：指定したHTMLをモーダルとして表示。</li>



<li><code><strong>'入力フォーム'</strong></code>：を変更することでモーダルのタイトルは変更可能。</li>
</ul>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://shoelab.jp/wp-content/uploads/2025/03/56e174564b293d1bb036e6dbc696bd38.webp" alt="モーダルフォームのタイトルを変換した例" class="wp-image-123"/><figcaption class="wp-element-caption">モーダルフォームのタイトルを変換した例。showModalDialog(html, &#8216;変更したフォーム&#8217;)</figcaption></figure>



<h3 class="wp-block-heading"><span id="toc9">データを処理する関数（submitForm）</span></h3>



<pre class="wp-block-code"><code>function submitForm(data) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.appendRow(&#091;data.name, data.email, new Date()]);
}
</code></pre>



<ul class="wp-block-list">
<li>form.html側からこの関数を呼び出しています。</li>



<li>受け取ったデータをスプレッドシートの最終行に追記します。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc10">フォームからデータを送信する処理（form.html側）</span></h3>



<pre class="wp-block-code"><code>&lt;script&gt;
  function submitForm() {
    const form = document.getElementById('myForm');
    const data = {
      name: form.name.value,
      email: form.email.value
    };

    google.script.run
      .withSuccessHandler(function() {
        alert('送信完了！');
        google.script.host.close();
      })
      .withFailureHandler(function(error) {
        alert('送信に失敗しました。エラー内容: ' + error.message);
      })
      .submitForm(data);//コード.gs内のsubmitFormを呼び出す
  }
&lt;/script&gt;
</code></pre>



<ul class="wp-block-list">
<li><code>google.script.run</code> を使って、HTML側からGASの関数を実行しています。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc11">実際にモーダルフォームを動かしてみよう</span></h2>



<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" src="https://shoelab.jp/wp-content/uploads/2025/03/b9faffb2ff18aef1259ae971c502426c.webp" alt="showForm()を選択してクリック" class="wp-image-126" style="width:800px;height:auto"/><figcaption class="wp-element-caption">showFrom()を実行するとモーダル画面がスプレッドシート内に表示される。</figcaption></figure>



<p>コード.gsとform.htmlの作成が終わったら、関数 <code>showForm()</code> を実行してみましょう。</p>



<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/03/3a8d7ad734b2a5323d3d76deb3adf441.webp" alt="表示されたフォームに情報を入力して、送信ボタンを押す" class="wp-image-127" srcset="https://shoelab.jp/wp-content/uploads/2025/03/3a8d7ad734b2a5323d3d76deb3adf441.webp 800w, https://shoelab.jp/wp-content/uploads/2025/03/3a8d7ad734b2a5323d3d76deb3adf441-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/03/3a8d7ad734b2a5323d3d76deb3adf441-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">モーダルウィンドウに表示されたフォームに情報を入力して、送信ボタンを押す</figcaption></figure>



<p>スプレッドシート上にモーダルウィンドウが表示されます。あとは、フォームに入力して「送信」ボタンを押すだけ！ スプレッドシートにデータが追加されていれば成功です。</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" src="https://shoelab.jp/wp-content/uploads/2025/03/a1c2871d7bb542a25964dfcfed16cc7c-1024x358.webp" alt="モーダルフォームの成功時の画面" class="wp-image-128"/><figcaption class="wp-element-caption">成功時の画面。データがスプレッドシートに書き込まれます。</figcaption></figure>



<p></p>



<h2 class="wp-block-heading"><span id="toc12">まとめ：GASでモーダル入力フォームを表示するポイント3つ</span></h2>



<pre class="wp-block-code"><code>SpreadsheetApp.getUi().showModalDialog(html, 'モーダルウィンドウのタイトル');
</code></pre>



<ul class="wp-block-list">
<li>モーダルを表示する関数</li>
</ul>



<pre class="wp-block-code"><code>const html = HtmlService.createHtmlOutputFromFile('form')
  .setWidth(400)
  .setHeight(300);
</code></pre>



<ul class="wp-block-list">
<li>モーダルサイズの設定</li>
</ul>



<pre class="wp-block-code"><code>google.script.run
</code></pre>



<ul class="wp-block-list">
<li>HTML側からGASの関数を実行する仕組み</li>
</ul>



<p>この3つを押さえれば、モーダル画面からスプレッドシートを操作することが可能になります。</p>



<p>ただし、毎回スクリプトエディタから実行ボタンを押して関数を実行するのは、手順が増えて面倒です。</p>



<p>この問題を解消するために、</p>



<p>次回は「<a target="_blank" href="https://shoelab.jp/gas/gas%e5%b0%8f%e6%8a%80-createmenu%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%a6google%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%81%ab%e3%82%ab%e3%82%b9%e3%82%bf" data-type="link" data-id="https://shoelab.jp/gas/gas%e5%b0%8f%e6%8a%80-createmenu%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%a6google%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%81%ab%e3%82%ab%e3%82%b9%e3%82%bf">スプレッドシート内にカスタムメニューを作成して、モーダルフォームをメニューから表示する方法</a>」を紹介します！</p>





<a target="_blank" href="https://shoelab.jp/gas/gas%e5%b0%8f%e6%8a%80-createmenu%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%a6google%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%81%ab%e3%82%ab%e3%82%b9%e3%82%bf" title="[GAS小技].createMenuを使用してGoogleスプレッドシートにカスタムメニューを追加する方法【初心者向けGAS解説】" 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/9b3511941966162c8fcaa8d4406a8ab6-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://shoelab.jp/wp-content/uploads/2025/03/9b3511941966162c8fcaa8d4406a8ab6-160x90.webp 160w, https://shoelab.jp/wp-content/uploads/2025/03/9b3511941966162c8fcaa8d4406a8ab6-300x169.webp 300w, https://shoelab.jp/wp-content/uploads/2025/03/9b3511941966162c8fcaa8d4406a8ab6-1024x576.webp 1024w, https://shoelab.jp/wp-content/uploads/2025/03/9b3511941966162c8fcaa8d4406a8ab6-768x432.webp 768w, https://shoelab.jp/wp-content/uploads/2025/03/9b3511941966162c8fcaa8d4406a8ab6-120x68.webp 120w, https://shoelab.jp/wp-content/uploads/2025/03/9b3511941966162c8fcaa8d4406a8ab6-320x180.webp 320w, https://shoelab.jp/wp-content/uploads/2025/03/9b3511941966162c8fcaa8d4406a8ab6.webp 1280w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">[GAS小技].createMenuを使用してGoogleスプレッドシートにカスタムメニューを追加する方法【初心者向けGAS解説】</div><div class="blogcard-snippet internal-blogcard-snippet">初心者向けにGoogleスプレッドシートでカスタムメニューを追加し、GASの定義済みスクリプトを呼び出す方法をわかりやすく解説。UI操作を効率化して業務をスムーズに進めよう！</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.30</div></div></div></div></a>



<div class="information-box">
<h2><span id="toc13">この記事についてのご意見や間違いのご指摘は、ぜひX（旧Twitter）でお知らせください！</span></h2>
<p>皆さまのフィードバックをお待ちしています。以下のアカウントまでお気軽にメッセージをお寄せください。</p>
<div class="primary-box"><a rel="nofollow noopener" target="_blank" href="https://x.com/ikaikapo">▶︎ <strong>[イカPO]（@ikaikapo）</strong></a><a rel="nofollow noopener" target="_blank" href="https://x.com/ikaikapo"><img loading="lazy" decoding="async" class="alignnone wp-image-183 size-thumbnail" src="https://shoelab.jp/wp-content/uploads/2024/08/e14debba4b651ab77c82b66fca4377bf-150x150.png" alt="" width="150" height="150" /></a></div>
<p>この記事には筆者の個人的な解釈も一部含まれています。一つの参考としてお読みいただきつつ、最終的にはご自身や担当の方としっかり相談の上で判断いただけますと幸いです。</p>
<p>皆様の声で情報をアップデートしていきます。よろしくお願いします。</p>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[GASの小技]GASで文字を検索！createTextFinder()の基本とfindNext()・findAll()の使い分け【初心者向け】</title>
		<link>https://shoelab.jp/gas/gas%e3%81%ae%e5%b0%8f%e6%8a%80gas%e3%81%a7%e6%96%87%e5%ad%97%e3%82%92%e6%a4%9c%e7%b4%a2%ef%bc%81createtextfinder%e3%81%ae%e5%9f%ba%e6%9c%ac%e3%81%a8findnext%e3%83%bbfindall%e3%81%ae%e4%bd%bf/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sun, 16 Mar 2025 13:00:00 +0000</pubDate>
				<category><![CDATA[GAS]]></category>
		<guid isPermaLink="false">https://ikapoit.shoelab.jp/?p=103</guid>

					<description><![CDATA[こんにちは！イカPOです。 スプレッドシート内で、特定の文字列が入力されているセルを探すときは、createTextFinder() と findNext() を使うと簡単に検索できます。今回は createTextFi [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは！イカPOです。</p>



<p>スプレッドシート内で、特定の文字列が入力されているセルを探すときは、<strong>createTextFinder()</strong> と <strong>findNext()</strong> を使うと簡単に検索できます。<br>今回は createTextFinder() と findNext() の使い方について解説します。</p>



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




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">createTextFinder()と.findNext()</a></li><li><a href="#toc2" tabindex="0">rangeオブジェクトとは？</a><ol><ol><li><a href="#toc3" tabindex="0">rangeオブジェクトで取得できる情報</a></li></ol></li></ol></li><li><a href="#toc4" tabindex="0">サンプルコード（シャンプーの位置を特定してみよう）</a><ol><li><a href="#toc5" tabindex="0">サンプルデータ</a></li><li><a href="#toc6" tabindex="0">お決まりのスプレッドシートからデータを取得</a></li><li><a href="#toc7" tabindex="0">文字列の検索と一致したセルの位置情報を確認してみよう[findNext()]</a></li><li><a href="#toc8" tabindex="0">位置情報を確認しよう</a></li><li><a href="#toc9" tabindex="0">翻訳してみよう（A1表記を確認する）</a></li><li><a href="#toc10" tabindex="0">発見した文字列の位置情報を使って色々な情報を取得してみよう</a></li></ol></li><li><a href="#toc11" tabindex="0">文字列が複数ある場合はどうするの？[.findAll()]</a></li><li><a href="#toc12" tabindex="0">まとめ</a></li><li><a href="#toc13" tabindex="0">この記事についてのご意見や間違いのご指摘は、ぜひX（旧Twitter）でお知らせください！</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">createTextFinder()と.findNext()</span></h2>



<p><strong>createTextFinder()</strong> は、指定された文字列を検索するための機能です。<br>たとえば、dataRange.createTextFinder(&#8220;シャンプー&#8221;) と書くと、dataRange という範囲の中から「シャンプー」という文字列を探してくれます。</p>



<p>そこから <strong>.findNext()</strong> を呼び出すと、見つかったセルの位置情報（Range オブジェクト）が返ってきます。<br>この Range オブジェクトを使えば、どのセルに文字が入っているかを簡単に特定できます。</p>



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



<h2 class="wp-block-heading"><span id="toc2">rangeオブジェクトとは？</span></h2>



<p>rangeオブジェクトとは、<strong>スプレッドシート内の特定のセルや範囲の「位置情報」を持ったオブジェクト</strong>です。<br>これを使うことで、セルの場所を特定し、関連する情報を取得できます。</p>



<p>たとえば、「A1セル」というセルの位置情報を持つ rangeオブジェクトなら、そのセルが**どこにあるか（位置）**だけでなく、<strong>どんな値が入っているか、どのシートに属しているか</strong>などの情報も取得できます。</p>



<h4 class="wp-block-heading"><span id="toc3">rangeオブジェクトで取得できる情報</span></h4>



<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/03/cb2ea8c5ae66afe7246f4beb4880d33b.webp" alt="このセルがどこにあるかを表すのがrangeオブジェクト" class="wp-image-104" srcset="https://shoelab.jp/wp-content/uploads/2025/03/cb2ea8c5ae66afe7246f4beb4880d33b.webp 800w, https://shoelab.jp/wp-content/uploads/2025/03/cb2ea8c5ae66afe7246f4beb4880d33b-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/03/cb2ea8c5ae66afe7246f4beb4880d33b-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<ul class="wp-block-list">
<li><strong>getA1Notation()</strong>: A1形式（「B2」「C10」など）でセルの<strong>位置</strong>を取得</li>



<li><strong>getRow()</strong>: セルの<strong>行番号</strong>（1,2,3&#8230;）を取得</li>



<li><strong>getColumn()</strong>: セルの<strong>列番号</strong>（1,2,3&#8230;）を取得</li>



<li><strong>getValue()</strong>: セルに入っている**値（文字列や数値など）**を取得</li>



<li><strong>getSheet().getName()</strong>: そのセルがある<strong>シート名</strong>を取得</li>
</ul>



<p>このように、rangeオブジェクトがあれば、<br>✅ <strong>セルがどこにあるのか（位置情報）</strong><br>✅ <strong>セルの中にどんなデータが入っているのか</strong><br>✅ <strong>どのシートにあるのか</strong><br>を簡単に取得できます。</p>



<p><strong>rangeオブジェクトとは、スプレッドシートの「セルの住所」を持ったデータ</strong>と考えるとわかりやすいです。</p>



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



<h2 class="wp-block-heading"><span id="toc4">サンプルコード（シャンプーの位置を特定してみよう）</span></h2>



<p>今回の例では、用品一覧シートから「シャンプー」という文字列が入っているセルを探して、そのセルの位置を表示させてみます。</p>



<h3 class="wp-block-heading"><span id="toc5">サンプルデータ</span></h3>



<p>シート名：<strong>「用品一覧」</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>用品ID</td><td>用品名</td><td>カテゴリー</td></tr><tr><td>1001</td><td>シャンプー</td><td>風呂</td></tr><tr><td>1002</td><td>リンス</td><td>風呂</td></tr><tr><td>1003</td><td>ボディソープ</td><td>風呂</td></tr><tr><td>1004</td><td>トイレットペーパー</td><td>トイレ</td></tr><tr><td>1005</td><td>トイレ用洗剤</td><td>トイレ</td></tr><tr><td>1006</td><td>トイレ掃除シート</td><td>トイレ</td></tr><tr><td>1018</td><td>ベビーローション</td><td>子供</td></tr><tr><td>1019</td><td>おしり吹き</td><td>子供</td></tr><tr><td>1020</td><td>ワセリン</td><td>子供</td></tr><tr><td>1021</td><td>おむつ用ごみ袋</td><td>子供</td></tr><tr><td>1022</td><td>ゴミ袋</td><td>掃除</td></tr><tr><td>1023</td><td>シャンプー</td><td>風呂</td></tr></tbody></table></figure>



<p>上記のようにシャンプーが2つ入っているので、実行結果に注目してみましょう。</p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<pre class="wp-block-code"><code>function searchRowWithTextFinder(){
&nbsp;&nbsp;const sheet = SpreadsheetApp.getActiveSpreadsheet();
&nbsp;&nbsp;const targetsheet = sheet.getSheetByName("用品一覧");
&nbsp;&nbsp;const dataRange = targetsheet.getDataRange();
&nbsp;&nbsp;// 「シャンプー」という文字を探すFinderを作成
&nbsp;&nbsp;const finder = dataRange.createTextFinder("シャンプー");
&nbsp;&nbsp;// 1つ目にヒットしたセル（Rangeオブジェクト）を取得
&nbsp;&nbsp;const foundRange = finder.findNext();
&nbsp;&nbsp;if(foundRange){
&nbsp;&nbsp;&nbsp;&nbsp;// シャンプーが見つかったときに情報をログに出す
&nbsp;&nbsp;&nbsp;&nbsp;Logger.log(`見つかったセルの位置は${foundRange}`);
&nbsp;&nbsp;&nbsp;&nbsp;Logger.log(`見つかったセルの位置は${foundRange.getA1Notation()}`);
&nbsp;&nbsp;&nbsp;&nbsp;Logger.log(`見つかったセルの行番号は${foundRange.getRow()}`);
&nbsp;&nbsp;&nbsp;&nbsp;Logger.log(`見つかったセルの中身は${foundRange.getValue()}`);
&nbsp;&nbsp;&nbsp;&nbsp;Logger.log(`見つかったセルが属するシート: ${foundRange.getSheet().getName()}`);
&nbsp;&nbsp;}
&nbsp;&nbsp;else{
&nbsp;&nbsp;&nbsp;&nbsp;// 該当の文字が見つからなかった場合
&nbsp;&nbsp;&nbsp;&nbsp;Logger.log("指定の位置は見つかりませんでした。");
&nbsp;&nbsp;}

}</code></pre>
</div>



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



<h3 class="wp-block-heading"><span id="toc6">お決まりのスプレッドシートからデータを取得</span></h3>



<pre class="wp-block-code"><code>const sheet = SpreadsheetApp.getActiveSpreadsheet();

const targetsheet = sheet.getSheetByName("用品一覧");

const dataRange = targetsheet.getDataRange();</code></pre>



<ul class="wp-block-list">
<li><strong>SpreadsheetApp.getActiveSpreadsheet()</strong>: 現在アクティブなスプレッドシートを取得</li>



<li><strong>sheet.getSheetByName(&#8220;用品一覧&#8221;)</strong>: その中の「用品一覧」という名前のシートを取得</li>



<li><strong>.getDataRange()</strong>: そのシート内にあるデータ範囲すべてを取得</li>
</ul>



<p>このあとの検索処理は dataRange に対して行います。</p>



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



<h3 class="wp-block-heading"><span id="toc7">文字列の検索と一致したセルの位置情報を確認してみよう[findNext()]</span></h3>



<pre class="wp-block-code"><code>const finder = dataRange.createTextFinder("シャンプー");

const foundRange = finder.findNext();</code></pre>



<ul class="wp-block-list">
<li><strong>createTextFinder(&#8220;シャンプー&#8221;)</strong>: 「シャンプー」という文字列を検索条件に指定</li>



<li><strong>findNext()</strong>: 最初にヒットしたセルを返してくれる（Range オブジェクト）</li>
</ul>



<p>ここで返ってくる <strong>foundRange</strong> は、「シャンプー」が入っているセルの rangeオブジェクトです。</p>



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



<h3 class="wp-block-heading"><span id="toc8">位置情報を確認しよう</span></h3>



<pre class="wp-block-code"><code>if(foundRange){
&nbsp;&nbsp;// 見つかった時の処理
} else {
&nbsp;&nbsp;// 見つからなかった時の処理
}</code></pre>



<ul class="wp-block-list">
<li>foundRange が存在すれば、検索文字列が見つかったということになるので、そのときの処理を実行</li>



<li>見つからなければ else 側の「見つかりませんでした」とログを出すだけ</li>
</ul>



<p>Logger.log(`見つかったセルの位置は${foundRange}`);</p>



<p>この行では、Range オブジェクトがそのまま表示されます。多くの場合、ログには Range とだけ出るので、どのセルかはわかりにくいです。</p>



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



<h3 class="wp-block-heading"><span id="toc9">翻訳してみよう（A1表記を確認する）</span></h3>



<pre class="wp-block-code"><code>Logger.log(`見つかったセルの位置は${foundRange.getA1Notation()}`);</code></pre>



<ul class="wp-block-list">
<li><strong>getA1Notation()</strong> は、B2 や C3 などの見慣れたセル番地（A1形式）を返してくれます。</li>



<li>「B2」のように表示されれば、どのセルでヒットしたかわかりやすいです。</li>
</ul>



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



<h3 class="wp-block-heading"><span id="toc10">発見した文字列の位置情報を使って色々な情報を取得してみよう</span></h3>



<pre class="wp-block-code"><code>Logger.log(`見つかったセルの行番号は${foundRange.getRow()}`);
Logger.log(`見つかったセルの中身は${foundRange.getValue()}`);
Logger.log(`見つかったセルが属するシート: ${foundRange.getSheet().getName()}`);</code></pre>



<ul class="wp-block-list">
<li><strong>getRow()</strong>: 見つかったセルの行番号を返す</li>



<li><strong>getValue()</strong>: そのセルに入っている値（文字や数値）を返す</li>



<li><strong>getSheet().getName()</strong>: セルが属するシート名を返す</li>
</ul>



<p>これらの情報を組み合わせると、検索でヒットしたセルの場所や値を自由に活用できます。</p>



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



<h2 class="wp-block-heading"><span id="toc11">文字列が複数ある場合はどうするの？[.findAll()]</span></h2>



<p>もし、同じ文字列が複数のセルに含まれる場合は、<strong>.findAll()</strong> を使うと便利です。<br>.findAll() は、該当する文字列を含むセルの Range オブジェクトを<strong>配列</strong>として返してくれます。</p>



<pre class="wp-block-code"><code>const finder = dataRange.createTextFinder("シャンプー");
const foundRanges = finder.findAll();
if(foundRanges){
&nbsp;&nbsp;for(let foundRange of foundRanges){
&nbsp;&nbsp;&nbsp;&nbsp;Logger.log(`見つかったセルの位置は${foundRange.getA1Notation()}`);
&nbsp;&nbsp;&nbsp;&nbsp;Logger.log(`見つかったセルの行番号は${foundRange.getRow()}`);
&nbsp;&nbsp;&nbsp;&nbsp;Logger.log(`見つかったセルの列番号は${foundRange.getColumn()}`);
&nbsp;&nbsp;&nbsp;&nbsp;Logger.log(`見つかったセルの中身は${foundRange.getValue()}`);
&nbsp;&nbsp;&nbsp;&nbsp;Logger.log(`見つかったセルが属するシート: ${foundRange.getSheet().getName()}`);
&nbsp;&nbsp;}

} else {
&nbsp;&nbsp;Logger.log("指定の位置は見つかりませんでした。");
}</code></pre>



<ul class="wp-block-list">
<li>foundRanges は配列なので、for 文を使って一つずつ処理すればOK</li>



<li>.findNext() だと最初にヒットしたセル1つしか取得しませんが、.findAll() ならすべてのセルを取得できます</li>
</ul>



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



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



<ol class="wp-block-list">
<li><strong>createTextFinder()</strong> で検索文字列を指定し、.findNext() で「最初に見つかったセル（Range オブジェクト）」を取得できる。</li>



<li>もし検索した文字列が複数のセルにある場合は、<strong>.findAll()</strong> を使うことで<strong>すべての該当セル</strong>を取得できる。</li>



<li><strong>rangeオブジェクト</strong> はセルの「場所・値・シート名」など、さまざまな情報を持っている。getA1Notation() や getRow()、getValue() などを使って、必要な情報を取り出せる。</li>
</ol>



<p>今回のサンプルでは「シャンプー」を探しましたが、実際にはさまざまな文字列を検索して活用できます。重複しない「ID」や「コード番号」のような唯一の値を検索するときは <strong>.findNext()</strong> 、複数ヒットする可能性がある場合は <strong>.findAll()</strong> を使ってみてください。</p>


<div class="information-box">
<h2><span id="toc13">この記事についてのご意見や間違いのご指摘は、ぜひX（旧Twitter）でお知らせください！</span></h2>
<p>皆さまのフィードバックをお待ちしています。以下のアカウントまでお気軽にメッセージをお寄せください。</p>
<div class="primary-box"><a rel="nofollow noopener" target="_blank" href="https://x.com/ikaikapo">▶︎ <strong>[イカPO]（@ikaikapo）</strong></a><a rel="nofollow noopener" target="_blank" href="https://x.com/ikaikapo"><img loading="lazy" decoding="async" class="alignnone wp-image-183 size-thumbnail" src="https://shoelab.jp/wp-content/uploads/2024/08/e14debba4b651ab77c82b66fca4377bf-150x150.png" alt="" width="150" height="150" /></a></div>
<p>この記事には筆者の個人的な解釈も一部含まれています。一つの参考としてお読みいただきつつ、最終的にはご自身や担当の方としっかり相談の上で判断いただけますと幸いです。</p>
<p>皆様の声で情報をアップデートしていきます。よろしくお願いします。</p>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[GASの小技] 1行目をヘッダーに！取得した配列データを加工してスプレッドシートに書き込む方法</title>
		<link>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/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sun, 09 Mar 2025 13:00:00 +0000</pubDate>
				<category><![CDATA[GAS]]></category>
		<guid isPermaLink="false">https://ikapoit.shoelab.jp/?p=98</guid>

					<description><![CDATA[こんにちは、イカPOです。 スプレッドシートの1行目をヘッダーとして使っている方は多いと思います。データを扱う際も、ヘッダーを基準にするとコードが読みやすく、後から見直す時にも非常に便利です。 今回は、GASでヘッダーを [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、イカPOです。</p>



<p>スプレッドシートの1行目をヘッダーとして使っている方は多いと思います。データを扱う際も、ヘッダーを基準にするとコードが読みやすく、後から見直す時にも非常に便利です。</p>



<p>今回は、GASでヘッダーを取得してマッピングを作成し、データを効率よく処理してスプレッドシートに書き込む方法についてご紹介します。</p>



<h3 class="wp-block-heading"><span id="toc1">「マッピング」とは？ </span></h3>



<p>「マッピング」とは、スプレッドシートのヘッダー名とその位置（インデックス）を紐づける作業のことです。例えば、「在庫数」という列が何列目にあるかを数字ではなく名前で指定できるようになるため、コードが非常に分かりやすくなります。</p>



<div class="wp-block-group is-style-information-box is-layout-constrained wp-block-group-is-layout-constrained">
<h4 class="wp-block-heading"><span id="toc2">マッピングの一例</span></h4>



<p><strong>{ &#8220;商品ID&#8221;: 0, &#8220;商品名&#8221;: 1, &#8220;在庫数&#8221;: 2 }</strong></p>



<p>このオブジェクトでは、たとえば「商品ID」というキーを指定すると数字の0が返されます。<br>返ってきた数値（0）をインデックスとして利用することで、配列の0番目の要素へアクセスできる仕組みになっています。</p>
</div>



<p>この仕組みを利用すると、スプレッドシートからデータを取得し、それを加工・書き込みする一連の処理をスムーズに実行できます。</p>



<h1 class="wp-block-heading">スプレッドシートを操作する流れとサンプルコード</h1>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><ol><li><a href="#toc1" tabindex="0">「マッピング」とは？ </a><ol><li><a href="#toc2" tabindex="0">マッピングの一例</a></li></ol></li></ol></li><li><a href="#toc3" tabindex="0">コード全文</a><ol><li><a href="#toc4" tabindex="0">サンプルデータ</a></li></ol></li><li><a href="#toc5" tabindex="0">1 スプレッドシートからデータを取得</a><ol><ol><ol><li><a href="#toc6" tabindex="0">取得データ（イメージ）</a></li></ol></li></ol></li></ol></li><li><a href="#toc7" tabindex="0">2 ヘッダーを取得してマッピングする</a></li><li><a href="#toc8" tabindex="0">３ 配列データの加工 </a><ol><li><a href="#toc9" tabindex="0">ヘッダーのマッピングについて</a></li></ol></li><li><a href="#toc10" tabindex="0">４ 書き込み用のマッピング（1始まり） </a></li><li><a href="#toc11" tabindex="0">5 スプレッドシートにデータを書き込む（在庫数の更新）</a><ol><ol><ol><li><a href="#toc12" tabindex="0">別の書き込み方法</a></li></ol></li></ol></li></ol></li><li><a href="#toc13" tabindex="0">まとめ</a></li><li><a href="#toc14" tabindex="0">この記事についてのご意見や間違いのご指摘は、ぜひX（旧Twitter）でお知らせください！</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc3">コード全文</span></h2>



<pre class="wp-block-code"><code>function processSheetDataFlow(){
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('データ');
  const data = sheet.getDataRange().getValues(); //2次元配列で取得
  const headers = data.shift(); // ヘッダー行を取り出す
  

  const headerMap = {};
  headers.forEach(function(header, index) {
  headerMap&#091;header] = index; // 0始まりのインデックスを設定
  });
  

  for (let i =0; i &lt; data.length; i++ ){
     Logger.log(`計算前${data&#091;i]}`);
     const currentStock = parseInt(data&#091;i]&#091;headerMap&#091;"在庫数"]],10) || 0;
     data&#091;i]&#091;headerMap&#091;"在庫数"]] = currentStock *2;
  }

  const updateHeaderMap = {};
  headers.forEach(function(header,index){
    updateHeaderMap&#091;header] = index + 1;
  });

  // sheet.getRange(2,1,data.length,data&#091;0].length).setValues(data);

  for (let i = 0; i &lt; data.length; i++) {
  const targetRow = i + 2;  // シートは1始まりなので、2行目から書き込む
  sheet.getRange(targetRow, updateHeaderMap&#091;"在庫数"]).setValue(data&#091;i]&#091;headerMap&#091;"在庫数"]]);
}
  
}

</code></pre>



<h3 class="wp-block-heading"><span id="toc4">サンプルデータ</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>商品ID</td><td>商品名</td><td>在庫数</td></tr><tr><td>1001</td><td>シャンプー</td><td>4</td></tr><tr><td>1002</td><td>リンスー</td><td>12</td></tr><tr><td>1003</td><td>ボディーソープ</td><td>20</td></tr><tr><td>1004</td><td>コンディショナー</td><td>16</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc5">1 スプレッドシートからデータを取得</span></h2>



<pre class="wp-block-code"><code>const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('データ');
const data = sheet.getDataRange().getValues(); // 2次元配列で取得
const headers = data.shift(); // ヘッダーを取り出す
</code></pre>



<h5 class="wp-block-heading"><span id="toc6">取得データ（イメージ）</span></h5>



<pre class="wp-block-code"><code>&#091;
  &#091;"商品ID", "商品名", "在庫数"],  // ヘッダー
  &#091;1001, "シャンプー", 4],
  &#091;1002, "リンスー", 12],
  &#091;1003, "ボディーソープ", 20],
  &#091;1004, "コンディショナー", 16]
]
</code></pre>



<h2 class="wp-block-heading"><span id="toc7">2 ヘッダーを取得してマッピングする</span></h2>



<p> ヘッダーを取得したあと、forEachを使ってマッピングを作成します。forEachの構文には配列の要素（header）と、その順番（index）が含まれているので、それを利用してマッピングを行います。</p>



<pre class="wp-block-code"><code>const headerMap = {};
headers.forEach((header, index) =&gt; {
  headerMap&#091;header] = index; // 配列の順番（0始まり）を取得
});
</code></pre>



<p>このマッピングにより、列番号ではなくヘッダー名でデータを扱えるようになります。</p>



<h2 class="wp-block-heading"><span id="toc8">３ 配列データの加工 </span></h2>



<p>配列からデータを取り出し、在庫数を2倍にする処理を行います。</p>



<pre class="wp-block-code"><code>for (let i = 0; i &lt; data.length; i++) {
  const currentStock = parseInt(data&#091;i]&#091;headerMap&#091;"在庫数"]], 10) || 0;
  data&#091;i]&#091;headerMap&#091;"在庫数"]] = currentStock * 2;
}
</code></pre>



<p> ここでポイントになるのが、「ヘッダーのマッピング」です。</p>



<h3 class="wp-block-heading"><span id="toc9">ヘッダーのマッピングについて</span></h3>



<p>マッピングとは、ヘッダーの項目名と、その項目が配列の何番目（インデックス）に位置しているかを紐付ける作業のことを言います。 </p>



<p>スプレッドシートから取得したデータは、以下のようになっています。</p>



<pre class="wp-block-code"><code>&#091;
<strong>  &#091;"商品ID", "商品名", "在庫数"], // ヘッダー</strong>
  &#091;1001, "シャンプー", 4], // データ1行目
  &#091;1002, "リンスー", 12], // データ2行目
]
</code></pre>



<p>ここからヘッダーを取り出して、マッピングを行います。</p>



<pre class="wp-block-code"><code><strong>const headers = data.shift(); // &#091;"商品ID", "商品名", "在庫数"]</strong>

const headerMap = {};
headers.forEach((header, index) =&gt; {
  headerMap&#091;header] = index;
});
</code></pre>



<p>ここで使ったforEachは、配列の各要素を順番に取り出すためのJavaScriptのメソッドで、自動的にその要素の順番（インデックス）を取得することができます。</p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group is-style-primary-box is-layout-constrained wp-block-group-is-layout-constrained">
<p>• &#8220;商品ID&#8221; は0番目（indexが0） </p>



<p>• &#8220;商品名&#8221; は1番目（indexが1）</p>



<p> • &#8220;在庫数&#8221; は2番目（indexが2）</p>
</div>
</div>



<p>これにより、以下のようなマッピングが出来上がります。</p>



<div class="wp-block-group is-style-information-box is-layout-constrained wp-block-group-is-layout-constrained">
<p><strong>{ &#8220;商品ID&#8221;: 0, &#8220;商品名&#8221;: 1, &#8220;在庫数&#8221;: 2 }</strong></p>
</div>



<p>このマッピングを使うことで、データの取得や書き込みを、配列の番号（インデックス）ではなく、ヘッダー名を使って行うことができます。</p>



<p> 例えば、</p>



<p><strong>data[i][headerMap[&#8220;在庫数&#8221;]]</strong></p>



<p>という記述は、</p>



<p><strong>data[i][2]</strong></p>



<p>と記述するのと同じ意味になります。 </p>



<p>つまり、「在庫数」と指定すると、マッピングによって<strong>「2」</strong>という数字が取得され、その結果、配列内の「在庫数」に該当するデータにアクセスできるという仕組みです。</p>



<p>この仕組みを踏まえ、改めて在庫数を2倍にする処理を見てみましょう。</p>



<pre class="wp-block-code"><code>for (let i = 0; i &lt; data.length; i++) {
  const currentStock = data&#091;i]<strong>&#091;headerMap&#091;"在庫数"]]</strong>;
  data&#091;i]<strong>&#091;headerMap&#091;"在庫数"]]</strong> = currentStock * 2;
}
</code></pre>



<p>こうすることで、配列内の「在庫数」に該当するデータが更新されます。</p>



<h2 class="wp-block-heading"><span id="toc10">４ 書き込み用のマッピング（1始まり） </span></h2>



<p>スプレッドシートへの書き込み時は、シートが1始まりのため、ヘッダーのインデックスに+1をしてマッピングします。</p>



<pre class="wp-block-code"><code>const updateHeaderMap = {};
headers.forEach((header, index) =&gt; {
  updateHeaderMap&#091;header] = <strong>index + 1;</strong>
});
</code></pre>



<p>スプレッドシートに書き戻すときは、作成した1始まりのマッピングを使って書き込みます。</p>



<h2 class="wp-block-heading"><span id="toc11">5 スプレッドシートにデータを書き込む（在庫数の更新）</span></h2>



<p>変更後のデータをシートに反映する方法です。<br>ここでのポイントは、行番号と列番号がシート上では1始まりであるため、配列（0始まり）とのズレを調整することです。</p>



<pre class="wp-block-code"><code>  for (let i = 0; i &lt; data.length; i++) {
  const targetRow = i + 2;  // シートは1始まりなので、2行目から書き込む
  sheet.getRange(targetRow, updateHeaderMap&#091;"在庫数"]).setValue(data&#091;i]&#091;headerMap&#091;"在庫数"]]);
}</code></pre>



<p><strong>行番号の調整：</strong><br><code>i + 2</code> の部分は、配列のインデックス <code>i</code>（0始まり）を、スプレッドシートの行番号（1始まり）に合わせるための工夫です。</p>



<ul class="wp-block-list">
<li><code>i = 0</code> → シート上は2行目</li>



<li><code>i = 1</code> → シート上は3行目<br>といった形で対応させています。</li>
</ul>



<p><strong>列番号の指定：</strong><br><code>updateHeaderMap["在庫数"]</code> で取得されるのは、書き込み用に「1始まり」に変換した列番号です。<br><code>headerMap["在庫数"]</code> は配列上で在庫数が何番目かを示す「0始まり」のインデックスです。</p>



<p>書き込むデータを持ってくる「列番号」は<strong> <code>headerMap</code></strong></p>



<p>書き込み先の「列番号」は<strong> <code>updateHeaderMap</code></strong></p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group is-style-info-box is-layout-constrained wp-block-group-is-layout-constrained">
<h5 class="wp-block-heading"><span id="toc12">別の書き込み方法</span></h5>



<p>以下のように一括書き込みも可能です。</p>



<pre class="wp-block-code"><code>sheet.getRange(2, 1, data.length, data&#091;0].length).setValues(data);
</code></pre>
</div>
</div>



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



<p>流れのイメージは以下の通りです。</p>



<ol class="wp-block-list">
<li><strong>データ取得（0始まり）</strong></li>



<li><strong>ヘッダーマッピング作成（0始まり）</strong></li>



<li><strong>配列上でデータ処理（0始まり）</strong></li>



<li><strong>書き込み用マッピング作成（1始まり）</strong></li>



<li><strong>シートへの書き込み（1始まり）</strong></li>
</ol>



<p>✅ 配列処理は0始まりのまま行う<br>✅ シートに書き込むときは1始まりで扱う</p>



<p>このパターンを覚えるだけで、GASのコードが劇的にわかりやすくなります。ぜひ試してみてください！</p>


<div class="information-box">
<h2><span id="toc14">この記事についてのご意見や間違いのご指摘は、ぜひX（旧Twitter）でお知らせください！</span></h2>
<p>皆さまのフィードバックをお待ちしています。以下のアカウントまでお気軽にメッセージをお寄せください。</p>
<div class="primary-box"><a rel="nofollow noopener" target="_blank" href="https://x.com/ikaikapo">▶︎ <strong>[イカPO]（@ikaikapo）</strong></a><a rel="nofollow noopener" target="_blank" href="https://x.com/ikaikapo"><img loading="lazy" decoding="async" class="alignnone wp-image-183 size-thumbnail" src="https://shoelab.jp/wp-content/uploads/2024/08/e14debba4b651ab77c82b66fca4377bf-150x150.png" alt="" width="150" height="150" /></a></div>
<p>この記事には筆者の個人的な解釈も一部含まれています。一つの参考としてお読みいただきつつ、最終的にはご自身や担当の方としっかり相談の上で判断いただけますと幸いです。</p>
<p>皆様の声で情報をアップデートしていきます。よろしくお願いします。</p>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【GASの小技】GASでスプレッドシートを自動整形！.trim().normalize(&#8216;NFKC&#8217;).replace().toLowerCase()の使い方</title>
		<link>https://shoelab.jp/gas/%e3%80%90gas%e3%81%ae%e5%b0%8f%e6%8a%80%e3%80%91gas%e3%81%a7%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%92%e8%87%aa%e5%8b%95%e6%95%b4%e5%bd%a2%ef%bc%81-trim-normal/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sun, 02 Mar 2025 11:19:02 +0000</pubDate>
				<category><![CDATA[GAS]]></category>
		<guid isPermaLink="false">https://ikapoit.shoelab.jp/?p=92</guid>

					<description><![CDATA[こんにちは！イカPOです。 スプレッドシートに存在する、半角と全角が混在したデータや余分な空白を自動で整形（除去）するGoogle Apps Script（GAS）を紹介します。 目次 コード全文📌 このコードが行うこと [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは！イカPOです。</p>



<p>スプレッドシートに存在する、<strong>半角と全角が混在したデータ</strong>や<strong>余分な空白</strong>を自動で整形（除去）するGoogle Apps Script（GAS）を紹介します。</p>



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




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">コード全文</a><ol><li><a href="#toc2" tabindex="0">📌 このコードが行うこと</a></li></ol></li><li><a href="#toc3" tabindex="0">🔍 コードの動作イメージ</a></li><li><a href="#toc4" tabindex="0">📝 どんな場面で使う？</a></li><li><a href="#toc5" tabindex="0">💡 コードの詳細解説</a><ol><li><a href="#toc6" tabindex="0">1️⃣ スプレッドシートのデータを取得</a></li><li><a href="#toc7" tabindex="0">2️⃣ データの整形（正規化）</a></li><li><a href="#toc8" tabindex="0">3️⃣ 整形後のデータをスプレッドシートに書き戻す</a></li></ol></li><li><a href="#toc9" tabindex="0">📝 GASでデータを整形する各処理の具体例【初心者向け】</a><ol><li><a href="#toc10" tabindex="0">.trim() を使って前後の空白を削除する方法</a></li><li><a href="#toc11" tabindex="0">.normalize('NFKC') を使って全角カタカナ・英数字を半角に統一する方法</a></li><li><a href="#toc12" tabindex="0">.replace(/\s+/g, "") を使ってすべての空白を削除する方法</a></li><li><a href="#toc13" tabindex="0">.toLowerCase() を使って英字を小文字に変換する方法</a></li></ol></li><li><a href="#toc14" tabindex="0">🚀 まとめ</a></li><li><a href="#toc15" tabindex="0">この記事についてのご意見や間違いのご指摘は、ぜひX（旧Twitter）でお知らせください！</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">コード全文</span></h2>



<pre class="wp-block-code"><code>function normalizeTextInSheet() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const dataRange = sheet.getDataRange();
  const dataValue = dataRange.getValues();
  const headers = dataValue.shift(); // ヘッダーを取り出す

  for (let i = 0; i &lt; dataValue.length; i++) {
    dataValue&#091;i] = dataValue&#091;i].map(function (value) {
      return typeof value === "string" ? value.trim().normalize('NFKC').replace(/\s+/g, "").toLowerCase() : value;
    });
  }

  sheet.getRange(2, 1, dataValue.length, dataValue&#091;0].length).setValues(dataValue);
}</code></pre>



<h3 class="wp-block-heading"><span id="toc2">📌 このコードが行うこと</span></h3>



<ul class="wp-block-list">
<li><strong>全角・半角の統一</strong>（<code>normalize('NFKC')</code>）</li>



<li><strong>不要なスペースの削除</strong>（<code>replace(/\s+/g, "")</code>）</li>



<li><strong>英字を小文字に変換</strong>（<code>toLowerCase()</code>）</li>



<li><strong>文字列の前後の空白削除</strong>（<code>.trim()</code>）</li>



<li><strong>整形後のデータをスプレッドシートに書き戻す</strong></li>
</ul>



<h2 class="wp-block-heading"><span id="toc3">🔍 コードの動作イメージ</span></h2>



<p>📌 <strong>修正前</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th class="has-text-align-left" data-align="left">商品番号</th><th>商品名</th></tr><tr><td class="has-text-align-left" data-align="left">ＡＢ１２３</td><td>ワイヤレスイヤホ ン Pro</td></tr><tr><td class="has-text-align-left" data-align="left">abＣＤ456</td><td>スマートフォンケース クリア</td></tr><tr><td class="has-text-align-left" data-align="left">１２３４５６</td><td>モバイルバ ッテリー 10000mAh</td></tr></tbody></table></figure>



<p>⬇ <strong>スクリプトを実行すると…</strong></p>



<p>📌 <strong>修正後</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>商品番号</strong></td><td><strong>商品名</strong></td></tr><tr><td>ab123</td><td>ワイヤレスイヤホンpro</td></tr><tr><td>abcd456</td><td>スマートフォンケースクリア</td></tr><tr><td>123456</td><td>モバイルバッテリー10000mah</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc4">📝 どんな場面で使う？</span></h2>



<ul class="wp-block-list">
<li>スプレッドシートの <strong>データがバラバラ</strong>（全角・半角が混ざっている）</li>



<li><strong>無駄なスペース</strong> が入っている</li>



<li>英字の <strong>大文字・小文字を統一</strong> したい</li>



<li><strong>手作業で修正するのが面倒</strong></li>
</ul>



<p>このスクリプトを実行すれば、データが自動的に整形されて <strong>統一感のあるデータ</strong> になります！🚀</p>



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



<h2 class="wp-block-heading"><span id="toc5">💡 コードの詳細解説</span></h2>



<h3 class="wp-block-heading"><span id="toc6">1️⃣ スプレッドシートのデータを取得</span></h3>



<pre class="wp-block-code"><code>const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const dataRange = sheet.getDataRange();
const dataValue = dataRange.getValues();
const headers = dataValue.shift();</code></pre>



<ul class="wp-block-list">
<li><code>SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()</code> → <strong>現在のシートを取得</strong></li>



<li><code>sheet.getDataRange()</code> → <strong>データ範囲（Rangeオブジェクト）を取得</strong></li>



<li><code>dataRange.getValues()</code> → <strong>セルの値を取得して2次元配列に格納</strong></li>



<li><code>dataValue.shift()</code> → <strong>ヘッダー（1行目）を取り除く</strong></li>
</ul>



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



<h3 class="wp-block-heading"><span id="toc7">2️⃣ データの整形（正規化）</span></h3>



<pre class="wp-block-code"><code>for (let i = 0; i &lt; dataValue.length; i++) {
  dataValue&#091;i] = dataValue&#091;i].map(function (value) {
    return typeof value === "string" ? value.trim().normalize('NFKC').replace(/\s+/g, "").toLowerCase() : value;
  });
}</code></pre>



<p>✅ <strong>ループ処理の詳細</strong></p>



<ul class="wp-block-list">
<li><code>for</code> ループを使い、<strong>スプレッドシートの各行を順番に処理</strong></li>



<li><code>dataValue.length</code> で <strong>行数（データの数）</strong> を取得し、その回数だけループ</li>



<li><code>dataValue[i]</code> には<strong>各行のデータ（配列）が格納されている</strong></li>
</ul>



<p>✅ <strong>typeof value === &#8220;string&#8221; ? について</strong></p>



<ul class="wp-block-list">
<li><code>typeof value</code> でデータ型を判定</li>



<li>文字列（<code>string</code>）の場合のみ正規化処理を実行</li>



<li>数値や空のセル（<code>null</code>）などは変更せずそのまま保持</li>
</ul>



<p>✅ <strong>map() を使う理由</strong> スプレッドシートのデータは<strong>二次元配列</strong>のため、<code>dataValue[i]</code> の各セルを処理するために <code>map()</code> を使用。</p>



<ul class="wp-block-list">
<li><strong>適用する処理</strong>：
<ol start="1" class="wp-block-list">
<li><code>.trim()</code> → <strong>前後の空白を削除</strong></li>



<li><code>.normalize('NFKC')</code> → <strong>全角カタカナ・英数字を半角に統一</strong></li>



<li><code>.replace(/\s+/g, "")</code> → <strong>すべての空白を削除</strong></li>



<li><code>.toLowerCase()</code> → <strong>英字を小文字に変換</strong></li>
</ol>
</li>
</ul>



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



<h3 class="wp-block-heading"><span id="toc8">3️⃣ 整形後のデータをスプレッドシートに書き戻す</span></h3>



<pre class="wp-block-code"><code>sheet.getRange(2, 1, dataValue.length, dataValue&#091;0].length).setValues(dataValue);</code></pre>



<ul class="wp-block-list">
<li><code>.getRange(2, 1, dataValue.length, dataValue[0].length)</code>
<ul class="wp-block-list">
<li><code>2,1</code> → <strong>A2セル（2行目・1列目）から書き込み開始</strong>（ヘッダーを除外）</li>



<li><code>dataValue.length</code> → <strong>行数（データの行数）</strong></li>



<li><code>dataValue[0].length</code> → <strong>列数（データの列数）</strong></li>
</ul>
</li>



<li><code>.setValues(dataValue)</code> → <strong>スプレッドシートに書き戻す</strong></li>
</ul>



<p>✅ <strong>データ構造のポイント</strong></p>



<ul class="wp-block-list">
<li>スプレッドシートのデータは<strong>2次元配列</strong>の形で扱われる。</li>



<li><code>dataValue</code> は <code>[[値1, 値2, ...], [値1, 値2, ...], ...]</code> という形式。</li>



<li><strong>そのまま </strong><code><strong>.setValues()</strong></code><strong> で</strong>値をセットできるため、手間がかからない。</li>
</ul>



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



<h2 class="wp-block-heading"><span id="toc9">📝 GASでデータを整形する各処理の具体例【初心者向け】</span></h2>



<h3 class="wp-block-heading"><span id="toc10">.trim() を使って前後の空白を削除する方法</span></h3>



<pre class="wp-block-code"><code>let str = "  テストデータ  ";
console.log(str.trim());</code></pre>



<p><strong>出力:</strong></p>



<pre class="wp-block-code"><code>"テストデータ"</code></pre>



<h3 class="wp-block-heading"><span id="toc11">.normalize('NFKC') を使って全角カタカナ・英数字を半角に統一する方法</span></h3>



<pre class="wp-block-code"><code>let str = "ＡＢＣ１２３";
console.log(str.normalize('NFKC'));</code></pre>



<p><strong>出力:</strong></p>



<pre class="wp-block-code"><code>"ABC123"</code></pre>



<h3 class="wp-block-heading"><span id="toc12">.replace(/\s+/g, "") を使ってすべての空白を削除する方法</span></h3>



<pre class="wp-block-code"><code>let str = "テ ス ト  デ ー タ";
console.log(str.replace(/\s+/g, ""));</code></pre>



<p><strong>出力:</strong></p>



<pre class="wp-block-code"><code>"テストデータ"</code></pre>



<h3 class="wp-block-heading"><span id="toc13">.toLowerCase() を使って英字を小文字に変換する方法</span></h3>



<pre class="wp-block-code"><code>let str = "TESTdata";
console.log(str.toLowerCase());</code></pre>



<p><strong>出力:</strong></p>



<pre class="wp-block-code"><code>"testdata"</code></pre>



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



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li><strong>.trim() → 前後のスペースを削除</strong></li>



<li><strong>normalize(&#8216;NFKC&#8217;) → 全角→半角に変換</strong></li>



<li><strong>replace(/\s+/g, &#8220;&#8221;) → すべての空白を削除</strong></li>



<li><strong>toLowerCase() → 小文字に変換</strong></li>



<li><strong>typeof value === &#8220;string&#8221; で文字列だけ変換対象にする</strong></li>



<li><strong>ループ処理でデータを一括整形</strong></li>
</ul>



<p></p>



<p>このスクリプトを使えば、スプレッドシートのデータを<strong>一瞬で整形</strong>できるので、手作業の手間を大幅に削減できます！🚀</p>
</div>



<p>ぜひ活用してみてください！</p>


<div class="information-box">
<h2><span id="toc15">この記事についてのご意見や間違いのご指摘は、ぜひX（旧Twitter）でお知らせください！</span></h2>
<p>皆さまのフィードバックをお待ちしています。以下のアカウントまでお気軽にメッセージをお寄せください。</p>
<div class="primary-box"><a rel="nofollow noopener" target="_blank" href="https://x.com/ikaikapo">▶︎ <strong>[イカPO]（@ikaikapo）</strong></a><a rel="nofollow noopener" target="_blank" href="https://x.com/ikaikapo"><img loading="lazy" decoding="async" class="alignnone wp-image-183 size-thumbnail" src="https://shoelab.jp/wp-content/uploads/2024/08/e14debba4b651ab77c82b66fca4377bf-150x150.png" alt="" width="150" height="150" /></a></div>
<p>この記事には筆者の個人的な解釈も一部含まれています。一つの参考としてお読みいただきつつ、最終的にはご自身や担当の方としっかり相談の上で判断いただけますと幸いです。</p>
<p>皆様の声で情報をアップデートしていきます。よろしくお願いします。</p>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【GAS入門】スプレッドシートから抽出したデータをメールで自動送信する方法</title>
		<link>https://shoelab.jp/gas/%e3%80%90gas%e5%85%a5%e9%96%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%81%8b%e3%82%89%e6%8a%bd%e5%87%ba%e3%81%97%e3%81%9f%e3%83%87%e3%83%bc%e3%82%bf/</link>
		
		<dc:creator><![CDATA[イカP]]></dc:creator>
		<pubDate>Sat, 01 Mar 2025 03:00:00 +0000</pubDate>
				<category><![CDATA[GAS]]></category>
		<guid isPermaLink="false">https://ikapoit.shoelab.jp/?p=69</guid>

					<description><![CDATA[こんにちは。イカPOです。「最終受注日が10か月以上経過したデータを自動抽出＆メール通知する方法」のスクリプト解説第3弾です。前回は、②のスプレッドシートから条件をつけてデータを抽出する機能を実装しました。 今回は、③の [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。イカPOです。「最終受注日が10か月以上経過したデータを自動抽出＆メール通知する方法」のスクリプト解説第3弾です。<br>前回は、②のスプレッドシートから条件をつけてデータを抽出する機能を実装しました。</p>



<p>今回は、③の抽出したデータをメールで送信する機能を実装します。</p>



<p>スクリプトの処理手順でいえば③です。これが最後のフェーズです。</p>



<p>1️⃣ <a rel="nofollow noopener" target="_blank" href="https://ikapoit.shoelab.jp/2025/02/15/%e3%80%90gas%e5%85%a5%e9%96%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%81%8b%e3%82%89%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e6%8a%bd%e5%87%ba%e3%81%97/">顧客管理表を取得（スプレッドシートのデータを取得）（前々回）</a><br>2️⃣ <a rel="nofollow noopener" target="_blank" href="https://ikapoit.shoelab.jp/2025/02/22/%e3%80%90gas%e5%85%a5%e9%96%80%e3%80%91%e5%88%9d%e5%bf%83%e8%80%85%e5%90%91%e3%81%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%81%8b%e3%82%89%e6%9d%a1%e4%bb%b6/">取得したデータから、最終受注日が10か月以上経過した顧客を探す（前回）</a><br>3️⃣ 一覧をメールで送信する ← 今ここ</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">GASでメールを送信する方法</a><ol><ol><li><a href="#toc2" tabindex="0">sendEmail(recipient, subject, body)の解説</a></li></ol></li></ol></li><li><a href="#toc3" tabindex="0">メール送信用の関数の作成</a><ol><ol><li><a href="#toc4" tabindex="0">コード全文</a></li></ol></li><li><a href="#toc5" tabindex="0">メール送信用関数の処理の手順</a><ol><li><a href="#toc6" tabindex="0">1️⃣ overdueOrdersを受け取る</a></li><li><a href="#toc7" tabindex="0">2️⃣ アドレス、題名、本文を準備する</a></li><li><a href="#toc8" tabindex="0">3️⃣ メールを送信する</a></li></ol></li><li><a href="#toc9" tabindex="0">関数を手動で実行してみよう</a></li></ol></li><li><a href="#toc10" tabindex="0">メール送信用の関数にトリガーを設定して自動送信しよう</a><ol><li><a href="#toc11" tabindex="0">補足事項</a></li><li><a href="#toc12" tabindex="0">まとめ</a></li></ol></li><li><a href="#toc13" tabindex="0">この記事についてのご意見や間違いのご指摘は、ぜひX（旧Twitter）でお知らせください！</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">GASでメールを送信する方法</span></h2>



<p>GASでメールを送信するには、<code>GmailApp.sendEmail</code>を使用します。<br>Gmailクラスに存在する<code>.sendEmail</code>を使うことでメールを送信できます。</p>



<div class="wp-block-group is-style-information-box is-layout-constrained wp-block-group-is-layout-constrained">
<h4 class="wp-block-heading"><span id="toc2">sendEmail(recipient, subject, body)の解説</span></h4>



<p><code>recipient</code>にはメールアドレス、<code>subject</code>にはメールの題名、<code>body</code>にはメールの本文をそれぞれ渡すことができます。</p>



<pre class="wp-block-code"><code>GmailApp.sendEmail("hogehoge@gmail.com", "メール題名ですよ", "今日はいい天気ですね");</code></pre>



<p>この場合、メールアドレス &#8220;<a>hogehoge@gmail.com</a>&#8221; に「メール題名ですよ」というタイトルの本文が「今日はいい天気ですね」というメールが送信されます。</p>
</div>



<p><strong>今回の場合:</strong></p>



<ul class="wp-block-list">
<li>メールアドレス：自分のメールアドレス</li>



<li>メールのタイトル：自由（例：「受注経過日が10か月以上過ぎた顧客名」など）</li>



<li>本文：前回抽出した条件にマッチしたデータを含む内容</li>
</ul>



<h2 class="wp-block-heading"><span id="toc3">メール送信用の関数の作成</span></h2>



<p><code>コード.gs</code>にメール送信用の関数を追加しましょう。<br>前回作成した配列データ<code>overdueOrders</code>をメールで送信する関数なので、<code>sendOverdueOrdersEmail()</code>と名付けました。</p>



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



<pre class="wp-block-code"><code>function sendOverdueOrdersEmail(overdueOrders) {
  if (overdueOrders.length > 0) {
    let emailAddress = Session.getActiveUser().getEmail(); 
    const subject = "10か月以上経過した最終受注日の通知";
    const body = `以下の受注日が10か月以上経過しています:\n\n${overdueOrders.join('\n')}`;
    GmailApp.sendEmail(emailAddress, subject, body);
    Logger.log("メールを送信しました。");
  } else {
    Logger.log("10か月以上経過した受注日はありません。");
  }
}</code></pre>



<h3 class="wp-block-heading"><span id="toc5">メール送信用関数の処理の手順</span></h3>



<p>1️⃣ <code>overdueOrders</code>を受け取る<br>2️⃣ アドレス、題名、本文を準備する<br>3️⃣ メールを送信する</p>



<p>この関数でやりたいことは3つです。シンプルですね。順番に記述していきましょう。</p>



<h4 class="wp-block-heading"><span id="toc6">1️⃣ overdueOrdersを受け取る</span></h4>



<pre class="wp-block-preformatted">function sendOverdueOrdersEmail(overdueOrders) {<br>  if (overdueOrders.length > 0) {<br>  } else {<br>    Logger.log("10か月以上経過した受注日はありません。");<br>  }<br>}</pre>



<p><code>sendOverdueOrdersEmail()</code>を宣言し、引数として<code>overdueOrders</code>を受け取れるように準備します。<br>念のため、10か月以上のデータがなかった場合（条件に合うデータがなかった場合）を考慮して<code>if</code>文を用意します。</p>



<pre class="wp-block-code"><code>if (overdueOrders.length > 0) {
  // データがある場合の処理
} else {
  // else内に10か月以上経過したデータがない場合の処理を書く
  Logger.log("10か月以上経過した受注日はありません。");
}</code></pre>



<p><code>overdueOrders.length > 0</code>は、<code>overdueOrders</code>配列が1つ以上の要素を持つことを意味します。<br>この<code>if</code>文で<code>overdueOrders</code>がデータとして存在しているかを判断します。</p>



<h4 class="wp-block-heading"><span id="toc7">2️⃣ アドレス、題名、本文を準備する</span></h4>



<pre class="wp-block-preformatted"><code>let emailAddress = Session.getActiveUser().getEmail(); // 自分自身のメールアドレスを取得<br>const subject = "10か月以上経過した最終受注日の通知";<br>const body = `以下の受注日が10か月以上経過しています:\n\n${overdueOrders.join('\n')}`;</code></pre>



<ul class="wp-block-list">
<li>変数<code>emailAddress</code>に<code>Session.getActiveUser().getEmail()</code>を使用して自分自身のメールアドレスを取得し格納します。</li>



<li>変数<code>subject</code>にはメールのタイトルが、変数<code>body</code>にはメールの本文が代入されます。</li>
</ul>



<h4 class="wp-block-heading"><span id="toc8">3️⃣ メールを送信する</span></h4>



<pre class="wp-block-preformatted"><code>GmailApp.sendEmail(emailAddress, subject, body);</code></pre>



<p>このコードでメールを送信します。<br>変数<code><strong>emailAddress</strong></code>, <code><strong>subject</strong></code>, <code><strong>body</strong></code>を<code>sendEmail</code>に渡しています。</p>



<h3 class="wp-block-heading"><span id="toc9">関数を手動で実行してみよう</span></h3>



<p>作成した関数を実際に動かしてメールを送信するため、手動で以下の手順を実行してみましょう。</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://shoelab.jp/wp-content/uploads/2025/02/5e49ebda66596d28429d96308df10e6f.webp" alt="関数を選択後に実行をクリック" class="wp-image-71"/></figure>



<ol class="wp-block-list">
<li>Google Apps Scriptのエディタで「実行」→「関数を選択」で<code>notifyOverdueOrders</code>を選びます。</li>



<li>初回実行時には許可を求められるため、アクセスを許可してください。</li>



<li>許可後、Gmailを開いてメールが届いているか確認しましょう。</li>
</ol>



<p>手動で送信が確認できれば成功です！</p>



<h2 class="wp-block-heading"><span id="toc10">メール送信用の関数にトリガーを設定して自動送信しよう</span></h2>



<p>メールを送信するコードが用意できました。<br>あとはこの関数<code>notifyOverdueOrders</code>を好きな指定のタイミングで実行するだけで、メールを自動で送信できます。</p>



<p>自分自身の好きなタイミングで自動で実行するために、この関数にトリガーを設定しましょう。</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://shoelab.jp/wp-content/uploads/2025/02/d888badb73922c30f526a64846b02689.webp" alt="トリガーを選択" class="wp-image-72"/></figure>



<p>Google Apps Scriptエディタのメニューからトリガーを選択します。</p>



<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/02/6e55050fb35e0402dd9220dbca259b5c.webp" alt="トリガーを追加をクリック" class="wp-image-74" srcset="https://shoelab.jp/wp-content/uploads/2025/02/6e55050fb35e0402dd9220dbca259b5c.webp 800w, https://shoelab.jp/wp-content/uploads/2025/02/6e55050fb35e0402dd9220dbca259b5c-300x225.webp 300w, https://shoelab.jp/wp-content/uploads/2025/02/6e55050fb35e0402dd9220dbca259b5c-768x576.webp 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>「トリガーを追加」ボタンを押して、新しいトリガーを設定します。</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://shoelab.jp/wp-content/uploads/2025/02/e90ad8f280fa2255a24a7e84708dc042.webp" alt="関数を選択し時間手動型を選択" class="wp-image-75"/></figure>



<p>関数名として<code>notifyOverdueOrders</code>を選び、実行のタイミングを「時間主導型」などから選択しましょう。</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://shoelab.jp/wp-content/uploads/2025/02/24b9f8bf423932073140e63cf71f33d8.webp" alt="設定が完了したら保存をクリック" class="wp-image-76"/></figure>



<p>設定を保存して完了です。これで指定したタイミングで自動的にメールが送信されます。</p>



<ol class="wp-block-list"></ol>



<h3 class="wp-block-heading"><span id="toc11">補足事項</span></h3>



<p><strong>.join(&#8216;\n&#8217;)を使った改行について</strong><br>例えば以下のようなコードの場合、</p>



<pre class="wp-block-preformatted"><code>const overdueOrders = ["2023-04-10", "2023-03-15", "2023-02-28"]; <br>console.log(overdueOrders.join('\n'));</code></pre>



<p>このコードは以下のように出力されます。</p>



<pre class="wp-block-preformatted"><code>2023-04-10  <br>2023-03-15  <br>2023-02-28  </code></pre>



<p><strong>アプリを実行しているユーザーのメールアドレスを取得する方法</strong><br><code>Session.getActiveUser().getEmail()</code><br>この1文でアプリを実行しているユーザーのメールアドレスを取得できるため非常に便利です。</p>



<h3 class="wp-block-heading"><span id="toc12">まとめ</span></h3>



<p>今回はGASを使ってスプレッドシートから抽出したデータをメールで自動送信する方法を紹介しました。以下の3つのステップで自動化を実現できました。</p>



<ol class="wp-block-list">
<li>データの取得</li>



<li>条件付きのデータ抽出</li>



<li>抽出データのメール送信</li>
</ol>



<p>この一連の自動化手順により、業務の効率化が図れます。また、メール通知をトリガーで自動実行することで、手動作業を大幅に削減できます。</p>



<p>今後、このスクリプトを応用して以下のような自動化にも取り組むことが可能です。</p>



<ul class="wp-block-list">
<li>定期的な在庫管理のリマインダー</li>



<li>チームメンバーへの進捗通知</li>



<li>受注・発注状況の自動レポート送信</li>
</ul>



<p>ぜひこの自動化の仕組みを活用して、日々の業務を効率化してみてください。</p>



<p>前々回と前回の記事</p>



<p>スプレッドシートの取得方法と1行目をヘッダーとして扱う方法について</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 rel="nofollow noopener" target="_blank" href="https://ikapoit.shoelab.jp/2025/02/15/%e3%80%90gas%e5%85%a5%e9%96%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%81%8b%e3%82%89%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e6%8a%bd%e5%87%ba%e3%81%97/" title="【GAS入門】スプレッドシートからデータを抽出し、1行目をヘッダーとして扱う方法" 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://shoelab.jp/wp-content/uploads/2025/02/629dfa25b1f397a6183de2b73776b52b.webp" 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">【GAS入門】スプレッドシートからデータを抽出し、1行目をヘッダーとして扱う方法</div><div class="blogcard-snippet external-blogcard-snippet">GASで最終受注日をチェック＆通知するスクリプト解説【全体の流れ】こんにちは。イカPOです。今回からは連載形式の記事を掲載します。この記事はその第１回です。下記の記事で「最終受注日が10か月以上経過したデータを自動抽出＆メール通知する方法」...</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/gas/%e3%80%90gas%e5%85%a5%e9%96%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%81%8b%e3%82%89%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e6%8a%bd%e5%87%ba%e3%81%97/" 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>
</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 rel="nofollow noopener" target="_blank" href="https://ikapoit.shoelab.jp/2025/02/22/%e3%80%90gas%e5%85%a5%e9%96%80%e3%80%91%e5%88%9d%e5%bf%83%e8%80%85%e5%90%91%e3%81%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%81%8b%e3%82%89%e6%9d%a1%e4%bb%b6/" title="【GAS入門】初心者向けスプレッドシートから条件付きデータを自動抽出する方法" 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://shoelab.jp/wp-content/uploads/2025/02/684e69eb7b4650a8fc4903f39e0126cb.webp" 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">【GAS入門】初心者向けスプレッドシートから条件付きデータを自動抽出する方法</div><div class="blogcard-snippet external-blogcard-snippet">GASを使ってGoogleスプレッドシートのデータを条件付きで抽出する方法を解説。最終受注日10か月以上経過した顧客を自動で判定し、業務効率化を実現します。初心者でも安心のステップバイステップ解説です。</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/gas/%e3%80%90gas%e5%85%a5%e9%96%80%e3%80%91%e5%88%9d%e5%bf%83%e8%80%85%e5%90%91%e3%81%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%81%8b%e3%82%89%e6%9d%a1%e4%bb%b6/" 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>
</div></figure>


<div class="information-box">
<h2><span id="toc13">この記事についてのご意見や間違いのご指摘は、ぜひX（旧Twitter）でお知らせください！</span></h2>
<p>皆さまのフィードバックをお待ちしています。以下のアカウントまでお気軽にメッセージをお寄せください。</p>
<div class="primary-box"><a rel="nofollow noopener" target="_blank" href="https://x.com/ikaikapo">▶︎ <strong>[イカPO]（@ikaikapo）</strong></a><a rel="nofollow noopener" target="_blank" href="https://x.com/ikaikapo"><img loading="lazy" decoding="async" class="alignnone wp-image-183 size-thumbnail" src="https://shoelab.jp/wp-content/uploads/2024/08/e14debba4b651ab77c82b66fca4377bf-150x150.png" alt="" width="150" height="150" /></a></div>
<p>この記事には筆者の個人的な解釈も一部含まれています。一つの参考としてお読みいただきつつ、最終的にはご自身や担当の方としっかり相談の上で判断いただけますと幸いです。</p>
<p>皆様の声で情報をアップデートしていきます。よろしくお願いします。</p>
</div>

]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
