2021年9月7日火曜日

LuaMacrosでバッチを実行する(プログラマブルキーボードもどき)

外付けのテンキーが押し入れから出てきたので、LuaMacrosを使って

ボタンひと押しでバッチを実行できるように遊んでみた。

エセプログラマブルキーボードですね。

で、設定で思いの外ハマったのでメモを残しておきます。

※例によってこの記事を真似して何が起ころうと、私は責任を取りません。


解説は省いて、LuaMacrosに書いたコードを置いておきます。

----------------------------------------------------------------------------------------

-- 最小化時にタスクトレイに隠す

lmc.minimizeToTray = true


-- 最小化

lmc_minimize()


-- キーボードに名前を割り当て

lmc_device_set_name("extnumpad", "11X1111X")


-- キー割り当て

lmc_set_handler("extnumpad", function(button, direction)

    if (direction == 1) then return end

    -- 0

    if (button == 96)  then

        lmc_send_keys("#(c)") 

    -- 1

    elseif (button == 97)  then

        lmc_spawn("C:\\test\\pdf.bat")

    -- 2

    elseif (button == 98)  then

        lmc_spawn("C:\\test\\jpghiraku.bat")

    -- 3

    elseif (button == 99)  then

        lmc_send_keys("#(d)")

    -- 4

    elseif (button == 100)  then

        lmc_spawn("C:\\test\\gamenlock.bat")

    end

end)

----------------------------------------------------------------------------------------


ちなみになんですが、私は以下がわからなくてハマりました。

・バッチや実行ファイルを指定するときは「lmc_spawn」を使う

・lmc_spawnの引数で「\」を使うときは「\\」でエスケープ

・「-- 」始まりでコメントアウト


その他ハマった点。

・Windows+Lの画面ロックがなぜかできない。

→試しにsendkeysしようとしたのがこれでハマった。

 コマンドを書いたバッチをキックする方法で回避。

 どの道自室のパソコンなので使うことはないけど…。


・ショートカットに割り当てたショートカットキーをキックするとなんか遅い

→Windowsの仕様らしい。

 Windows10のショートカットキーが重い件(Superfetch)

 SuperfetchとかSysMainを落としても変わらなかったので

 ファイルを開くバッチをキックする方法に逃げました。


・「00」を押すと「0」を2回押したことになる

→テンキーはハード的にそうなっているそうで、調べたけど対処法は不明。

 諦めました。一番下段の「0」「00」「・」の並びのキーを使いたかったけど

 まぁいいか…。。


・IMEオン(全角入力)のときにテンキーを押すと、ショートカットは効くが

 数字が入力されてしまう

→Google 日本語入力のプロパティで「テンキーからの入力」を

 「直接入力」にすることで回避。IMEだとできないかも? 


あとは以下のような感じのショートカットを作ってスタートアップに

入れて自動起動。いい感じです。

リンク先を
「C:\luamacros\LuaMacros.exe -r "C:\luamacros\tenkey.lua"」
にしてます。

今思うと、lmc_spawnでバッチじゃなくてショートカットを実行して
やったほうが簡素でいいのかな?

2021年9月5日日曜日

Behringer TD-3とAbleton Live 11をリンクさせる。

 BehringerのTD-3を買いました。

単体での打ち込みがむちゃくちゃ難しいので、Abletonとつなげて

DAWのシーケンサで鳴らせるようにしてみました。

接続や設定で困っている方のためにメモを残しておこうと思います。

※あくまで「私はこうしたら動いた」というメモです。

 この設定で正解なのか、なんでこの設定で動いているのはよくわかって

 おりません。このつなぎ方で何かあっても責任は一切取りませんので

 ご了承ください。

 

まず下準備として、TD-3のドライバソフト的なのを落としてきます。

前は別名だったようですが、今は「SYNTHTRIBE」というソフトに

なっているようです。以下から落とせました。

ダウンロードセンター


TD-3をパソコンにUSBでつないで電源を起動します。

「SYNTHTRIBE V2.5.5 Windows.exe」を実行し、SYNTHTRIBEの画面で

「Clock Source」を「MIDI USB」にします。


左下の「Update」からファームウェアもアップデートできるので、
しておきましょう。僕の場合、最初にファームのアップを要求されました。

続いて結線です。


僕は昔からTRAKTOR AUDIO6を使っています。
皆さんはご自分のオーディオインターフェースをお使いください。


機器を接続したらAbletonを起動しましょう。
「環境設定」の「Audio」から「ドライバタイプ」を「ASIO」に。
「オーディオデバイス」を「ASIO4ALL」に設定します。
(私はASIOを使っております。ASIOについてはネットで調べてみてください。)
続いて「ハードウェア設定」を押します。


ASIOの設定を以下にします。
オーディオインターフェースを有効(?)にしましょう。



さっきの環境設定に戻ったら、「チャンネル設定」の
「入力設定」を以下に変えます。


続いて環境設定の「Link Tempo MIDI」から設定を以下に変えます。
MIDIの入力・出力にTD-3を選び、MIDI Portsの
トラックのTD-3の箇所をチェックオンにしてください。

ここまでくれば設定完了(のはず)です。


メイン画面に戻って、「External Instrument」というモジュールを
挿入しましょう。


挿入したらてきとうにMIDIシーケンスを描いて
再生しっぱなしの状態にし、以下画面の部分を設定します。
この時点ではまだ音は出ないです。


「MIDI To」を「TD-3」に。
「Audio From」は音が鳴っているチャンネルを
選びましょう。
私ここがよくわかってないのですが、たぶん環境設定の「入力設定」で
有効化したチャンネルになるんだと思います。


次に、オーディオトラックを1個追加します。
入力タイプをさっき追加した「Ext. Instrument」に。
右端の録音ボタンをオンにします。
ここまでできたら画面上部「アレンジメント録音ボタン」を
押してみてください。オーディオトラックにTD-3のサウンドが
録音されていく…んではないかと思います…(ちょっと自信がない)

以上です。これでハードを動かした結果をオーディオトラックに
録音できるようになりました。

実は一点困っております。
私、上記の設定で録音はできるようになったのですが、
なぜか音量が小さいんです。
TD-3にヘッドホン直挿しすると十分聴こえるし、
オーディオインターフェースの問題かなぁ…。
現状、録音後にオーディオトラックの音量を上げることで回避しております。
まぁいいか。

今回、以下の動画を参考にしました。

この記事は2021/9/4時点の情報です。
ドライバソフトの名前など変わっていくかもしれませんのでご注意ください。


2021年8月13日金曜日

HDDのCドライブをSSDに換装してみた。

僕のパソコンはcorei7 64bitでメモリ8GB、HDDはC、Dドライブ合わせて

合計5TBとまぁまぁなスペックなんですが、起動に時間がかかるんです。

何回か計ったところ、だいたい2分強~3分くらいでした。

たぶんCドライブがHDDなのが原因だろうということで、SSDに

換装してみました。

(他にもメモリ増強やらファンの交換などいろいろした)


ドライブ換装

Cドライブが2TBもあるので、同じ容量のSSDを買ってきました。

Western Digital ウエスタンデジタル 内蔵 HDD 2TB WD Blue PC 3.5インチ WD20EZAZ-EC 【国内正規代理店品】


で、パソコンの蓋を開けて据え付け、接続。

付替前

こちらの手順を参考にCドライブをクローン。

SanDisk,WD SSDのOSクローンに無料配布の「Acronis True Image」を試してみた。簡単ステップでクローン完了

無償のフリーソフトではドライブのクローンができなくなっているというのが

ポイントかと思います。(2021/8/7時点)

ウェスタンデジタル製のSSDを接続していると使用できる

Acronis True Imageでクローンしました。

(今気づいたんですけど参考にしたページと使ってるソフトのバージョンが違う…

 僕は上のリンク先からダウンロードして使いました。)

ターゲットディスクを選択する画面や実行ボタンが出る画面など、

出てくるのに50分くらいかかる画面がありましたのでご注意ください。

考え中のポップアップが50分くらい出っぱなしになるのですが、処理は

ちゃんと進んでいるようです。

また、

「クローン元よりクローン先のほうが容量が小さいためクローン後起動できない可能性がありますがいいですか?」

みたいなメッセージも出ましたが、クローン元、先ともに2TBで

容量一緒なので無視して次へ進めました。

換装後のOS起動など、特に問題なかったです。


付替後

ドライブをクローンし、元のHDDを外した後、PCの電源をオン。

起動初回は元のCドライブのディスクがなくなっているため、

他のブート元を探しに行こうとします。

PXEブートしようとして真っ黒な画面で数分待たされて

ちょっと焦りましたが、無事SSDを認識して起動。

SSDを認識した時点で、ブート順序の1番目もSSDに変わったようです。


起動にかかる時間はこんな感じに改善されました。

HDD:約3分

SSD:約30秒

※電源ボタンON~ログイン、デスクトップのアイコンが表示されるまでを計測


メモリを8GBから16GBに増強した時点で3分かかっていたので、
いろいろ組み替える前は起動にもっとかかっていたのかもしれません。
実際もっと時間かかってた気がします。


バックアップ設定

SSDはいきなりの故障が怖いので、Cドライブの大事なところ、Dドライブの
大事なところをドライブ交互にバックアップするよう、フリーソフトで
設定しました。


FFFTPを作った曽田さん作のフリーソフトですね。
ヘルプを見るとコマンド例が載ってます。
バッチにしてスタートアップに入れて、起動のたびにバックアップが
走るようにしました。これに時間がかかりますが、バックグラウンドで
走ってくれて作業に影響ないからいいかな…。


その他影響

Ableton Live11のオーソライズが外れてしまったようで、
再度オーソライズし直しになりました。
Live起動後にボタンポチッと押せばすぐオーソライズできました。
ちょっと気持ち悪いな、と思ってAbletonに問い合わせしてみたんですが、
すぐにオーソライズの権利を一回分付与してくれました。
Abletonの問い合わせ窓口は対応が素早くて好きです。
DeeMMaxとかMassive、ZynaptiqのINTENSITYは動作に問題なさそう。たぶん。

CPUファンもブンブン唸ってうるさかったので、Cooler Masterの
CM12VからアイネックスのCC-06Sに変えてみたら
むちゃくちゃ静かになりました。グリス代入れて3000円ちょっとでこんなに
静かになるのは嬉しい。Cooler Masterの仕様がわからないので
数値的なノイズレベルがわからないですが、ちょっと心配になるくらい
唸りを上げていたのがPS4くらいになりました。

iTunesのiPhoneバックアップが時間がかかるのは改善されず…。。
全部Cドライブに取ってるから鬼早になるかと期待してたんですが、
いつもWi-Fiでバックアップしてるからそこがボトルネックなんでしょうね。

まとめ

起動時間も鬼早になるし、一部を除いてアプリの起動もなんか
早くなった気がするのでSSDへの換装、おすすめです。
ただSSDは予兆なくぶっ壊れるので、バックアップだけには
気をつけたいですね。いきなりぶっ壊れるというのも僕の昔の知識なので、
今はどうなんだろう…?フリーソフトで予兆とかできるのかな?

2021年5月16日日曜日

Googleドライブの画像ファイルをiPhoneで表示する(なわとび記録アプリの続き)


前回書いていたなわとび記録アプリが結構できました。

ちょこちょこっとノウハウも得られたので、

備忘録として書いておこうと思います。


まずはソースを。説明は後で書きます。

【コード.gs】

//URLをたたいたときに呼ばれる

function doGet(req) {

  const template = 'form';

  return HtmlService.createTemplateFromFile(template).evaluate();

}

// CSSを読み込む関数

function include(filename) {

  return HtmlService.createHtmlOutputFromFile(filename).getContent();

}


//画像を表示するための関数

function getBae64Image(id) {

  const file = DriveApp.getFileById(id);

  const data = file.getBlob().getBytes();

  return Utilities.base64Encode(data);

}


【form.html】

<!DOCTYPE html>

<html>

  <head>

    <base target="_top">

    <meta charset="utf-8">

    <!-- form.cssの読み込みはコード.gsに作成した関数で行う -->

    <?!=include('form.css');?>

    <title>なわとび記録</title>

    <meta name="viewport" content="width=device-width">

  </head>

  <!-- btnDayで初期値を今日に設定、imgDisplayでiPhone用の画像表示の仕込み -->

  <body onload="btnDay('today');imgDisplay('GoogleIDGoogleIDGoogleIDGoogleIDG','imgcalendar');imgDisplay('GoogleIDGoogleIDGoogleIDGoogleIDG','imgnawa');imgDisplay('GoogleIDGoogleIDGoogleIDGoogleIDG','imgcount');imgDisplay('GoogleIDGoogleIDGoogleIDGoogleIDG','imgmaccho')">

    <main>

      <!-- タイトル -->

      <div class="maintitle">なわとび記録</div>


      <form action="https://docs.google.com/forms/u/0/d/e/GoogleIDGoogleIDGoogleIDGoogleIDGoogleIDGoogleIDGoogleID/formResponse" method="post" target="hidden_iframe" onsubmit="submitted=true;">

        <P>

           <!-- 日付 -->

           <img id="imgcalendar" class="TitlePic">

           <input class="CalIphone" id="date" type="date" name="entry.123456789" required> <span class="dateChange" onclick="btnDay('today')">今日</span> <span class="dateChange" onclick="btnDay('yesterday')">昨日</span>

        </P>

        <P>

           <!-- 種類 -->

           <img id="imgnawa" class="TitlePic">

           <select class="SelIPhone" id="type" name="entry.123456789" required>

           <option value="前跳び" selected>前跳び</option>

           <option value="後ろ跳び">後ろ跳び</option>

           <option value="前二重跳び">前二重跳び</option>

           <option value="後ろ二重跳び">後ろ二重跳び</option>

           </select>

        </P>

        <P>

           <!-- 回数 -->

           <img id="imgcount" class="TitlePic">

           <input class="NumIphone" type="number" value="90" name="entry.123456789" placeholder="100" required><span class="NumText">回</span>

        </P>

        <P>

           <!-- 記録ボタン -->

           <div style="display:inline-flex">

              <img id="imgmaccho" class="MacchoPic"><input class="BtnSave" type="submit" name="button" value="記録する" onclick="saveMsg()">

           </div>

        </P>

        </form>

   </main>

    <!-- jQueryのCDNを読み込んで使えるようにする -->

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

    <script type="text/javascript">

            //今日か昨日の日時を表示

            function btnDay(flg) {

                var date = new Date()

                //flgによって今日か昨日を取得する

                if (flg == "today") {

                   //何もしない

                } else if (flg == "yesterday") {

                   //昨日を取得する

                date.setDate(date.getDate() - 1);

                } else {

                   //エラーの場合は何もせず、今日を取得

                }

                var year = date.getFullYear()

                var month = date.getMonth() + 1

                var day = date.getDate()

              

                var toTwoDigits = function (num, digit) {

                  num += ''

                  if (num.length < digit) {

                    num = '0' + num

                  }

                  return num

                }

                

                var yyyy = toTwoDigits(year, 4)

                var mm = toTwoDigits(month, 2)

                var dd = toTwoDigits(day, 2)

                var ymd = yyyy + "-" + mm + "-" + dd;

                

                document.getElementById("date").value = ymd;

            }

            /* 画像表示 bodyのonloadで呼び出すことでiPhoneに画像表示させる */

            /* strfileId=GoogleドライブのURLID */

            /* strElementId=IMGタグに指定するID */

            function imgDisplay(strfileId,strElementId) {

               const fileId = strfileId;

               const url = google.script.run

               .withSuccessHandler(base64Data => {

                  const img = document.getElementById(strElementId);

                  img.setAttribute("src", "data:image/png;base64," + base64Data);

               })

               .withFailureHandler(console.error)

               .getBae64Image(fileId);      

            }

            /* 記録ボタン押下後のメッセージ(押せたのかわかりにくいので表示させる) */

            function saveMsg(){

               alert("お疲れさまでした!")

            }

    </script>

    <script type="text/javascript">var submitted = false;</script>

    <!-- 記録ボタンタップ後の画面遷移 -->

    <iframe name="hidden_iframe" id="hidden_iframe" style="display:none;" onload="if(submitted){window.location='https://docs.google.com/spreadsheets/d/spreadsheetnoIDspreadsheetnoID/edit#gid=123456789';}"></iframe>

  </body>

</html>


【form.css.html】

<style>

* {

    font-family: 'Montserrat', Arial, Helvetica, sans-serif;

}


main {

    width: 100vw;

    margin: auto;

    color: #000;

}


/* タップしたときの青い四角を消す */

*:focus {

  outline: none;

}


/* 一番上のタイトルの文字 */

div.maintitle {

    font-size: 75px;

    font-weight: bold;

    text-align: center;

    margin-bottom: 70px;

}


/* 項目名の文字 */

span.title {

    font-size: 55px; 

    margin-left : 30px;

    margin-right : 30px;

}



/* 項目のアイコン */

img.TitlePic {

    width: 70px;

    height: 70px;

    margin-left : 30px;

    margin-right : 30px; 

}


/* 日付 */

input.CalIphone {

    width: 340px;

    font-size: 65px;

    margin-bottom: 60px;

    background-color: transparent;

    border-width: 0px 0px 0px 0px;

    vertical-align:12px;  /* inputやselectがちょっと下にずれる問題の対応 */

}


/* 昨日今日ボタン */

span.dateChange {

    font-size: 45px;

    margin-left : 20px;

    margin-right : 20px; 

    margin-bottom: 60px;

    padding: 10px 30px;

    vertical-align:20px;  /* inputやselectがちょっと下にずれる問題の対応 */

    background-color: #dcdcdc;

}


/* 跳び方の種類プルダウン */

select.SelIPhone {

  -webkit-appearance: none; /* セレクトボックスのデフォルトスタイルを無効化 */

  -moz-appearance: none; /* セレクトボックスのデフォルトスタイルを無効化 */

  appearance: none; /* セレクトボックスのデフォルトスタイルを無効化 */

    width: 740px;

    font-size: 65px; 

    margin-bottom: 60px;

    background-color: white;

    border-width: 0px 0px 0px 0px;

    vertical-align:12px;  /* inputやselectがちょっと下にずれる問題の対応 */

}


/* プルダウンのダミー矢印 */

span.yajirushi {

    font-size: 65px; 

    margin-bottom: 60px;

    vertical-align:12px;  /* inputやselectがちょっと下にずれる問題の対応 */

}



/* 回数 */

input.NumIphone {

    width: 155px;

    font-size: 65px;

    margin-bottom: 60px;

    border-width: 0px 0px 0px 0px;

    vertical-align:12px;  /* inputやselectがちょっと下にずれる問題の対応 */

}


/* 回数の「回」の文字 */

span.NumText {

    font-size: 40px;

    margin-bottom: 60px;

    border-width: 0px 0px 0px 0px;

    vertical-align:12px;  /* inputやselectがちょっと下にずれる問題の対応 */

}


/* 記録閲覧ボタン */

input.BtnRecord {

    -webkit-appearance: none;    /* inputボタンのデフォルトスタイルを無効化 */

    height: 180px;

    font-weight: bold;

    text-align: center;

    font-size: 55px;

    margin-top: 410px;

    margin-left: 155px;

    color: #ffffff;

    background-color: #5a70c3;

    border-width: 0px 0px 0px 0px;

}


/* 記録ボタン */

input.BtnSave {

    -webkit-appearance: none;    /* inputボタンのデフォルトスタイルを無効化 */

    height: 180px;

    font-weight: bold;

    text-align: center;

    font-size: 55px;

    margin-top: 410px;

    margin-left: 440px;

    color: #ffffff;

    background-color: #5a70c3;

    border-width: 0px 0px 0px 0px;

}


/* 項目のアイコン */

img.MacchoPic {

    width: 140px;

    height: 140px;

    margin-top: 450px;

    margin-left: 20px;

}


</style>


Googleドライブの画像ファイルをiPhoneで表示

アプリ画面にアイコンを表示するためにGoogle Driveに画像ファイルを

置いて<IMG>タグで表示しようとしたんですがiPhoneだと

一筋縄ではいかないようで。


GASで公開したWebサイトにGoogle Drive上の画像ファイルを表示できない

上のページのコードを参考に、imgDisplay(strfileId,strElementId)という

ファンクションを作っています。

form.htmlのbodyタグのonloadでGoogleドライブの画像IDとIMGタグを

指定すればhtml側で画像表示できるよう、コードを変えてみました。


画像IDの取り方は以下のページが参考になります。

Google Drive にある画像をimgタグで取得させるURLについて


部品タップ時に出てくる青い枠対応

あとプルダウンをタップしたときに青い枠が出ちゃうんですが、

以下のページのコードを使用して出ないようにしました。

クリックやタップしたときの青い枠や四角を消すCSS


アプリ画面の左下にムキムキアイコンを表示してるんですが

表示してるだけです。タップしたら今までの履歴画面に

飛ばすようにしたいんですが履歴画面をまだ作っていないので…。

2021年4月27日火曜日

Googleフォームをカスタマイズしてなわとび記録アプリを作る

先日からなわとびを始めたんですが

何回飛べたか記録するアプリにいいのがなくて、

自作してみました。


まだ動くだけなので見た目がアレなんですが、

こんなのです。













Googleフォームをカスタマイズして作りました。

ネットで調べるとみんな簡単と言ってますが

なかなか苦労したので、メモを残しておきます。


【アプリ概要】

・iPhoneから使うアプリ(Webページ)。

・飛んだ日、跳び方の種類、飛んだ回数を入力し、送信ボタンを押すと記録できる。

・入力した内容はGoogleスプレッドシートに追記される。

・追記のみ。編集や削除はGoogleスプレッドシートで行う。(いずれ改修予定)

・日付はカレンダで入力。

・種類はプルダウンで入力。

・回数はキーボードで入力。

・日付、種類、回数はすべて文字列形式。日時や数値形式ではない。

 (↑残念ポイント。日付の扱い方がわからなかったため諦めて文字列にしました。)

・カレンダ入力やプルダウン、必須制御はWebページ側で行う。

・iPhoneで使うことしか考えていないので、PCではレイアウトが崩れる

 (↑こちらも残念ポイントです。)


(1)下準備

GoogleAppsScriptをGoogle Driveに追加

GoogleAppsScriptの説明と簡単にWebサイトを作る方法

上記のページを参考にGoogleAppsScriptをGoogle Driveに

インストールしました。実は私これを見落としてまして、

後述のhtmlページを作ったときの

「スクリプト関数が見つかりませんdoGet()」

というエラーに引っかかってしまい、3時間くらいハマりました。


(2)Googleフォームの作成










こんな感じですべて記述形式で質問を作成。

本当はこの時点で日付形式とか選択形式にしたかったんだけど

後述の手順で詰まってしまい諦めました。


(3)Googleフォームとスプレッドシートを連携

Googleフォームの標準機能でスプレッドシートに回答を出力するよう設定。

「回答」タブのこの辺から設定できます。






ちなみに、僕のはこんな感じに記録されていきます。








(4)入力フォームの作成

Googleフォームを自在にカスタマイズする

GoogleAppsScriptの説明と簡単にWebサイトを作る方法

こちらのページを参考にさせて頂きました。


たぶんGoogle側の仕様が変わったんでしょうが、

スクリプトエディタは画面左の↓から開くのが今の仕様のようです。













ちなみにご参考まで、私のソースも載せておきますね。

【コード.gs】

//URLをたたいたときに呼ばれる

function doGet(req) {

  const template = 'form';

  return HtmlService.createTemplateFromFile(template).evaluate();

}

// CSSを読み込む関数

function include(filename) {

  return HtmlService.createHtmlOutputFromFile(filename).getContent();

}

これはこちらのページのまんまですね。



【form.html】
<!DOCTYPE html>

<html>

  <head>

    <base target="_top">

    <meta charset="utf-8">

    <!-- form.cssの読み込みはコード.gsに作成した関数で行う -->

    <?!=include('form.css');?>

    <title>なわとび記録</title>

    <meta name="viewport" content="width=device-width">

  </head>

  <body>

    <main>

      <form action="https://docs.google.com/forms/u/0/d/e/123x123x123x123x123x123x123x123x123x123x123x123x123x123x/formResponse" method="post" target="hidden_iframe" onsubmit="submitted=true;">

        <p>

          <span class="title">日付</span>

        </P>

        <P>

          <input class="CalIphone" id="date" type="date" name="entry.123456789" required>

        </P>

        <P>

          <span class="title">種類</span>

        </P>

        <P>

          <select class="SelIPhone" id="type" name="entry.123456789" required>

          <option value="前跳び" selected>前跳び</option>

          <option value="後ろ跳び">後ろ跳び</option>

          <option value="前二重跳び">前二重跳び</option>

          <option value="後ろ二重跳び">後ろ二重跳び</option>

          </select>

        </P>

        <P>

          <span class="title">回数</span>

        </P>

        <P>

          <input class="NumIphone" type="number" value="80" name="entry.123456789" required>

        </P>

        <P>

          <input class="BtnIphone" type="submit" name="button" value="送信"></button>

        </P>

      </form>

  </main>

    <!-- jQueryのCDNを読み込んで使えるようにする -->

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

    <script type="text/javascript">

        //今日の日時を表示

            window.onload = function () {

                //今日の日時を表示

                var date = new Date()

                var year = date.getFullYear()

                var month = date.getMonth() + 1

                var day = date.getDate()

              

                var toTwoDigits = function (num, digit) {

                  num += ''

                  if (num.length < digit) {

                    num = '0' + num

                  }

                  return num

                }

                

                var yyyy = toTwoDigits(year, 4)

                var mm = toTwoDigits(month, 2)

                var dd = toTwoDigits(day, 2)

                var ymd = yyyy + "-" + mm + "-" + dd;

                

                document.getElementById("date").value = ymd;

            }

    </script>

    <script type="text/javascript">var submitted = false;</script>

    <iframe name="hidden_iframe" id="hidden_iframe" style="display:none;" onload="if(submitted){window.location='https://docs.google.com/spreadsheets/d/123x123x123x123x123x123x123x123x123x123x123x/edit#gid=123456789';}"></iframe>

  </body>

</html>


※IDなどはてきとうな文字列にしています。

日付形式の制御がよくわからなかったのでGoogleフォームは
全部記述形式にして、Webページの方でカレンダ入力や
プルダウン入力を実装したところがミソです。
ミソであり、イケてない点です…。
Webページ側でカレンダを使って入力しますので、
回答結果はすべてyyyy-mm-dd形式で飛んでいきます。
きれいな形式で文字列が飛んでいくので結果の編集は
スプレッドシートなりExcelなりでなんなりと成形してくれ…
がこのアプリの設計ポリシー(笑)です。

記録ボタンを押したあとは、とりあえず記録内容を溜め込んでる
Googleスプレッドシートに画面遷移するようにしました。
(何も制御しないと、Googleフォームの画面に飛んでいってしまいます)
飛ばす記述は下記のページの「7. サンクスページへの遷移について」を
参考にさせて頂きました。

日付の初期値を当日にするコードは以下の
「input type = 'date'に現在日付を設定する」
を参考にさせて頂きました。


【form.css.html】
<style>
* {
    font-family: 'Montserrat', Arial, Helvetica, sans-serif;
}

main {
    width: 100vw;
    margin: auto;
    color: #000;
}

span.title {
    font-size: 90px; 
}

select.SelIPhone {
    font-size: 60px; 
}

input.NumIphone {
    font-size: 60px;
}

input.CalIphone {
    font-size: 60px;
}

input.BtnIphone {
    font-size: 60px;
}

</style>
こちらのページを参考にしつつ、ネットで調べて自力で書いた感じです。
今はまともなデザインになっていないので、このcssをいじくって
もう少し見栄えを良くしていこうと思います。


ちなみにform.htmlの
<meta name="viewport" content="width=device-width">
がまったく効いてないんですが、
Googleフォームのページの仕様のような気がします。
画面上部の
「このアプリケーションは、Google ではなく、別のユーザーによって作成されたものです。」
というグレーの部分を眺めていると、どうもグーグルフォームの
ページ自体がPC表示しかできないような気がして…違うんだろうか…。

あ、iPhoneのアイコンですが、ショートカットを
ホーム画面に配置して、こんな感じにしています。




















iOS標準の「ショートカット」を作成し、ホーム画面に
配置することで、アイコンをオリジナルのものに
できますよ。