お悩み女子GASで作ったツールを同僚にも使ってもらいたい。でも、Webアプリにして社外の人まで開けるようになったら怖い……
GASのWebアプリ化とはスクリプトにURLを持たせて、ブラウザから開けるようにすることです。doGetという関数を用意して公開すると、同僚にスプレッドシートの操作を覚えてもらわなくても、ブラウザの画面から使ってもらえます。
doGetでWebアプリを公開する手順と、社外に公開してしまう事故を防ぐ公開範囲の決め方を紹介します。HTML Serviceで簡単な画面を作る方法も合わせて扱います。公式ドキュメントの内容は2026年10月時点のものです。コードはApps Scriptの上では動かしていません。Node.jsの代用オブジェクトで、関数の戻り値と成功・失敗時の文字列の受け渡しだけを確認しています。実際の画面表示、認証、デプロイは未確認です。
- doGetの役割と、URLのパラメータの受け取り方
- 「アクセスできるユーザー」と「実行するユーザー」の意味と、安全な組み合わせ
- テスト用と公開用のデプロイの違い、更新の手順
- HTML Serviceで簡単な画面を作る方法
- 公開前に確かめるチェックリスト
GASのWebアプリ化とdoGetの役割
Webアプリとして公開できる条件は、公式ドキュメントに2つ書かれています。URLのパラメータの受け取り方と合わせて見ます。
公開できる2つの条件
公式によると、スクリプトをWebアプリとして公開するには、doGet関数またはdoPost関数があり、その関数がHTML ServiceのHtmlOutputか、Content ServiceのTextOutputを返す必要があります。ブラウザでURLを開いたときはdoGetが、プログラムからPOSTで送られたときはdoPostが動きます。
URLのパラメータを受け取る
URLの末尾に ?name=山田 のように付けた値は、doGetの引数 e のe.parameterで受け取れます。次の例は名前を受け取って挨拶を返します。
function doGet(e) {
const name = e.parameter.name || 'ゲスト';
return ContentService.createTextOutput('こんにちは、' + name + 'さん');
}
代用の環境では?name=山田 のときは「こんにちは、山田さん」、パラメータなしのときは「こんにちは、ゲストさん」を返しました。
GASのWebアプリの権限|アクセスできるユーザーと実行するユーザー
公開範囲の設定は「誰が開けるか」と「誰の権限で動くか」の2つです。公式のマニフェストでは access と executeAs という名前で、決まった値が定められています。
アクセスできるユーザー(access)
| 値 | 公式の説明 | 開ける人 |
|---|---|---|
| MYSELF | デプロイするユーザーのみが実行できる | 自分だけ |
| DOMAIN | デプロイするユーザーと同じドメインのユーザーのみが実行できる | 同じ会社(Google Workspaceのドメイン)の人 |
| ANYONE | ログインしているすべてのユーザー | Googleアカウントでログインした人なら、社外の人も含めて誰でも |
| ANYONE_ANONYMOUS | ログインしていないユーザーを含むすべてのユーザー | URLを知っていれば誰でも |
表のうち、社外の人が開けるのはANYONEとANYONE_ANONYMOUSの2つです。この2つを選ぶのは、誰に見られてもよいページだけにします。
実行するユーザー(executeAs)
USER_DEPLOYINGはデプロイした人の権限で動かす設定です。公式によると、誰が開いても、常にスクリプトの持ち主として動きます。USER_ACCESSINGは開いた人本人の権限で動かす設定です。後者では、ユーザーが承認するとき、スクリプトの持ち主のメールアドレスが表示されると説明されています。
持ち主の権限で動かすと、開いた人にシートを見る権限がなくても、スクリプトはシートを読めます。便利な反面、アクセスできる人を広げるほど、自分の権限を広く貸すことになります。
安全な組み合わせの選び方
| アクセスできるユーザー | 実行するユーザー | 向いている場面と注意 |
|---|---|---|
| DOMAIN | USER_ACCESSING | 社内で共有する画面。開いた人本人の権限で動く |
| DOMAIN | USER_DEPLOYING | シートの権限がない同僚にも使わせたいとき。社内の全員が自分の権限でスクリプトを動かせる。返すデータは社内に見せてよいものだけにする |
| ANYONE / ANYONE_ANONYMOUS | USER_DEPLOYING | 公開用の画面。社外の人が、自分の権限でスクリプトを動かせる。個人情報や社内データは返さない |
筆者なら、社内向けはまずDOMAIN と USER_ACCESSING の組み合わせから始めます。開いた人本人の権限で動く、という公式の説明にもとづく選び方です。DOMAIN は「同じドメインのユーザー」を指すので、会社のGoogle Workspaceのアカウントで作る場合の選択肢です。
この設定はプロジェクトの appsscript.json にある webapp という項目に、次の形で書かれます。デプロイ画面の日本語の項目名は確かめていないので、この記事では公式の値の名前で説明しています。
{
"webapp": {
"executeAs": "USER_ACCESSING",
"access": "DOMAIN"
}
}
「自分として実行」のときの注意
公式のSessionクラスの説明によると、「自分として実行」でデプロイしたWebアプリでは、アクセスした人のメールアドレスを、getActiveUser から取れません。開発者本人が実行する場合や、同じGoogle Workspaceドメインのユーザーには、この制限は通常当てはまらないとも書かれています。
GASのWebアプリのデプロイ|テスト用と公開用
デプロイには、テスト用と公開用があります。公式の手順に沿って、順に進めます。
① テスト用URLで動かす
エディタ右上の[デプロイ]>[テスト](英語表示では Deploy > Test deployments)で、種類にウェブアプリを選び、表示されたURLをブラウザに貼ります。公式によると、このURLは /dev で終わり、スクリプトの編集権限を持つ人だけが開けます。いつも最後に保存したコードで動くので、開発中のテスト専用です。
② 新しいデプロイで公開する
- エディタ右上の[デプロイ]>[新しいデプロイ]をクリックする
- [種類の選択]の横の歯車から、[ウェブアプリ]を選ぶ
- [デプロイ構成]の欄に、説明と、実行するユーザー・アクセスできるユーザーを入れる
- [デプロイ]をクリックする
- アクセス権を渡した相手に、表示されたURLを共有する
公式は一般に公開するときはバージョン付きのデプロイを使うよう説明しています。テスト用の /dev のURLを、同僚に配る用途には使いません。初回の承認で止まったら、許可が必要なサービスと、組織の管理者が制限していないかを確認します。許可されないアカウントのために、公開範囲を全員へ広げないようにします。
③ 更新と古いデプロイの整理
コードを直したあとは、新しいバージョンを作り、既存のデプロイを編集して、そのバージョンに切り替えます。公式はこれがURLやデプロイIDを変えずにアプリを更新する標準の方法だと説明しています。
「新しいデプロイ」を作るたびに、別のURLが増えます。この点が事故のもとになります。公式によると、有効なバージョン付きデプロイは同時に複数持てて、削除はできず、アーカイブだけできます。公開範囲を絞り直したつもりでも、古いデプロイが有効なまま残っていれば、そのURLは古い設定で開ける可能性があります。[デプロイ]>[デプロイを管理]で一覧を開き、使わないものはアーカイブします。
GASのWebアプリの画面|HTML Serviceと非同期通信
HTML ServiceではHTMLファイルをブラウザへ返すことができます。最初は共有シートを読まず、固定の文字を返すだけの接続テストにすると、権限とデータ取得の問題を分けて確認できます。
HTMLを返すサーバー側の関数
Code.gsには次の関数を置きます。ここまでの挨拶用doGetを試したプロジェクトでは、doGetを2つ残さず差し替えます。同じ名前の関数を併記すると、どちらが使われるか分かりにくくなります。
function doGet() {
return HtmlService.createHtmlOutputFromFile('Index')
.setTitle('接続テスト');
}
function getMessage() {
return '接続できました';
}
createHtmlOutputFromFileのIndexは、次に作るHTMLファイルの名前です。getMessageは固定の文字列を返すだけで、スプレッドシートのIDやAPIキーは不要です。
成功と失敗を受け取る画面
HTMLファイルを追加し、名前をIndexにします。入力は次の例です。google.script.runは非同期なので、呼び出し直後の行で結果を読まず、成功時の関数で表示を変えます。
<!DOCTYPE html>
<html>
<head><base target="_top"></head>
<body>
<p id="message">読み込み中です</p>
<script>
google.script.run
.withSuccessHandler(function (text) {
document.getElementById('message').textContent = text;
})
.withFailureHandler(function () {
document.getElementById('message').textContent = '読み込めませんでした';
})
.getMessage();
</script>
</body>
</html>
成功はwithSuccessHandler、失敗はwithFailureHandlerで受け取ります。Node.jsの代用環境で確認した文字列は次の2つです。GAS上の実行結果ではありません。
成功時: 接続できました
失敗時: 読み込めませんでした
画面を付けても残る権限の注意
画面にボタンを置いていない関数でも、サーバー側で何が呼べるかを考えます。公式には、名前がアンダースコアで終わる関数はgoogle.script.runから呼べないとあります。ただし、末尾に_を付けることだけでアクセス制御全体が完了するわけではありません。
業務データを返すときは、呼び出す人にそのデータを見せてよいかをサーバー側でも確認します。画面で非表示にするだけでは、返してしまったデータの保護にはなりません。最初の公開テストには個人情報の入っていない専用データを使います。
なべくん固定の文字が返るところまで確かめてから、業務データの読み取りを足します。
GASのWebアプリの公開前チェックリスト
公開範囲を決めたら、URLを配る前に、次の項目を確かめます。
| 確かめること | 理由 |
|---|---|
| アクセスできるユーザーが、必要な範囲より広くなっていない | 社外の人が開けるのは ANYONE と ANYONE_ANONYMOUS |
| 「全員」にする場合、返すデータに個人情報や社内情報がない | 自分として実行すると、自分の権限で読んだ内容を返せてしまう |
| 自分として実行するとき、スクリプトが触れるシート・ドライブ・メールの範囲が最小になっている | 公開関数が、必要以上のデータを扱わないかを確認する |
| URLのパラメータを、そのまま検索や書き込みに使っていない | URLの値は、誰でも書き換えられる |
| 画面から呼ばせたくない関数の末尾に _ が付いている | 画面から呼べるトップレベル関数を確認し、必要な認可も行う |
| 使わない古いデプロイがアーカイブされている | デプロイごとに別のURLと設定が残る |
| 公開後に、別のアカウントと、ログインしていない状態で開いて確かめた | 設定どおりに制限されているかを、自分の目で確かめる |
誰が開けるかは設定で決め、別のアカウントで開いて確かめる。設定の指定と、実際に開ける範囲の両方を確認します。コードが返すデータや認可も別に点検します。最後の項目は公式の手順ではなく、筆者が勧める確認方法です。
GASのWebアプリ|よくある質問
Webアプリの公開について、よくある疑問をまとめました。
- Webアプリにすると、社外の人にも見られてしまいますか?
-
アクセスできるユーザーの設定しだいです。社外の人が開けるのは、ANYONE(ログインしているすべてのユーザー)と、ANYONE_ANONYMOUS(ログインしていない人を含む全員)です。MYSELF と DOMAIN なら、自分か同じドメインの人に限られます。
- URLを知らなければ、他の人に開かれませんか?
-
公式はURLを共有する相手を、アクセス権を渡したユーザーとして説明しています。URLを秘密にすることだけに頼らず、アクセスできるユーザーの設定で絞ります。
GASのWebアプリの公開範囲と別アカウントでの確認
GASのWebアプリ化で押さえる点を整理します。
公開の条件:doGetまたはdoPostがあり、HtmlOutputかTextOutputを返す。URLのパラメータは e.parameter で受け取る
公開範囲:access(MYSELF・DOMAIN・ANYONE・ANYONE_ANONYMOUS)と executeAs(USER_ACCESSING・USER_DEPLOYING)の2つ。社外に開くのは ANYONE と ANYONE_ANONYMOUS
デプロイ:テスト用は /dev。公開用はバージョン付きで、更新は新バージョンに切り替える。古いデプロイはアーカイブする
画面:HTML ServiceのIndexファイルと google.script.run。固定文の表示から試し、成功・失敗を分ける。公開関数の認可も確認する
最初は、自分だけが開ける設定と、テスト用のURLで画面を作り、動きを確かめてから公開範囲を広げていくのが近道です。
関連する話題は次の記事でも扱っています。
参考資料
ウェブアプリ | Apps Script
デプロイの作成と管理 | Apps Script
ウェブアプリのマニフェスト | Apps Script
HTML Service | Apps Script
HTML Serviceとサーバー通信 | Apps Script
