GASのWebアプリは、既存のデプロイを新しいバージョンへ更新すれば、同じURLを維持できます。「新しいデプロイ」で別のデプロイを追加する操作と区別してください。保存だけでは公開済みのコードは更新されません。
同じURLで更新する基本手順
まず自分だけが利用する練習プロジェクトで試します。Code.gsに次のdoGetを保存し、HTMLファイルをindexという名前で追加してください。
function doGet() {
return HtmlService.createHtmlOutputFromFile('index');
}index.htmlの内容は次のとおりです。表示文のversion 1.0は確認用の文字列で、Apps Scriptが管理するバージョン番号とは別です。
<!doctype html>
<html lang="ja">
<head><base target="_top"><meta charset="UTF-8"></head>
<body><h1>Hello world!</h1><p>version 1.0</p></body>
</html>初回だけ「デプロイ」→「新しいデプロイ」でウェブアプリを選び、実行ユーザーとアクセス範囲を自分だけにして公開します。発行された/execのURLとデプロイIDを控え、URLを開いてversion 1.0を確認します。
index.htmlをversion 2.0へ変更して保存します。次に「デプロイ」→「デプロイを管理」で、控えたURLに対応する既存のデプロイを選択し、編集から「新バージョン」を選んで反映します。別の新規デプロイを作ってから戻す必要はありません。
最初に控えた/execのURLを再読み込みし、URLが同じままversion 2.0になることを確認します。複数のデプロイがある場合は、最初に作ったものと決めつけず、利用者が実際に使っているURL・IDのデプロイを更新してください。
更新されないときと元の版へ戻す方法
表示が古い場合は、保存済みか、既存デプロイのバージョンを切り替えたか、開いているURLが対象の/execかを順番に確認します。編集者向けの/devは保存中のコードを試すURLで、公開用の/execと区別してください。アクセス条件の違いを直すために、公開範囲を不用意に広げないでください。
戻す場合は同じデプロイの編集画面で以前の確認済みバージョンを選び、同じURLで表示を確認します。コードの版を戻しても、すでに書き込んだシートなどのデータやスクリプトプロパティまで元に戻るわけではありません。
デプロイのアーカイブとバージョン削除は別の操作
不要なバージョン付きデプロイは「デプロイを管理」でアーカイブします。デプロイの記録自体を削除する操作ではありません。利用中のURLを誤ってアーカイブしないよう、URLと用途を確認してください。
コードの保存バージョンは「プロジェクト履歴」で管理します。公式仕様ではアクティブなデプロイが使っていない版を削除できますが、ライブラリ利用者や復旧のために必要な版は残します。旧エディタへ切り替える手順は使いません。不要か判断できない版は、この更新作業のために削除する必要はありません。
getUrlは最新版を探すAPIではない
ScriptApp.getService().getUrl()はデプロイされたWebアプリのURLを返し、未デプロイならnull、開発モードのWebアプリから実行した場合は開発用URLを返します。複数のデプロイを列挙して最新版を選ぶ保証は公式説明にないため、「最新版への自動転送」には使いません。
function logWebAppUrl() {
const url = ScriptApp.getService().getUrl();
console.log(url === null ? '未デプロイです' : url);
}固定URLでの更新が目的なら、前半の既存デプロイのバージョン切替だけで対応できます。取得したURLをJavaScriptのonclickへ直接埋め込む処理も不要です。
応用:シートで案内先URLを切り替える
別のアプリへ案内する入口ページが必要な場合は、シートのA1からリンク先を読む方法もあります。これは案内先を変える仕組みで、リンク先のアプリのコードを最新版へ更新する仕組みではありません。通常の固定URL更新には不要です。
自分だけが編集できる練習用シートの「シート1」A1へ、自分で確認したscript.google.comの/exec URLを文字列で入力します。次のdoGetは前半のdoGetと置き換え、同じプロジェクトに両方を置かないでください。実行アカウントにシートの閲覧権限が必要です。
function doGet() {
const sheet = SpreadsheetApp.openById('練習用スプレッドシートID').getSheetByName('シート1');
if (!sheet) throw new Error('シート1がありません');
const url = String(sheet.getRange('A1').getValue()).trim();
if (!/^https:\/\/script\.google\.com\/(?:a\/macros\/[a-z0-9.-]+\/s|macros\/s)\/[A-Za-z0-9_-]+\/exec$/i.test(url)) {
throw new Error('A1に確認済みのWebアプリのexec URLを入力してください');
}
const template = HtmlService.createTemplateFromFile('index');
template.targetUrl = url;
return template.evaluate();
}index.htmlも次の内容に置き換えます。通常の印字スクリプトレットでhrefを出力し、リンクを押して遷移します。
<!doctype html>
<html lang="ja">
<head><base target="_top"><meta charset="UTF-8"></head>
<body><a href="<?= targetUrl ?>" target="_top">設定されたアプリを開く</a></body>
</html>このコードを公開バージョンへ反映した後は、A1を変更して入口ページを再読み込みするとリンク先を読み直します。すでに開いているページは自動更新しません。URLの形式検査は相手アプリの安全性や所有者を証明しないため、A1の編集者と実際のリンク先を管理してください。自分自身の入口URLを指定すると入口を繰り返し開くだけになります。
検証範囲と公式資料
2026年10月23日に本文とコードを見直し、公式のデプロイ・バージョン・getUrl仕様を照合しました。案内先URLの検査はローカルで確認しましたが、実Googleの公開更新・ロールバック・シート読取り・リンク遷移・PC/スマホ表示は未確認です。
デプロイの管理、バージョンの管理、Service.getUrlを参照してください。エラーの切り分けはGAS│エラーの意味と対処法にもあります。
GitHubのMOTOKI-LLC/cg-method-codeは旧版の場合があります。今回の例はこのページのコードを使ってください。
以前の画面の参考資料
以下は旧記事の画面例です。旧エディタへの切替や新規デプロイの追加を含む画像は、今回の標準手順ではありません。現在の操作や検証済みの画面として扱わず、上の手順と公式資料を参照してください。











関連するGASの操作




