久しぶりすぎて自分が何号かも忘れました。野村です。
皆さんスマートフォンは何をお使いですか?
おそらくiPhoneを使用されている方が多いんじゃないかなと思います。
日本人の7割はiPhoneって言いますしね。
そんなiPhoneですが、Googleから嫌がらせを受けています。
それがこちら⇩
Googleフォームの日付入力が手入力なんです!!!!
Androidはカレンダーから選択する形なのに…
ちなみにiPadも嫌がらせうけてます(Macは知らん)
対処法としては、Googleフォームではどうにもできないんで、
自作フォームを作ってしまおう
というのが対処法になります。
GASを使えば無料で自作フォームを作成することができますので
GASを使ってやっていきます。
やり方
ちょっと難しいのでこの記事ではやり方だけお話します。
中身のコードとかカスタマイズの仕方とかはまた今度。
①GAS開く
データベースもセットで作っていきたいので、
まずはスプレッドシートを作成し、「拡張機能」→「Apps Script」でGASを開いてください。
②コード貼り付け
ちょっと長いので大変ですが、貼り付けるだけなので頑張ってください。
開いたら最初に表示されるスクリプトエディタの
function myFunction~~は全消しして以下を貼り付け
function doGet(e) {
let fileName = "";
if(e.pathInfo === "success"){
fileName = "success";
}else{
fileName = "form";
}
template = HtmlService.createTemplateFromFile(fileName);
template.url = ScriptApp.getService().getUrl();
const html = template.evaluate().setTitle("ユーザー登録");
return html;
}
貼り付けしたエディタのファイル名はなんでも良いですが、
doGet.gsとかだとわかりやすいと思います。
次に「+」でHTMLファイルを追加。
ファイル名はform.htmlにしてください。
そして以下を貼り付け
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<?!= HtmlService.createHtmlOutputFromFile("css").getContent(); ?>
</head>
<body>
<div class="container title-container">
<h1>ユーザー登録</h1>
</div>
<form class="h-adr" name="user">
<div class="container">
<div class="title">お名前</div>
<div class="margin-top"><input name="name" placeholder="例:田中 太郎"></div>
</div>
<div class="container">
<div class="title">生年月日</div>
<div class="margin-top"><input type="date" name="birthday"></div>
</div>
<div class="button-container">
<button onclick="registerUser();" type="button">送信</button>
</div>
</form>
<script>
function registerUser() {
const form = document.forms["user"];
const body = document.querySelector("body");
const text =
`<div class="overlay">` +
` <div class="loader-outer">` +
` <div class="loader"></div>` +
` </div>` +
`</div>`;
body.insertAdjacentHTML("beforeend", text);
google.script.run.withSuccessHandler(onSuccess)
.withFailureHandler(onFailure)
.registerUser(form);
function onSuccess() {
window.top.location.href = "<?= url ?>/success";
}
function onFailure() {
const overlay = document.querySelector(".overlay");
const dialogHtml =
`<div class="dialog">` +
` <div class="margin-top">サーバーエラーが発生しました。<br>再度送信ボタンを押してください。</div>` +
` <button onclick="closeDialog();">閉じる</button>` +
`</div>`;
overlay.insertAdjacentHTML("beforeend", dialogHtml);
}
}
function closeDialog() {
document.querySelector(".overlay").remove();
}
</script>
</body>
</html>
再度「+」でHTMLファイルを追加。
ファイル名はcss.htmlにしてください。
そして以下を貼り付け
<style>
* {
font-size: 36px;
font-weight: normal;
box-sizing: border-box;
}
body {
background-color: #f0ebf8;
margin: 0;
font-family: sans-serif;
}
h1 {
margin: 0;
font-size: 70px;
}
.container {
width: calc(100% - 80px);
max-width: 890px;
margin: 40px auto;
background-color: white;
padding: 45px;
border-radius: 20px;
border: 1px solid #999;
}
.title-container {
border-top: 20px solid #673ab7;
}
.button-container {
max-width: 890px;
width: calc(100% - 80px);
margin: 40px auto;
}
.title {
font-size: 46px;
}
.margin-top {
margin-top: 30px;
}
input {
color: black;
background-color: white;
border: none;
outline: none;
border-bottom: 1px solid #999;
border-radius: 0;
}
button {
color: white;
background-color: #673ab7;
border-radius: 10px;
border: none;
padding: 25px 70px;
cursor: pointer;
font-size: 46px;
}
.overlay {
position: fixed;
background-color: rgba(0, 0, 0, 0.5);
width: 100%;
height: 100vh;
top: 0;
}
.loader-outer {
position: absolute;
top: 50%;
left: 50%;
transform: translateY(-50%) translateX(-50%);
-webkit- transform: translateY(-50%) translateX(-50%);
}
.loader {
margin: auto;
font-size: 25px;
width: 1em;
height: 1em;
border-radius: 50%;
position: relative;
text-indent: -9999em;
-webkit-animation: load5 1.1s infinite ease;
animation: load5 1.1s infinite ease;
-webkit-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
}
@-webkit-keyframes load5 {
0%,
100% {
box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);
}
12.5% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);
}
25% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
}
37.5% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
}
50% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
}
62.5% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
}
75% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
}
87.5% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;
}
}
@keyframes load5 {
0%,
100% {
box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);
}
12.5% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);
}
25% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
}
37.5% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
}
50% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
}
62.5% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
}
75% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);
}
87.5% {
box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;
}
}
.dialog {
background-color: white;
width: 500px;
border-radius: 20px;
position: absolute;
top: 50%;
left: 50%;
padding: 20px;
animation-name: fadeUpAnime;
animation-duration: 0.5s;
animation-fill-mode: forwards;
opacity: 0;
}
@keyframes fadeUpAnime{
0% {
opacity: 0;
transform: translateY(calc(-50% + 20px)) translateX(-50%);
}
100% {
opacity: 1;
transform: translateY(-50%) translateX(-50%);
}
}
</style>
再度「+」でスクリプトファイルを追加。
ファイル名はregisterUser.jsにしてください。
そして以下を貼り付け
function registerUser(form) {
const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
sh.appendRow([
new Date(),
form["name"],
form["birthday"]
]);
}
再度「+」でhtmlファイルを追加。
ファイル名はsuccess.htmlにしてください。
そして以下を貼り付け
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<?!= HtmlService.createHtmlOutputFromFile("css").getContent(); ?>
</head>
<body>
<div class="container title-container">
<h1>ユーザー登録</h1>
<div class="margin-top">
フォームを送信しました
</div>
<div class="margin-top">
<a href="<?= url ?>">別の回答を送信</a>
</div>
</div>
</body>
</html>
以上でコードの貼り付けは終わりです。
最後に「Ctrl + S」でスクリプトを保存してください。
③公開設定する
右上の「デプロイ」→「新しいデプロイ」→「種類の選択の⚙マーク」→「ウェブアプリ」→右下の「デプロイ」を押すと承認画面が出てくるので承認する。
そうするとウェブアプリのURLが表示される。
これが自作フォームにアクセスするためのURLになります。
④データベース作る
データベースを作るといっても大したことはしません。
スプレッドシートを開いて、シート1のA1:C1セルに「登録日時」「名前」「生年月日」と入力してください。
ここまでで作業は終了です。
お疲れ様でした。
どんなもんか
URL開くとGoogleフォームもどきが表示されます。
これは私が頑張って見た目を似せた自作フォームになります。
そして日付選択の欄を押すと…
カレンダー表示できました!!!
ちなみにちゃんと送信できて、
送信するとスプレッドシートにデータが飛ぶようになってますので試してみてください。