💬

GASでHTMLファイルを分割して利用する方法

2025/02/16に公開

Google Apps Script (GAS) でのHTMLファイル分割ガイド

概要

Google Apps Script(GAS)でウェブアプリケーションを開発する際、HTMLファイルを複数のファイルに分割して管理することで、コードの保守性と再利用性を向上させることができます。
この文書では、GASでのHTMLファイル分割の基本的な実装方法について説明します。

基本的なファイル構成

ファイル構成の説明

  1. エントリーポイント

    • Code.js: アプリケーションのエントリーポイント
    • index.html: メインのHTMLテンプレート
  2. 基本モジュール

    • style.html: スタイルシートの定義
    • js.html: JavaScriptモジュールの統合
  3. JavaScriptモジュール

    • js_module1.html: 機能モジュール1
    • js_module2.html: 機能モジュール2
    • js_module3.html: 機能モジュール3

実装方法

1. Code.jsの設定

// HTMLファイルをインクルードするためのヘルパー関数
// この関数は他のHTMLファイルを読み込むための基本的な関数です
function include(filename) {
  // HtmlServiceを使用してテンプレートファイルを読み込みます
  // filenameは拡張子なしのファイル名(例:'index')を指定します
  var template = HtmlService.createTemplateFromFile(filename);
  
  // テンプレートを評価(変数の置換やスクリプトの実行)して
  // HTML文字列として取得します
  var html = template.evaluate().getContent();
  
  // 生成されたHTML文字列を返します
  return html;
}

// 循環参照防止用の関数
// 同じファイルが複数回インクルードされることを防ぐためのグローバル変数
const INCLUDED_FILES = new Set();

// 安全にファイルをインクルードするための関数
// 循環参照(AファイルがBファイルを、BファイルがAファイルをインクルード)を防ぎます
function safeInclude(filename) {
  // すでにインクルードされたファイルかチェック
  if (INCLUDED_FILES.has(filename)) {
    // すでにインクルード済みの場合は空文字を返して処理をスキップ
    return '';
  }
  
  // インクルードされたファイルを記録
  INCLUDED_FILES.add(filename);
  
  // 通常のインクルード処理を実行
  return include(filename);
}

// Webアプリケーションのエントリーポイント
// GASでWebアプリとして公開する際に必要な関数です
function doGet() {
  // メインのHTMLファイル(index.html)をテンプレートとして読み込み
  return HtmlService.createTemplateFromFile('index')
    // テンプレートを評価してHTMLを生成
    .evaluate()
    // Webアプリのタイトルを設定
    .setTitle('My Web App')
    // iframeでの表示を許可(必要に応じて設定)
    .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}

2. index.htmlの構成

<!DOCTYPE html>
<html>
<head>
  <!-- GASのWebアプリで必要な設定 -->
  <!-- target="_top"は、iframeの中で表示される場合に親ウィンドウをターゲットにします -->
  <base target="_top">
  
  <!-- スタイルシートのインクルード -->
  <!-- <?!= ?>は、GASのスクリプトを実行するための特殊な構文です -->
  <!-- includeの実行結果(style.htmlの内容)がここに展開されます -->
  <?!= include('style') ?>
</head>
<body>
  <!-- メインコンテンツのコンテナ -->
  <!-- アプリケーションのUIはこのdiv内に配置します -->
  <div id="app">
    <!-- アプリケーションのHTML構造をここに記述 -->
  </div>

  <!-- JavaScriptのインクルード -->
  <!-- 全てのJavaScriptモジュールはjs.htmlを通じて読み込まれます -->
  <?!= include('js') ?>
</body>
</html>

3. style.htmlの構成

<style>
  /* CSSスタイルの定義 */
  /* アプリケーション全体で使用する共通のスタイルを定義します */
  
  /* コンテナの基本スタイル */
  .container {
    /* 中央寄せ配置 */
    margin: 0 auto;
    /* 内側の余白 */
    padding: 20px;
  }
  
  /* 他のスタイル定義 */
  /* プロジェクトで必要なスタイルをここに追加 */
</style>

4. js.htmlの構成

<!-- 外部JavaScriptライブラリの読み込み -->
<!-- 必要なライブラリのURLを指定します -->
<!-- 例:jQuery, Bootstrap等のCDNリンク -->
<script src="https://example.com/external-library.js"></script>

<!-- モジュールのインクルード -->
<!-- 各機能モジュールを順番に読み込みます -->
<!-- 依存関係を考慮して、必要なモジュールを先に読み込む必要があります -->
<?!= include('js_module1') ?>
<?!= include('js_module2') ?>
<?!= include('js_module3') ?>

<script>
  // メインのJavaScriptコード
  // アプリケーションの初期化処理を行う関数
  function initialize() {
    // アプリケーションの初期化処理をここに記述
    // 例:イベントリスナーの設定、初期データの読み込みなど
  }
  
  // ページ読み込み完了時に初期化関数を実行
  // DOMの読み込みが完了してから処理を開始します
  window.onload = initialize;
</script>

5. js_module1.htmlの例

<script>
  // モジュール1の機能定義
  // 特定の機能に関連する関数やクラスをここに記述します
  
  // モジュール1の主要な関数
  function module1Function() {
    // 機能の実装
    // 例:データの処理、UIの更新、サーバーとの通信など
  }
  
  // モジュール1で使用するヘルパー関数
  function module1Helper() {
    // ヘルパー機能の実装
    // 主要機能をサポートする補助的な処理
  }
  
  // モジュール1で使用するグローバル変数(必要な場合のみ)
  const MODULE1_CONSTANTS = {
    // モジュール固有の定数
    // 設定値や固定値を定義
  };
</script>

ベストプラクティス

  1. モジュール分割の基準

    • 機能単位でファイルを分割
    • 関連する機能をまとめる
    • 再利用可能なコンポーネントを独立させる
  2. 命名規則

    • 明確で説明的なファイル名を使用
    • 機能を表す接頭辞を付ける(例:feature_, util_, ui_*)
  3. 依存関係の管理

    • 依存関係を明確にする
    • 循環参照を避ける
    • 必要なモジュールを適切な順序でインクルード

注意点

  1. ファイル名は.html拡張子を持つ必要がありますが、インクルード時は拡張子を省略します
  2. インクルード構文 <?!= include('filename') ?> はHTMLエスケープを行わずに出力します
  3. モジュール間の依存関係を慎重に管理してください
  4. 大規模なアプリケーションでは、機能ごとの分割粒度を適切に設定してください

このドキュメントの使い方

このドキュメントをCursorのdocs引用でしようsレバ同じように実行できると思いますので、ぜひ使ってみてください

Discussion