1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

claspとTypeScriptを用いたGAS開発

1
Last updated at Posted at 2026-04-02

はじめに

先日、私用のプロジェクトで GAS(Google Apps Script) に触れる機会がありました。

Google Form でクイズを出題し、その回答を Google Spreadsheet で管理していたのですが、集計処理を自動化したいと考え、GAS を利用することにしました。

調べてみると、clasp を利用することでローカル環境から好きなエディタで開発できることを知りました。
さらに、TypeScript を用いた開発にも対応しているそうな。

本記事では、claspTypeScript を用いた GAS 開発環境の構築手順について紹介します。

構築手順

claspとは

clasp とは、ローカル環境でGAS開発を可能にするCLIツールで「Command Line Apps Script Projects」の略だそうです。

Apps Scriptプロジェクトの作成や編集、デプロイを行うことができ、様々なGoogleのサービス向けのウェブアプリやアドオンを作成し、公開することができます。

Node.jsの準備

clasp を動作させるにはNodeの環境が必要です。
利用可能か確認しておきましょう。

$ node -v
v22.19.0

現時点(2026年4月2日)ではNode.jsのバージョンは22.0.0以上が必要です。

claspのインストール

下記コマンドでグローバルにインストールしました。

npm install -g @google/clasp

実行することでGAS APIが使用可能になります。
実行後、下記URLよりGAS APIをオンにしてください:
https://script.google.com/home/usersettings

ログイン

ローカルでGASをするためにプロジェクトを作成するGoogleアカウントにログインする必要がある。

clasp login

コマンド入力後、ブラウザが立ち上がるのでアカウントを選択してclaspの使用を許可することでログインが完了します。

GASプロジェクトのクローン

今回は既存のGASを clasp で管理したかったので、下記コマンドから clone を行いました。

clasp clone {スクリプトのプロジェクトID}

プロジェクトIDはGASエディタのURLから取得できます:
https://script.google.com/home/projects/{プロジェクトID}/edit

TypeScriptの設定

デフォルトでは JavaScript を使用しているので、TypeScript で記述できるようにしていきます。

TypeScriptインストール

まずは下記コマンドを実行。

npm install -D typescript @types/google-apps-script

実行すると下記が自動で生成されます:

  • node_module
  • package.json
  • package-lock.json

tsconfig.json作成

続いて下記を実行して tsconfig.json を作成します。

npx tsc --init

中身はこんな感じで設定

{
  // Visit https://aka.ms/tsconfig to read more about this file
  "compilerOptions": {
    // File Layout
    "rootDir": "./src",

    // Environment Settings
    "module": "ESNext",
    "moduleResolution": "bundler",
    "target": "ES2020",
    "types": ["google-apps-script"],
    "lib": ["ES2020"],
    "experimentalDecorators": true,

    // Stricter Typechecking Options
    "noUncheckedIndexedAccess": true,
    "exactOptionalPropertyTypes": true,

    // Recommended Options
    "strict": true,
    "verbatimModuleSyntax": true,
    "isolatedModules": true,
    "moduleDetection": "force",
    "skipLibCheck": true
  }
}

ビルド用パッケージのインストール

npm install -D esbuild esbuild-gas-plugin

ビルド用スクリプトの作成

touch esbuild.js

中身はこんな感じで設定

import esbuild from "esbuild";
import { GasPlugin } from "esbuild-gas-plugin";

esbuild
    .build({
        entryPoints: ["./src/main.ts"],
        bundle: true,
        minify: true,
        outfile: "./dist/main.js",
        plugins: [GasPlugin],
    })
    .catch((error) => {
        console.log('build failed')
        console.error(error);
        process.exit(1);
    });

distの設定

まずはルート直下に dist フォルダを作成します

mkdir dist

clasp.json に下記内容を追記します。

{
    "rootDir": "./dist"
}

appsscript.json を作成した dist フォルダに移動させます。

ソースの移動

ルート直下に src フォルダを作成し、ソースコードを移動させます。

私の場合はプロジェクトをcloneしたのでこの時点でソースコードが存在していましたが、新たに作成する方は移動させるのではなく src 配下に作成してください。

package.jsonの編集

package.json に下記設定を記述します。

{
    "type": "module",
    "main": "./src/main.ts",
    "scripts": {
        "build": "node esbuild.js",
        "push": "clasp push",
        "open": "clasp open",
        "deploy": "npm run build && npm run push"
    },
}

フォルダ構成 と ファイル解説

フォルダ構成

この時点で私は下記のような構成になっていました。

root/
 ├ dist/
 │   └ appsscript.json
 ├ node_modules/ 
 ├ src/
 │   ├ doGet.ts
 │   ├ hogehoge.ts
 │   ├ index.html
 │   └ main.ts
 ├ .clasp.json
 ├ esbuild.js
 ├ package-lock.json
 ├ package.json
 └ tsconfig.json

ファイル解説

私の場合は下記4ファイルの構成でした:

ファイル名 説明
hogehoge.ts 画面に表示するボタン押下時に発火する処理を記述
doGet.ts GASのWebアプリとして公開されたとき、URLへのGETリクエストを受け取り、index.html をHTMLページとして返す
index.html 描画するHTMLを記述
main.ts GASへのエントリーポイント

肝心な doGet.tsmain.ts だけサンプルコード置いておきます:

doGet.ts

サーバーへのアクセスがあるとこの doGet() が呼ばれます。
index.htmlで記載した内容をreturnすることで画面が表示されます。

export function doGet(): GoogleAppsScript.HTML.HtmlOutput {
  return HtmlService.createHtmlOutputFromFile("index");
}
main.ts

このプロジェクトはバンドルしてGASにデプロイする構成です。
バンドラーはコードを即時実行関数などでラップするため、トップレベルで定義した関数がGASから見えなくなります。

そのため、global への代入でアクセス可能にしてやる必要があります。

import { doGet } from "./doGet";
import { hogehoge } from "./hogehoge";

interface Global {
  doGet: typeof doGet;
  hogehoge: typeof hogehoge;
}
declare const global: Global;

// GASランタイムへ関数を公開
global.doGet = doGet;
global.hogehoge = hogehoge;

ビルド・デプロイ

ビルドやデプロイなどはそれぞれ下記のコマンドで実行します。
コード修正後はデプロイコマンドを実行し、Apps Scriptで手動デプロイしてください。

# ビルド(コードをGAS用に変換)
npm run build

# プッシュ(ローカルの内容をGASに反映)
npm run push

# デプロイ済みWebアプリをブラウザで開く
npm run open

# デプロイ
npm run deploy

おわりに

今回は claspTypeScript を用いた環境開発構築を行いました。

clasp を利用することでコードをGithubなどでバージョン管理することができます。
CICDを設定することで clasp コマンドを実行できたりするので便利そうです。
また色々試してみよっと。

それでは。

参考文献

1
1
0

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?