Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 102 additions & 0 deletions .github/workflows/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# GitHub Actions セットアップ手順

## 概要

mainブランチにマージすると自動的にGoogle Apps Scriptにデプロイされます。

## セットアップ手順

### 1. サービスアカウントの作成

1. [Google Cloud Console](https://console.cloud.google.com/)を開く
2. プロジェクトを選択(既存のGASプロジェクトに紐づくGCPプロジェクト)
3. 「IAMと管理」→「サービスアカウント」
4. 「サービスアカウントを作成」
- 名前: `github-actions-deployer`(任意)
- 説明: GitHub ActionsからGASをデプロイするためのアカウント
5. 「完了」をクリック
6. 作成したサービスアカウントをクリック
7. 「キー」タブ→「鍵を追加」→「新しい鍵を作成」
8. 形式: JSON を選択→「作成」
9. ダウンロードされたJSONファイルを保存

### 2. Apps Script APIの有効化

1. [Google Cloud Console](https://console.cloud.google.com/)
2. 「APIとサービス」→「ライブラリ」
3. "Apps Script API" を検索
4. 「有効にする」をクリック

### 3. サービスアカウントに権限を付与

#### 方法A: GASプロジェクトにサービスアカウントを追加

1. GASエディタを開く
2. 右上の「共有」をクリック
3. サービスアカウントのメールアドレスを追加(編集者権限)

#### 方法B: `.clasprc.json`を使用(簡易版)

ローカルで`clasp login`した際に作成された`~/.clasprc.json`を使用します。

```bash
cat ~/.clasprc.json
```

内容をコピーしてGitHub Secretsに設定します。

### 4. GitHub Secretsの設定

1. GitHubリポジトリページを開く
2. 「Settings」→「Secrets and variables」→「Actions」
3. 「New repository secret」をクリック

#### サービスアカウント方式の場合
- Name: `GCP_SA_KEY`
- Secret: ダウンロードしたJSONファイルの内容全体

#### OAuth方式の場合(簡易版・推奨)
- Name: `CLASPRC_JSON`
- Secret: `~/.clasprc.json`の内容全体

### 5. .clasp.jsonの確認

`.clasp.json`がリポジトリにコミットされていることを確認:

```json
{
"scriptId": "your-script-id-here",
"rootDir": "./dist"
}
```

**注意:** `scriptId`は公開しても問題ありませんが、気になる場合はSecrets化も可能です。

### 6. デプロイのテスト

1. 新しいブランチを作成
2. コードを変更してコミット
3. mainブランチにPRを作成
4. マージすると自動デプロイが実行される

## トラブルシューティング

### デプロイが失敗する場合

1. **認証エラー**: `CLASPRC_JSON`の内容が正しいか確認
2. **ビルドエラー**: ローカルで`npm run build`が成功するか確認
3. **Script ID不正**: `.clasp.json`の`scriptId`が正しいか確認

### トークンの期限切れ

OAuth方式の場合、トークンが期限切れになったら:

1. ローカルで`clasp login`を再実行
2. 新しい`~/.clasprc.json`をGitHub Secretsに再設定

## セキュリティ上の注意

- ✅ `.clasprc.json`は`.gitignore`に追加済み
- ✅ GitHub Secretsは暗号化されて保存される
- ✅ Secretsはログに出力されない
- ⚠️ サービスアカウントキーは厳重に管理する
43 changes: 43 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Deploy to Google Apps Script

on:
push:
branches:
- main
workflow_dispatch:

jobs:
deploy:
runs-on: ubuntu-latest
timeout-minutes: 10

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Build TypeScript
run: npm run build

- name: Setup clasp credentials
env:
CLASPRC_JSON: ${{ secrets.CLASPRC_JSON }}
run: |
echo "$CLASPRC_JSON" > ~/.clasprc.json

- name: Deploy to GAS
run: npm run push

- name: Notify deployment success
if: success()
run: |
echo "✅ Deployment to GAS succeeded!"
echo "Script ID: $(jq -r '.scriptId' .clasp.json)"
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
node_modules/
dist/
.clasp.json
.clasprc.json
*.log
.DS_Store
81 changes: 81 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# expression-upload-notify

Google Apps ScriptプロジェクトをTypeScript + esbuildで開発

## 構成

```
expression-upload-notify/
├── .github/
│ └── workflows/
│ ├── deploy.yml # 自動デプロイ設定
│ └── README.md # セットアップ手順
├── dist/ # ビルド出力先(GASにプッシュされる)
│ ├── appsscript.json
│ └── main.js
├── src/ # TypeScriptソースコード
│ ├── App.ts
│ └── main.ts
├── esbuild.js # ビルド設定
├── package.json
└── tsconfig.json
```

## ローカル開発

### セットアップ

```bash
# 依存関係のインストール
npm install

# claspでログイン
npx clasp login

# 既存プロジェクトの場合: .clasp.jsonを作成
# {
# "scriptId": "your-script-id",
# "rootDir": "./dist"
# }

# または新規作成
npx clasp create --type sheets --title "expression-upload-notify"
```

### コマンド

- `npm run build` - TypeScriptをビルド(esbuildでバンドル&ミニファイ)
- `npm run push` - distフォルダの内容をGASにプッシュ
- `npm run deploy` - ビルド→プッシュを一括実行
- `npm run open` - ブラウザでGASエディタを開く

### 開発フロー

1. `src/App.ts`や他のTSファイルでコードを編集
2. `npm run deploy`でビルド&GASに反映
3. `npm run open`でGASエディタを開く
4. GASエディタで`App`関数を実行して動作確認

## CI/CD(自動デプロイ)

mainブランチにマージすると自動的にGASにデプロイされます。

### セットアップ手順

詳細は [.github/workflows/README.md](.github/workflows/README.md) を参照してください。

**簡易版(推奨):**
1. ローカルで`clasp login`実行
2. `~/.clasprc.json`の内容をコピー
3. GitHubリポジトリの「Settings」→「Secrets」で`CLASPRC_JSON`として登録
4. mainにマージすると自動デプロイ

## 特徴

- ✅ TypeScriptで型安全な開発
- ✅ esbuildで複数ファイルを1つにバンドル
- ✅ ミニファイで最適化
- ✅ import/exportでファイル分割可能
- ✅ GitHub Actionsで自動デプロイ


16 changes: 16 additions & 0 deletions esbuild.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
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('ビルドに失敗しました')
console.error(error);
process.exit(1);
});
Loading