建設予定地

当面はやったことの備忘録

GASでユーザー登録フォームを作った

cistLTサークルのアドベントカレンダー4日目への寄稿です。

adventar.org

目的

友人と共同で制作し、10月のサークル合同LTで発表したWebサイト(未完成)chitose-fts.web.appにお気に入り機能追加したい。

合同LTcist-lt.connpass.comで使用したスライドについてはこちら

経緯

友人とGASを使って共同でまたやろうか、という運びになり

  • スプレッドシートでデータベースっぽいこともっとしたい
  • ユーザー登録ページ作ってお気に入り機能とか実装したいね
  • ページ遷移どうする? -> GASプロジェクトは基本1プロジェクト1htmlしか呼び出せない*1のでページ遷移大変そう...

などなどありました。

結果

わりとなんとかなりました。

実際に作成したページ
script.google.com スプレッドシート
docs.google.com

以下でソースコードと軽い解説を。

<!DOCTYPE html>
<html>

<head>
<base target=”_top”>
</head>

<body>
<h1>ユーザー登録フォーム</h1>

<form action="https://script.google.com/macros/s/AKfycbwLU-A0l5788vTO0sAXT1nL5VYWLNZqCt5hfy8vH8EFO_1rSvY/exec" method="post">
<p>
ユーザー名:<input type="text" name="namae">
</p>
<p>
性別:<br />
<input type="radio" name="gender" value="男性">男性<br />
<input type="radio" name="gender" value="女性">女性
</p>
<p>
<input type="submit" value="送信する">
<input type="reset" value="入力内容をリセットする">
</p>

</form>

</body>

</html>

<input>タグのname属性で付与した名前をスプレッドシートに書き込む際に受け渡します
<form>タグのaction属性でWEBアプリケーションとして公開したページのURLを指定しpostしています

<!DOCTYPE html>
<html>
<head>
<base target=”_top”>
</head>
<body>
送信が完了しました。<br><br>
<!-- ページ内遷移ここから -->
<?var url = getScriptUrl();?>
<input type="button" value="もう一度回答する" onclick="window.top.location.href = '<?!=url?>?page=kakunin';"/>
<!-- ここまで -->
</body>
</html>

ここの<input>タグでページを切り替えるためのボタンを作成しています。
onclicでwindow.top.location.href(現在のページの場所を指します)に<?!=url?>?page=kakunin';"/>を渡してあげることで
kakunin.htmlに遷移させてあげることができます。

function doGet(e) {
    Logger.log( Utilities.jsonStringify(e) );
    if (!e.parameter.page) {
        return HtmlService.createTemplateFromFile('index').evaluate();
    }  
  return HtmlService.createTemplateFromFile(e.parameter['page']).evaluate(); /* page=kakuninのpage,この配列に"kakunin"のようなページ名が追加されていく */
}

function doPost(postdata){

var sh=SpreadsheetApp.openById('1juOUKCyip7z0EBwVFSLriP30whTEBvB_lYJV12ZtEuw');
var time=new Date();

var namae=postdata.parameters.namae.toString();
var gender=postdata.parameters.gender.toString();

sh.appendRow([time,namae,gender]);

  return HtmlService.createTemplateFromFile("result").evaluate();
}

function getScriptUrl() {
    var url = ScriptApp.getService().getUrl();
    return url;
}

doGet()では
function doGet(e)
で、e.parameterの中にURLのパラメーターが配列として格納され、
return HtmlService.createTemplateFromFile(e.parameter['page']).evaluate()
で、URLのpage="kakunin"のパラメーターの値を取得し、変数pageに格納したものを戻り値として返しています

<input type=”submit”>でdoPost関数を呼び出した際の処理をみてみます。
今回のGASはスタンドアロンスクリプトで作成しているので
SpreadsheetApp.openById(“”)
とします。
(
部分に入るシートIDはスプレッドシートのURLのd/と/editの間
https://docs.google.com/spreadsheets/d/**********/edit#gid=597941997 で確認できます)

スクリプトと紐付いていないスプレッドシートを指定して取得しています。
引数で受け取ったオブジェクト型のpostdataをtoString()メソッドで文字列型に変換し、appendRowメソッドでスプレッドシートの最終行にtime,name,genderを追加しています。

感想

ネックだったページ遷移の問題は解決できたので、残る課題はログインページとお気に入り機能の実装ですね。
ゆくゆく着手していきたい。

またサークルのLTなどで何度かプレゼンしているのですが、GASのよいところは

①無料(お財布にやさしい)
②サーバーレスであること
スプレッドシートをデータベースとして代用できること
であると思います

制約のないレンサバはお金かかるし、データベースは学習コストが重いので、小規模でWeb開発したいとか、とりえあずデータベースつかってみたい
って人にもGASおすすめできると思うなぁという記事でした。

余談
f:id:denham:20201204181140p:plain
ページ上部のバナー、英文になってちょっと主張がおちついた感じ

*1:GASのHtmlServiceで提供されるHTMLはホスティングページではないため、Webアプリ公開時に作成されるURLが唯一のURLとなる