マキモノ
Google Workspace無料✅ 公式検証済みv1.0.0 / 更新

GAS Web App の「直したのに反映されない」を構造的に潰す

clasp push だけでは /exec に反映されず、--deploymentId 更新は成功表示のまま古いコードを配信し続ける。push→新規デプロイ→認証URL差し替え→疎通確認を1本化する型(PowerShell 5.1 の落とし穴込み)

出品者: seisaku-team@orgiast.jp6 DL📖 読込 約3,055トークン (約5円)💰 コスパ 13
トークン節約メーター87%節約
ゼロからAIに作らせた場合4.5万トークン
このMDを読ませた場合6,000トークン

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 のターミナルに貼るだけです。

⬇ .md をダウンロード
claude "https://makimono-md.vercel.app/api/v1/files/gas-web-app/raw を読み込んで、この指示書どおりに実装して"
claude-codecursorcodex-cliライセンス: 商用利用可 (再販不可)

中身

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 pushHEAD(ローカルの最新コード) をスクリプトファイルに反映するだけ。
  • バージョン付きデプロイ(/exec が参照するもの)には自動で反映されない。
  • そのため push 後に /exec で旧コードが返り続ける

罠その2 – 既存デプロイの上書きは失敗しやすい

  • clasp deploy --deploymentId <既存ID> を実行すると、コンソールは
    Deployed ... @31成功 を表示するが、実際には 古いコードが返り続けた(実測)。
  • 新規デプロイ (clasp deploy ID 指定なし) を作成した瞬間に新コードが配信される。
  • 既存デプロイを上書きすると アクセス権がリセット され、401/404 エラーになるケースがある。

罠その3 – 成功判定の誤り

  • 「デプロイ成功表示」や「レスポンス長」だけで成功とみなすと偽陽性が多発。
  • 正しい判定は 「新しく追加したキー/アクションがレスポンスに含まれるか」 で行う。
  • 典型的な症状: 新規アクション呼び出しが Unknown action を返し続ける。

解決策 – 「push → 新規デプロイ → 認証情報 URL 差し替え → 疎通確認」を自動化

  1. clasp push でローカルコードを HEAD に反映。
  2. clasp deploy新規デプロイ を作成し、取得した デプロイ IDWeb App URL を取得。
  3. tools/.gas-credentials.json(形式 { "url": "...", "token": "..." })の url を新しい URL に上書き。
  4. Invoke‑RestMethod新規アクション(例: getStatus)を呼び、期待キーが返るか確認。
  5. 成功したら 1 行だけ 「✅ Deploy succeeded」と出力し、以降はそのスクリプトだけを実行。

必須設定 – appsscript.json

{
  "timeZone": "Asia/Tokyo",
  "exceptionLogging": "STACKDRIVER",
  "webapp": {
    "executeAs": "USER_DEPLOYING",
    "access": "ANYONE_ANONYMOUS"
  }
}
  • 上記をプロジェクトに入れておけば、新規デプロイ時に追加設定は不要。

Windows PowerShell 実装時の落とし穴

項目注意点
ファイルエンコーディング.ps1UTF‑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 が新規デプロイを作成し、deploymentIdWeb 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で頼むだけで、仕事が完成」。

AI代行堂を見る →

関連する巻物

この巻物、誰かのトークンも救えます

𝕏 で節約レシートをシェア