- メインのHTMLファイルはindex.html
- iframeで表示するHTMLファイルはsub1.html・sub2.html
- デプロイしたウェブアプリのURLは
https://script.google.com/macros/s/1234567890/exec
として説明していきます。
GAS側
###1. 複数のHTMLファイルを返せるようにする
URLのクエリ文字列(例えばhttps://www.example.com/sample.html?a=100&b=hoge
であれば、a=100&b=hoge
がクエリ文字列です)を判別し、要求に応じて複数のHTMLファイルのどれかを返せるようにします。
以下のサンプルではp=sub
と指定するとsub.html、それ以外の場合はindex.htmlを返すようにしています。
JS
1function doGet(e) {
2 // クエリ文字列を判別し、表示するべきHTMLファイルの名前をpageNameに代入
3 const pageName = (() => {
4 switch (e.parameter["p"]) {
5 case "sub1":
6 return "sub1.html";
7 case "sub2":
8 return "sub2.html";
9 default:
10 return "index.html";
11 }
12 })();
13
14 const output = HtmlService.createHtmlOutputFromFile(pageName);
15 return output;
16}
###2. iframeで表示したいHTMLOutputについて、iframeでの使用を許可するコードを追加する
output.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
とすると、そのHTMLOutputはiframeで表示出来るようになります。
今回の場合は、sub.htmlのHTMLOutputについてこの処理を実行する必要がありますね。
HTML側
方針としては、
- 表示するHTMLファイル毎にiframeを作っておく
- iframeを表示させたくないときに
display: none;
、表示させたいときにdisplay: block;
となるようにJSで実装する
という感じです。
私は以下のように実装してみましたが、色々なやり方があると思います。
HTML
1<!DOCTYPE html>
2<html>
3<head>
4 <script>
5 function buttonClick(name) {
6 const iframes = document.getElementById("iframes").children;
7 for (let i = 0; i < iframes.length; i++) {
8 const iframe = iframes.item(i);
9 if (iframe.style.display == "block") {
10 iframe.style.display = "none";
11 break;
12 }
13 }
14 iframes.namedItem(name).style.display = "block";
15 }
16 </script>
17 <style>
18 #iframes div {
19 display: none;
20 }
21 </style>
22</head>
23<body>
24 <div id="iframes">
25 <iframe name="sub1" src="https://script.google.com/macros/s/1234567890/exec?p=sub1"></iframe>
26 <iframe name="sub2" src="https://script.google.com/macros/s/1234567890/exec?p=sub2"></iframe>
27 </div>
28 <button type="button" onclick="buttonClick('sub1')">show sub1</button><br />
29 <button type="button" onclick="buttonClick('sub2')">show sub2</button><br />
30</body>
31</html>