GASでWebアプリ(じゃんけんゲーム)を作成する

image

はじめに

今回の記事は、Google Apps Scriptを使ってじゃんけんゲームを作ってみようという記事になります。通常htmlファイルをデプロイするにはサーバーが必要ですが、Google Apps Scriptを使うことで、サーバーを使わずにhtmlをデプロイすることができます。 初心者でも簡単にWebアプリを作成することができて、デプロイとは何か、htmlや、css、javascriptの関係など勉強になると思います。作ったものはこちらになります。

今回やること

  • じゃんけんゲームのhtmlファイルを作成する。
  • 作ったhtmlを元にしてGASでWebアプリを作成する。
  • デプロイして、挙動を確認する。
  • 「styleタグ」と「scriptタグ」を外部ファイルに分ける。
  • まとめ

htmlファイルの作成

じゃんけんゲームのhtmlファイルを作成します。ファイル名をindex.htmlとして以下のようなコードを作成しました。コピペして、ローカルで開いてみて、じゃんけんゲームができることを確認してください。

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>じゃんけんゲーム</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            margin: 20px;
        }

        .choice-btn {
            font-size: 18px;
            margin: 10px;
            padding: 10px 20px;
            cursor: pointer;
        }

        #result {
            margin-top: 20px;
            font-size: 24px;
            font-weight: bold;
        }

        .hands {
            font-size: 80px;
            margin: 20px 0;
            display: flex;
            flex-direction: column;
            text-align: center;
        }

        .score {
            margin: 30px;
            padding: 20px;
            font-size: 18px;
        }
    </style>
</head>

<body>
    <span style="padding: 20px"></span>
    <h1>じゃんけんゲーム</h1>
    <div class="hands">
        <span style="font-size : 12pt">computer</span>
        <span id="computerHand">👊</span>
        <span style="padding: 15px"></span>
        <span style="font-size : 12pt">you</span>
        <span id="playerHand">👊</span>
        <span style="padding: 15px"></span>
    </div>

    <div id="result">じゃんけん...</div>
    <div class="score">
        勝ち: <span id="wins">0</span>
        負け: <span id="losses">0</span>
        引き分け: <span id="draws">0</span>
    </div>

    <div>
        <button class="choice-btn" onclick="play('グー')">グー 👊</button>
        <button class="choice-btn" onclick="play('チョキ')">チョキ ✌️</button>
        <button class="choice-btn" onclick="play('パー')">パー 🖐️</button>
    </div>

    <script>
        let wins = 0;
        let losses = 0;
        let draws = 0;

        const hands = {
            'グー': '👊',
            'チョキ': '✌️',
            'パー': '🖐️'
        };

        function play(playerChoice) {
            const choices = ['グー', 'チョキ', 'パー'];
            const computerChoice = choices[Math.floor(Math.random() * choices.length)];

            document.getElementById('playerHand').textContent = hands[playerChoice];
            document.getElementById('computerHand').textContent = hands[computerChoice];

            let result;
            if (playerChoice === computerChoice) {
                result = '引き分け!';
                draws++;
            } else if (
                (playerChoice === 'グー' && computerChoice === 'チョキ') ||
                (playerChoice === 'チョキ' && computerChoice === 'パー') ||
                (playerChoice === 'パー' && computerChoice === 'グー')
            ) {
                result = 'あなたの勝ち!';
                wins++;
            } else {
                result = 'コンピュータの勝ち!';
                losses++;
            }

            document.getElementById('result').textContent = result;
            updateScore();
        }

        function updateScore() {
            document.getElementById('wins').textContent = wins;
            document.getElementById('losses').textContent = losses;
            document.getElementById('draws').textContent = draws;
        }
    </script>
</body>

</html>

GASでWebアプリの作成

挙動が確認できたら、GASでWebアプリを作成します。GASのエディタを開いてindex.htmlを作成し、上記のコードを貼り付けます。

doGet関数の作成

function doGet(){
    return HtmlService.createTemplateFromFile('index').evaluate().setTitle('じゃんけんゲーム');
}

doGet関数は、ウェブアプリへのアクセス(GETリクエスト)があった際に、最初に実行される関数です。 HtmlService.createTemplateFromFile('index')は、エディタ内に保存されたHTMLファイル(index.html)を読み込み、それをテンプレートとして利用するためのメソッドになります。
その後、evaluate() メソッドを呼び出すことで、テンプレートを評価し、最終的な HTML出力オブジェクトを作成します。setTitle('じゃんけんゲーム')は、タブに表示する文字です。
またcreateTemplateFromFile()は、HTMLファイル内で変数を扱うことができます。

デプロイ

作成したhtmlファイルをデプロイします。 デプロイの方法は、こちらなどを参考にしてください。
あっという間に「じゃんけんゲーム」の完成です。

styleタグとscriptタグを外部ファイルに分ける

これで完成ですが、可読性と保守性を考えて、styleタグとscriptタグ部分を外部ファイルに分けてみます。

style.htmlの作成

style.htmlファイルを作成し、index.htmlのstyleタグの部分を移動させます。

<style>
    body {
        font-family: Arial, sans-serif;
        text-align: center;
        margin: 20px;
    }
    ....

    // 以下省略
</style>

javascript.htmlの作成

javascript.htmlファイルを作成し、index.htmlのscriptタグの部分を移動させます。

<script>

    let wins = 0;
    let losses = 0;
    let draws = 0;

    const hands = {
        'グー': '👊',
        'チョキ': '✌️',
        'パー': '🖐️'
    };
    ....

    // 以下省略
</script>

include.gsの作成

function include(filename) {
    return HtmlService.createHtmlOutputFromFile(filename)
        .getContent();
}

style.htmlとjavascript.htmlファイルを変数として、index.htmlの中で呼び出すためのコードとなります。
HtmlService.createHtmlOutputFromFile()は、エディタ内に保存されたHTMLファイルを、そのままHTML出力オブジェクトとして生成するためのメソッドです。静的なHTMLファイルをそのまま読み込む場合に使用します。変数の取り扱いはできません。 getContent()メソッドで、読み込んだHTMLファイルの文字列を取得することができます。

index.htmlの修正

今までの処理により、新たに作成したindex.htmlは以下のようになります。

<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <title>じゃんけんゲーム</title>
  <?!= include('style'); ?> 
</head>

<body>
  <span style="padding: 20px"></span>
  <h1>じゃんけんゲーム</h1>
  <div class="hands">
    <span style="font-size : 12pt">computer</span>
    <span id="computerHand">👊</span>
    <span style="padding: 15px"></span>
    <span style="font-size : 12pt">you</span>
    <span id="playerHand">👊</span>
    <span style="padding: 15px"></span>
  </div>

  <div id="result">じゃんけん...</div>
  <div class="score">
    勝ち: <span id="wins">0</span>
    負け: <span id="losses">0</span>
    引き分け: <span id="draws">0</span>
  </div>

  <div>
    <button class="choice-btn" onclick="play('グー')">グー 👊</button>
    <button class="choice-btn" onclick="play('チョキ')">チョキ ✌️</button>
    <button class="choice-btn" onclick="play('パー')">パー 🖐️</button>
  </div>

  <?!= include('javascript'); ?>
  
</body>

</html>

ここで、スクリプトレットという記法が出てきます。headタグにある<?!= include('style'); ?>と、bodyタグにある<?!= include('javascript'); ?>です。
これは<?! ?>の中に、変数や関数を入れることにより動的にhtmlを表現できるというGASのしくみです。
これにより外部ファイルにしたstyle.html、javascript.htmlファイルをindex.htmlの中で、include()関数を使って呼び出すことができるようになります。

まとめ

以上で、GASでWebアプリを作ることができました。
いろいろコードをいじってみて、楽しんでください。

お知らせ

可茂IT塾ではFlutter/Reactのインターンを募集しています!

可茂IT塾ではFlutter/Reactのインターンを募集しています!

可茂IT塾ではFlutter/Reactのインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More

タグ

Flutter (118)初心者向け (29)イベント (18)Google Apps Script (16)Nextjs (12)可茂IT塾 (10)React (8)Firebase (7)riverpod (6)ChatGPT (5)vscode (5)デザイン (5)新卒 (4)就活 (4)Figma (4)Dart (4)JavaScript (4)お知らせ (4)FlutterWeb (3)Prisma (3)NestJS (3)Slack (3)TypeScript (3)ワーケーション (3)インターン (3)設計 (2)線型計画法 (2)事例 (2)Git (2)Image (2)File (2)Material Design (2)経験談 (2)画像 (2)iOS (2)アプリ開発 (2)React Hooks (2)tailwindcss (2)社会人 (2)大学生 (2)RSS (1)Google (1)Web (1)CodeRunner (1)個人開発 (1)Android (1)Unity (1)WebView (1)Twitter (1)フルリモート (1)TextScaler (1)textScaleFactor (1)学生向け (1)supabase (1)Java (1)Spring Boot (1)shell script (1)正規表現 (1)table (1)テーブル (1)hooks (1)react (1)パワーポイント (1)趣味 (1)モンスターボール (1)CSS (1)SCSS (1)Cupertino (1)ListView (1)就活浪人 (1)既卒 (1)保守性 (1)iPad (1)シェアハウス (1)スクレイピング (1)PageView (1)画面遷移 (1)flutter_hooks (1)Gmail (1)GoogleWorkspace (1)ShaderMask (1)google map (1)Google Places API (1)GCPコンソール (1)Google_ML_Kit (1)Vercel (1)Google Domains (1)DeepLeaning (1)深層学習 (1)Google Colab (1)コード生成 (1)GitHub Copilot (1)オンラインオフィス (1)javascript (1)css (1)html (1)オブジェクト指向 (1)クラスの継承 (1)ポリモーフィズム (1)LINE (1)Bitcoin (1)bitFlyer (1)コミュニティー (1)文系エンジニア (1)build_runner (1)freezed (1)Freezed (1)ヒーター (1)作業効率 (1) (1)Flutter実践開発 (1) (1)permission_handler (1)flutter_local_notifications (1)markdown (1)GlobalKey (1)ValueKey (1)Key (1)アイコン (1)go_router (1)FireStorage (1)debug (1)datetime_picker (1)Apple Store Connect (1)FlutterGen (1)デバッグ (1)Widget Inspector (1)VRChat (1)API (1)検索機能 (1)Shader (1)Navigator (1)メール送信 (1)FlutterFlow (1)Firebase App Distribution (1)Fastlane (1)Dio (1)CustomClipper (1)ClipPath (1)カスタム認証 (1)アニメーション (1)Arduino (1)ESP32 (1)フリーランス (1)会社員 (1)mac (1)csv (1)docker (1)GithubActions (1)Dialog (1)BI (1)LifeHack (1)ショートカット (1)Chrome (1)高校生 (1)キャリア教育 (1)非同期処理 (1)生体認証 (1)BackdropFilter (1)レビュー (1)getAuth (1)クローズドテスト (1)PlayConsole (1)Algolia (1)コンサルティング (1)Symbol (1)

お知らせ

可茂IT塾ではFlutter/Reactのインターンを募集しています!

可茂IT塾ではFlutter/Reactのインターンを募集しています!

可茂IT塾ではFlutter/Reactのインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More