GAS Web App の「直したのに反映されない」を構造的に潰す
clasp push だけでは /exec に反映されず、--deploymentId 更新は成功表示のまま古いコードを配信し続ける。push→新規デプロイ→認証URL差し替え→疎通確認を1本化する型(PowerShell 5.1 の落とし穴込み)
約3.9万トークンの節約 (API料金換算で約59円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「GAS Web App の「直したのに反映されない」を構造的に潰す」は、Google WorkspaceカテゴリのAI指示書(MDファイル)です。clasp push だけでは /exec に反映されず、--deploymentId 更新は成功表示のまま古いコードを配信し続ける。push→新規デプロイ→認証URL差し替え→疎通確認を1本化する型(PowerShell 5.1 の落とし穴込み)この巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約3.9万トークン(API料金換算で約59円)・87%のトークンを節約できます。
- カテゴリ
- Google Workspace
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約4.5万トークン
- この巻物使用時
- 約6,000トークン
- 節約量
- 約3.9万トークン (約59円)
- 更新日
- 2026-08-25
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/gas-web-app/raw を読み込んで、この指示書どおりに実装して"
中身
Google Apps Script Web App の「直したのに反映されない」を構造的に潰す
前提
- GAS プロジェクトは clasp で管理し、Web App エンドポイントは
https://script.google.com/macros/s/<スクリプトID>/execとする。 - 認証は外部トークン(例: API Gateway で発行)で行い、
ANYONE_ANONYMOUSかつUSER_DEPLOYINGの設定で動作させる。
罠その1 – clasp push の限界
clasp pushは HEAD(ローカルの最新コード) をスクリプトファイルに反映するだけ。- バージョン付きデプロイ(
/execが参照するもの)には自動で反映されない。 - そのため
push後に/execで旧コードが返り続ける。
罠その2 – 既存デプロイの上書きは失敗しやすい
clasp deploy --deploymentId <既存ID>を実行すると、コンソールは
Deployed ... @31と 成功 を表示するが、実際には 古いコードが返り続けた(実測)。- 新規デプロイ (
clasp deployID 指定なし) を作成した瞬間に新コードが配信される。 - 既存デプロイを上書きすると アクセス権がリセット され、401/404 エラーになるケースがある。
罠その3 – 成功判定の誤り
- 「デプロイ成功表示」や「レスポンス長」だけで成功とみなすと偽陽性が多発。
- 正しい判定は 「新しく追加したキー/アクションがレスポンスに含まれるか」 で行う。
- 典型的な症状: 新規アクション呼び出しが
Unknown actionを返し続ける。
解決策 – 「push → 新規デプロイ → 認証情報 URL 差し替え → 疎通確認」を自動化
clasp pushでローカルコードを HEAD に反映。clasp deployで 新規デプロイ を作成し、取得した デプロイ ID と Web App URL を取得。tools/.gas-credentials.json(形式{ "url": "...", "token": "..." })のurlを新しい URL に上書き。Invoke‑RestMethodで 新規アクション(例:getStatus)を呼び、期待キーが返るか確認。- 成功したら 1 行だけ 「✅ Deploy succeeded」と出力し、以降はそのスクリプトだけを実行。
必須設定 – appsscript.json
{
"timeZone": "Asia/Tokyo",
"exceptionLogging": "STACKDRIVER",
"webapp": {
"executeAs": "USER_DEPLOYING",
"access": "ANYONE_ANONYMOUS"
}
}
- 上記をプロジェクトに入れておけば、新規デプロイ時に追加設定は不要。
Windows PowerShell 実装時の落とし穴
| 項目 | 注意点 |
|---|---|
| ファイルエンコーディング | .ps1 は UTF‑8 BOM 付きで保存。BOM なしで日本語コメントを入れると Unexpected token '}' エラーになる。 |
param() の位置 | スクリプトの 最初の文 に置く必要がある。 |
| リダイレクト | ネイティブコマンドに 2>&1 を付けると NativeCommandError になり、exit 0 でも失敗扱いになる。 |
| 配列判定 | $pushResult -notmatch 'Pushed' は配列に対して フィルタ結果(非空=真) を返す。正しくは (($pushResult) -join "n") -notmatch 'Pushed'`。 |
$matches 変数 | 自動変数なので上書きしない。 |
| 302 リダイレクト | /exec は 302 を返すため Invoke‑RestMethod … -MaximumRedirection 5 が必須。 |
| ボディエンコード | 日本語文字化け防止のため [System.Text.Encoding]::UTF8.GetBytes($jsonBody) でバイナリ渡し。 |
| 論理演算子 | && は使用不可。; と if で代替する。 |
完成例 – tools/gasdeploy.ps1
<#
.SYNOPSIS
GAS の push → 新規デプロイ → 認証情報書き換え → 疎通確認 を一括実行
.PARAMETER Description
デプロイ時の説明文(任意)。省略すると "Auto deploy $(Get-Date -Format o)" になる。
.PARAMETER SkipPush
$true にすると clasp push をスキップ。デバッグ時に利用。
#>
param(
[string]$Description = "Auto deploy $(Get-Date -Format o)",
[switch]$SkipPush
)
# --- 定数・パス ---
$repoRoot = Split-Path -Parent $MyInvocation.MyCommand.Path | Resolve-Path -Relative
$credPath = Join-Path $repoRoot "tools/.gas-credentials.json"
$pushResult = $null
$newDeployId = $null
$newUrl = $null
# --- 1. clasp push (任意) ---
if (-not $SkipPush) {
Write-Host "▶ clasp push ..."
$pushResult = clasp push 2>&1
$joined = ($pushResult | Out-String)
if ($joined -notmatch 'Pushed') {
Write-Error "clasp push に失敗: $joined"
exit 1
}
Write-Host "✅ push 完了"
} else {
Write-Host "⚠ SkipPush 指定: push を省略"
}
# --- 2. 新規デプロイ ---
Write-Host "▶ clasp deploy (新規) ..."
$deployOut = clasp deploy -d "$Description" 2>&1
$joinedDeploy = ($deployOut | Out-String)
if ($joinedDeploy -notmatch 'Deployed') {
Write-Error "clasp deploy に失敗: $joinedDeploy"
exit 1
}
# 例: "Deployed as version 42 (deploymentId: <デプロイID>)"
if ($joinedDeploy -match 'deploymentId:\s*([^\s)]+)') {
$newDeployId = $matches[1]
} else {
Write-Error "deploymentId が取得できません: $joinedDeploy"
exit 1
}
if ($joinedDeploy -match 'https://script.google.com/macros/s/([^/]+)/exec') {
$newUrl = "https://script.google.com/macros/s/$($matches[1])/exec"
} else {
Write-Error "Web App URL が取得できません"
exit 1
}
Write-Host "✅ 新規デプロイ ID: $newDeployId"
Write-Host "✅ 新 Web App URL: $newUrl"
# --- 3. 認証情報 JSON のバックアップと書き換え ---
if (-Not (Test-Path $credPath)) {
Write-Error "認証情報ファイルが見つかりません: $credPath"
exit 1
}
$backupPath = "$credPath.bak_$(Get-Date -Format 'yyyyMMddHHmmss')"
Copy-Item -Path $credPath -Destination $backupPath -Force
Write-Host "🔄 認証情報バックアップ: $backupPath"
$credJson = Get-Content -Path $credPath -Raw | ConvertFrom-Json
$credJson.url = $newUrl
$credJson | ConvertTo-Json -Depth 10 | Set-Content -Path $credPath -Encoding UTF8
Write-Host "✅ 認証情報 URL を更新"
# --- 4. 疎通確認(新規アクション getStatus) ---
$testAction = @{ action = "getStatus" } | ConvertTo-Json -Compress
$bodyBytes = [System.Text.Encoding]::UTF8.GetBytes($testAction)
Write-Host "▶ 疎通確認 (getStatus) ..."
try {
$response = Invoke-RestMethod -Method Post `
-Uri $newUrl `
-Headers @{ "Authorization" = "Bearer $($credJson.token)" } `
-Body $bodyBytes `
-ContentType "application/json; charset=utf-8" `
-MaximumRedirection 5 `
-ErrorAction Stop
} catch {
Write-Error "疎通確認に失敗: $_"
exit 1
}
if ($response -and $response.status -eq "ok") {
Write-Host "✅ Deploy succeeded"
exit 0
} else {
Write-Error "期待キーがレスポンスに無い: $($response | ConvertTo-Json -Compress)"
exit 1
}
完了前のチェックリスト
-
clasp pushが成功し、Pushedが出力に含まれる。 -
clasp deployが新規デプロイを作成し、deploymentId と Web App URL が取得できている。 -
tools/.gas-credentials.jsonのバックアップが作成され、urlが新 URL に書き換わっている。 -
Invoke‑RestMethodが 302 リダイレクトを追従し、UTF‑8 バイト列でボディを送信できている。 -
getStatus(または任意の新規アクション)から期待キーstatus: "ok"が返ってくる。 - スクリプト実行後、コンソールに 「✅ Deploy succeeded」 が 1 行だけ表示される。
- 失敗した場合は
Errorメッセージが出力され、スクリプトは非 0 終了コードで終了する。
よくある質問
+「GAS Web App の「直したのに反映されない」を構造的に潰す」とは何ですか?
clasp push だけでは /exec に反映されず、--deploymentId 更新は成功表示のまま古いコードを配信し続ける。push→新規デプロイ→認証URL差し替え→疎通確認を1本化する型(PowerShell 5.1 の落とし穴込み)
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約4.5万トークンかかりますが、この巻物を使えば約6,000トークンで済みます。差し引き約3.9万トークン(API料金換算で約59円)・87%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
GAS完全自動化テンプレ — Driveコマンドキュー方式
Google Apps Script の「毎回エディタで▶実行」を根絶。Drive 経由のコマンドキューで、初回1クリック以降は AI がすべての GAS 関数をリモート実行できるようになるテンプレート指示書。
人間の手入力台帳を壊さずに自動更新する — GAS Web App upsert 設計
各PC/各拠点の点検結果を、人間が手運用しているスプレッドシート台帳へ自動反映する。手入力列とコメントを絶対に壊さない突合設計、タブ/列の解決、並行POST対策、配布シークレットの落とし穴まで。
数式まみれの業務スプレッドシートを、Webアプリから壊さずに編集させる型
ArrayFormula と per-row 数式が混在する台帳を、セル単位 allowlist・dry-run 既定・適用前バックアップ・触っていないセルの数式不変検査で安全に書き換える設計手順。列ごとの数式復元と、テストが緑のまま壊れる典型例つき。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア