69
78

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GAS×React×TypeScriptによるWebアプリの作り方

Posted at

はじめに

GASでWebアプリを作るにはフロントエンド部分を HTMLファイル にまとめる必要があります。

ただし、これは飽くまで最終的にHTMLにまとまっていればいいということなので、ローカル環境では好きな方法でWebアプリを作ることができます。

この記事では例としてVSCodeでTypeScriptによるReactアプリを作り、Viteというプラグインで1つのHTMLファイルにまとめてから clasp でGASのプロジェクトにアップロードしてみます。

事前準備

Node.jsのインストール

TypeScriptやReact、Vite、claspなどを使うには Node.js をインストールする必要があります。

Node.jsをインストールするには公式サイトからインストーラを入手して実行しましょう。

VSCodeでの開発

新規プロジェクトを作成する

任意のディレクトリにGASでデプロイするWebアプリを作るためのプロジェクト用のディレクトリを作成して移動してください。

mkdir react-web-app
cd react-web-app

Viteプロジェクトの作成

Viteのインストール

ViteはReactなどで作成したWebアプリを様々な形式でまとめるためのプラグインです。

今回はReactアプリを1ファイルにまとめるため、ViteSingleFile というプラグインをインストールします。

npm install vite-plugin-singlefile --save-dev

また、入力補完が使えるようついでにGASの型情報もインストールしておきましょう。

npm i @types/google-apps-script --save-dev

Viteプロジェクトの初期化

Viteのインストールが完了したら次のコマンドでカレントディレクトリにViteプロジェクトを作成します。

npm create vite@latest .

するとカレントディレクトリの既存ファイルの取り扱いや使用するフレームワークの種類などを問われるので、それぞれ以下のように選択してください。

  • 既存のファイルの取り扱い: Ignore files and continue
  • フレームワーク:React
  • バリエーションの選択:TypeScript

出力ディレクトリの設定

ViteでまとめたHTMLファイルの出力先を設定するため、vite.config.ts というファイルを次のように編集してください。

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { viteSingleFile} from 'vite-plugin-singlefile';

// https://vite.dev/config/
export default defineConfig({
  plugins: [react(), viteSingleFile()],
  build: {
    outDir: "appsscript/client",
  }
});

GASプロジェクトとの接続

Viteプロジェクトが作成できたらGASプロジェクトとソースを共有するための作業スペースを作っていきます。

まずは clasp でGoogleアカウントにログインしてください。

clasp login

続いて、GASプロジェクトにアップロードするファイルを格納するディレクトリを作ります。

mkdir appsscript
cd appsscript

ここで、新規のGASプロジェクトを作成する場合は次のコマンドを実行してください。

clasp create

あるいは、GASプロジェクトが既に存在する場合は次のコマンドでクローンしてください。

clasp clone スクリプトID

GASプロジェクトの新規作成またはクローンが完了したら .clasp.json を次のように編集してください。

{
    "scriptId":"スクリプトID",
    "rootDir":"./",
    "parentId":"バインドされているGoogleWorkspaceアプリのID"
}

※ parentId:スクリプトプロジェクトがスプレッドシートなどのGoogleWorkspaceアプリのファイルにバインドされている場合に記載します。

また、ローカル環境からWebアプリをデプロイしたい場合は appsscript.json を次のように編集してください。

{
  "timeZone": "Asia/Tokyo",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "dependencies": {},
  "webapp": {
    "executeAs": "USER_DEPLOYING",
    "access": "MYSELF"
  }
}

デプロイの設定について

  • executeAs:
    doGet や doPost をどのアカウントで実行するかを設定する項目で次の選択肢があります。

    • USER_DEPLOYING:Webアプリをデプロイしたアカウント
    • USER_ACCESSING:Webアプリにアクセスしているアカウント

  • access:
    Webアプリにアクセスできるユーザの範囲を設定する項目で次の選択肢があります。

    • MYSELF:自分だけ
    • ANYONE:Googleアカウントにログインしている全員
    • ANYONE_ANONYMOUS:全員
    • DOMAIN:同一ドメインのユーザだけ(※無料アカウントでは選択不可)

サーバサイドの実装

ViteとGASのプロジェクト設定ができたらいよいよ実装です。

サーバサイドの処理は appsscript/server ディレクトリ に code.js というファイルを作り次のように定義しましょう。

function doGet() {
  return HtmlService.createHtmlOutputFromFile("client/index")
    .addMetaTag("viewport", "width=device-width, initial-scale=1")
    // .setFaviconUrl("ファビコンURL") // ※ 任意
    .setTitle("GAS×React×TypeScript App");
}

クライアントサイドの実装

Viteは srcディレクトリ の内容を vite.config.ts で設定した出力先に書き出すので、フロントエンド部分は普段の Reactアプリ の開発要領で実装できます。

ここでは App.tsx を次のように編集してみましょう。(コピペで大丈夫です!)

import { useState } from 'react'
import reactLogo from './assets/react.svg'
import './App.css'

function App() {
  const [count, setCount] = useState(0)

  return (
    <>
      <div>
        <a href="https://workspace.google.com/intl/ja/products/apps-script/" target="_blank">
          <img 
            src="https://storage.googleapis.com/assets_workspace/uploads/7uffzv9dk4sn-3MG3mFcK1L7h5YD0Cgq36v-07b7abd2909e1389a54962bd6c3c99ed-AppsScript-title-logo.svg" 
            className="logo" alt="Google Apps Script logo"
          />
        </a>
        <a href="https://react.dev" target="_blank">
          <img src={reactLogo} className="logo react" alt="React logo" />
        </a>
        <a href="https://www.typescriptlang.org/ja/" target="_blank">
          <img 
            src="https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Typescript_logo_2020.svg/512px-Typescript_logo_2020.svg.png"
            className="logo react" alt="React logo" 
          />
        </a>
      </div>
      <h1>GAS × React × TypeScript</h1>
      <div className="card">
        <button onClick={() => setCount((count) => count + 1)}>
          count is {count}
        </button>
        <p>
          Edit <code>src/App.tsx</code> and save to test HMR
        </p>
      </div>
    </>
  )
}

export default App

publicディレクトリのクリア

デフォルトのViteプロジェクトはpublicディレクトリにViteのロゴを配置します。

このロゴはアプリのビルド時に出力先ディレクトリへコピーされてしまいます。

この挙動を避けるため、ビルド前にpublicディレクトリは空にしておきましょう。

Webアプリのデプロイ

Webアプリの実装が完了したらプロジェクトルートに移動してビルドコマンドを実行します。

npm run build

ビルドが完了したらappsscriptディレクトリに移動してソースコードをGASプロジェクトにプッシュします。

clasp push -f

プッシュが完了したらデプロイを実行しましょう。

clasp deploy

動作確認

デプロイが完了したらスクリプトエディタを開いて「デプロイ」→「デプロイの管理」からWebアプリのURLを確認してアクセスしてみましょう。

以下のような画面が表示されれば成功です!

image.png

69
78
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
69
78

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?