こんにちは、勤務の合間にコツコツGASを書いている現役ナースの凛です。
いきなり結論から書きます。GASのスクリプトを「URLを送るだけで家族や同僚に使ってもらえる形」にするには、doGet という名前の関数を書いて、エディタ右上の「デプロイ」ボタンからウェブアプリとして公開する。やることは本当にこれだけです。サーバーの契約も、ドメインの取得も、お金も要りません。
「コードは見せたくないけどツールは使ってほしい」という場面、ありますよね。私も最初は「Webアプリを公開する」という響きだけで身構えていましたが、実際にやってみたら拍子抜けするほど簡単でした。ただし、ひとつだけ大きな罠があります。更新のたびにURLが変わってしまう罠です。これで以前配ったリンクが全部死んで泣いたことがあるので、その回避法まで含めて順に説明します。
まずは公開までの5ステップ
理屈はあとにして、先に手だけ動かしましょう。
Step 1: doGet 関数を書く
function doGet(e) {
return ContentService
.createTextOutput('Hello, World!')
.setMimeType(ContentService.MimeType.TEXT);
}
doGet(e) という関数名は予約済みです。WebアプリのURLにGETリクエストが来ると、GASがこの関数を自動的に呼び出します。関数名を自分で決める必要はなく、というより決めてはいけません。この名前だから動く仕組みです。
Step 2: HTMLを返したい場合
テキストではなく、ちゃんとした画面を見せたいときはこちら。
function doGet(e) {
return HtmlService.createHtmlOutputFromFile('index')
.setTitle('My GAS App');
}
HtmlService.createHtmlOutputFromFile('index') は、GASエディタで作った index.html を読み込みます(メニュー → ファイル → HTML)。エディタ内にHTMLファイルを持てること自体、意外と知られていない気がします。
Step 3: doPost でデータ受信
外から「データを送りつけてもらう」側の玄関がこちらです。
function doPost(e) {
const data = JSON.parse(e.postData.contents);
// dataを処理...
return ContentService
.createTextOutput(JSON.stringify({success: true}))
.setMimeType(ContentService.MimeType.JSON);
}
外部からPOSTリクエストでデータを送信できるようになります。フォーム送信の受け口や、Slack/LINE Webhookの受信に使う入り口です。表示だけならStep 2まで、受信までやるならこのStep 3までを書きます。
Step 4: デプロイ実行
GASエディタ右上の「デプロイ」→「新しいデプロイ」をクリックします。
設定する場所は4箇所だけ。種類は「ウェブアプリ」、説明は「v1.0」など任意の文字列、「次のユーザーとして実行」は「自分」(推奨)、「アクセスできるユーザー」は「全員」または「Googleアカウントを持つ全員」を選びます。
「デプロイ」をクリックすると、WebアプリのURLが発行されます。この瞬間、あなたのスクリプトはもうインターネット上のアプリです。
Step 5: 動作確認
発行されたURL(https://script.google.com/macros/s/XXXX/exec)をシークレットウィンドウで開いて動作確認します。自分の普段のブラウザだと、ログイン済み・キャッシュありの状態でアクセスすることになり、実際のユーザーが見る画面と違うことがあるからです。
ここまでで公開は完了。慣れれば15分かかりません。
なぜこの書き方なのか
手順だけ真似ても動きますが、仕組みを知っておくと応用が一気に楽になります。構造はこうです。
ユーザー → URL → GAS の doGet/doPost → HTML or JSON 返却
GASをWebアプリ化すると、Webサーバー不要・完全無料で動的なURLを発行できます。何を返すかは用途で変わります。
| 用途 | doGet で返すもの |
|---|---|
| 単純な情報表示 | HTMLサービスでHTML |
| 簡易API | ContentService でJSON |
| データ送信受付 | doPost で受信 |
| 動的ダッシュボード | HTML+JS+APIサービス |
単純な表示ならHTML、プログラム同士のやり取りならJSON、受け取る側に回るならdoPost。この対応表さえ頭に入れば、あとは組み合わせです。
URLパラメータを受けると「動的なページ」になる
function doGet(e) {
const name = e.parameter.name || 'ゲスト';
const html = `<h1>こんにちは、${name}さん</h1>`;
return HtmlService.createHtmlOutput(html);
}
URLに ?name=凛 を付けてアクセスすると、「こんにちは、凛さん」と表示されます。パラメータ次第で表示が変わる、簡易な動的ページのできあがりです。アクセスする人ごとに内容を出し分けたいとき、まずこの形から始めるとイメージがつかみやすいと思います。
doPost は外部通知の受け口として最強
function doPost(e) {
const params = JSON.parse(e.postData.contents);
const sheet = SpreadsheetApp.openById('XXX').getActiveSheet();
sheet.appendRow([new Date(), params.name, params.message]);
return ContentService.createTextOutput('OK');
}
送られてきたデータをそのままスプレッドシートに追記する形です。LINE Bot・Slack・各種Webhookの受け口として、私はこの形を一番よく使っています。「外部サービスからの通知を、無料で、自分のスプシに貯める」が実現できるのは地味にすごいことだと思うんです。
アクセス権限は3パターンから選ぶ
| 設定 | 用途 |
|---|---|
| 自分のみ | 個人用ツール、テスト中 |
| Googleアカウントを持つ全員 | 社内ツール、特定グループ |
| 全員(匿名アクセス可) | 完全公開Webアプリ、Webhook受け口 |
迷ったら、テスト中は「自分のみ」、人に配る段階で用途に応じて広げる、の順で考えれば大丈夫です。
「次のユーザーとして実行」のほうは通常「自分」のままでOK。GASからGoogleサービス(スプシ・Gmail等)にアクセスする際、自分の権限で動いてくれます。ここを「アクセスしているユーザー」に変えるのは、相手の権限で動かしたい特殊なケースだけです。
設定値はスクリプトプロパティへ
WebアプリにAPIキーやメールアドレスなどの設定値をハードコードするのは避けましょう。スクリプトプロパティに保存しておくと、コードを変更せずに設定だけ変えられます。また、コードをGitHubなどで公開するときに秘密情報が漏れるリスクも防げます。公開前提のWebアプリだからこそ、この習慣は最初からつけておきたいところです。
ハマりどころ(私が実際に踏んだ順)
最大の罠:再デプロイでURLが変わる
「新しいデプロイ」を毎回作ると、URLが毎回変わります。 これで以前のリンクが全部切れて泣いた経験、冒頭に書いたとおり私にもあります。LINEやSlackに貼ったWebhook URLが突然動かなくなる最大の原因もこれです。
対策はシンプル。2回目以降は「デプロイの管理」から「新しいバージョン」を作ることです。これならURL不変のまま、中身だけ更新されます。
新しいデプロイ ❌ → URLが新規発行される(旧URLは古い内容のまま)
新しいバージョン ✅ → 同じURLで内容だけ更新
厄介なのは、旧URLが「エラーになる」のではなく「古い内容のまま動き続ける」ことです。壊れてくれたほうがまだ気づけるのに、一見動いているせいで発見が遅れます。更新のたびに「デプロイの管理」を開く。この習慣だけは最初に体に入れてください。
Script function not found: doGet と言われる
doGet関数が定義されていないか、関数名のスペルが違うケースがほとんどです。function doGet(e) というシグネチャが完全に正しいか、同じプロジェクトの.gsファイルに書かれているかを確認してください。大文字小文字も区別されるので、doget や DoGet では認識されません。
URLにアクセスすると「許可が必要」と出る
「アクセスできるユーザー」が「自分のみ」になっている可能性が高いです。デプロイ管理から設定を変更しましょう。
ここで効いてくるのが、Step 5で触れたシークレットウィンドウでの確認です。自分のブラウザで開くと自分のGoogleアカウントでログイン済みの状態になるため、権限設定のミスに気づけません。「全員」にしたつもりなのに権限エラーが出て、使ってもらう相手から報告されて初めて気づく——このパターン、本当によくあります。公開したらシークレットウィンドウで最終確認、を必ずセットにしてください。
スプシ書き込みでエラーになる
「次のユーザーとして実行」を「アクセスしているユーザー」に設定していると、そのユーザーがスプシの編集権限を持っていない場合にこけます。基本的に「自分」のまま使うことをおすすめします。相手に権限を配って回るより、自分の権限で動かすほうが運用はずっと楽です。
設定に迷ったらこの表
| 設定項目 | おすすめ値 | 理由 |
|---|---|---|
| 次のユーザーとして実行 | 自分 | Googleサービスへのアクセス権を確保 |
| アクセスできるユーザー | 用途に応じて | 公開ツールなら「全員」 |
| デプロイ更新方法 | 新しいバージョン | URLを変えずに内容だけ更新 |
| 動作確認 | シークレットウィンドウ | 実際のユーザー目線で確認 |
おわりに
GAS Webアプリは、サーバー不要・完全無料で15分あれば立ち上がるミニWebサーバーです。ちょっとしたツールの公開、簡易API、Webhookの受け口。自分ひとりで完結していたスクリプトが「誰かに使ってもらえるもの」になると、GASの楽しさは一段変わります。
正直、最初の一本は Hello, World! で十分です。URLを発行して、シークレットウィンドウで開いて、文字が表示される。それだけで「公開できた」という感覚がつかめるので、まずはそこから試してみてください。
関連記事
この記事を書いた人:凛
2児2児のママで現役ナース。夜勤明けの細切れ時間を副業GASに投じ、月5〜8万円の副収入を継続中。「看護師でもコードは書ける」を合言葉に、家事育児とプログラミングを両立する等身大の情報を発信しています。掲載コードは構文・API仕様を確認のうえ掲載していますが、お使いの環境に合わせて調整してください。