Topics

實現Google表單客製化的確認畫面

  • column

上次以「製作 Google Form 客戶表單時的陷阱」為題,整理了使用 Google Form HTML 自訂建立諮詢表單時遇到的要點。這次我們將介紹確認畫面的製作方法。

上次的專案中,

輸入畫面→送信完成畫面→自動送信確認信

的實裝。

這次我們

輸入畫面→輸入確認畫面→送信完成畫面→自動送信確認信

確認畫面的實裝進行整理說明。

結論:只用 Google Form 無法「加入確認頁面」

Google 表單無法透過 JavaScript 自由控制提交內容的處理或頁面轉向(基於安全性考慮,表單內容的結構無法透過 JS 存取)。

Google 表單

  • 無法設計在提交前插入中間確認畫面。
  • 無法將輸入中的資料傳送到其他頁面,也無法插入 HTML 中。

因此必須採用「自訂 HTML 表單 + Google Apps Script 網路應用程式」。

採用 Google Apps Script 網路應用程式時,就不是使用 Google 表單,而是用 HTML 和 Google Apps Script 組合實作。由於想用 Google 表單建立聯絡表單,於是決定詢問 Gemini。

能否將在靜態頁面 (index.html) 輸入的資料傳送至確認頁面 (confirm.html),再透過該頁面的 連結到 Google 表單?

這是個有洞察力的想法,但很遺憾,那種做法原則上「幾乎不可能」。 如果一定要實作的話 ①index.html → 用 JavaScript 將表單輸入的值保存至 sessionStorage。 ②在 confirm.html 中從 sessionStorage 讀取值並顯示。 ③透過 向 Google 表單的 formResponse 進行 POST(使用 entry.xxxxx 進行自訂) 但這種方法有幾個缺點需要注意:採用的是 formResponse 的非官方方式,且對於關閉 JavaScript 的使用者無法運作。

加上 JavaScript 實作!

那麼現在就利用 JavaScript 進行實作方法的說明。

index.html:建立輸入頁面

首先,在輸入頁面建立聯絡表單。此時不需填入 Google Form 的 entry.xxxx 值。

<form id="form">
  <input type="text" name="category" placeholder="お問い合わせ種類">
  <input type="text" name="name" placeholder="お名前">
  <input type="email" name="email" placeholder="メールアドレス">
  <button type="submit">確認</button>
</form>

<script>
  document.getElementById('form').addEventListener('submit', function (e) {
    e.preventDefault();
    const formData = new FormData(e.target);
    for (const [key, value] of formData.entries()) {
      sessionStorage.setItem(key, value); // sessionStorage に保存
    }
    window.location.href = '/inquiry/confirm.html';
  });
</script>

當按下確認按鈕時,使用 JavaScript 將表單輸入值保存到 sessionStorage,然後導向至確認頁面 /inquiry/confirm.html

confirm.html:建立確認頁面

將保存在 sessionStorage 中的值導入至 class="confirmBlock"

然後在其下方的表單中填入 Google Form 的 entry.xxxxx 值。

<div class="confirmBlock">
  <p>お問い合わせ種類: <span id="category"></span></p>
  <p>お名前: <span id="name"></span></p>
  <p>メールアドレス: <span id="email"></span></p>
</div>

<form action="<https://docs.google.com/forms/d/e/1FAIpQLSc-.../formResponse>"
      method="POST" target="hidden_iframe" onsubmit="submitted = true;">
  <input type="hidden" name="entry.1234567890" id="categoryInput">
  <input type="hidden" name="entry.2345678901" id="nameInput">
  <input type="hidden" name="entry.3456789012" id="emailInput">
  <button type="submit">送信</button>
</form>

<iframe name="hidden_iframe" style="display:none;" onload="if(submitted) window.location='/inquiry/complete.html';"></iframe>

<script>
  // 表示とフォームへの挿入
  ['category', 'name', 'email'].forEach(key => {
    const value = sessionStorage.getItem(key);
    document.getElementById(key).textContent = value;
    document.getElementById(key + 'Input').value = value;
  });

  let submitted = false;
</script>

確認頁面上為什麼還要放輸入表單呢…

那是因為要用這個表單讓 Google Form 的 formResponse 發揮作用!

type="hidden" 將表單本身隱藏。

實際的確認頁面就像這樣

type="hidden" 移除後,這裡隱藏著自訂的 Google 表單!

提交按鈕被按下時

<iframe name="hidden_iframe" style="display:none;" onload="if(submitted) window.location='/inquiry/complete.html';"></iframe>

轉至完成畫面頁面 complete.html 就可以了!

流程是將在 index.html 中輸入的值傳遞到 confirm.html 中的 Google 表單並提交。

由於是自訂的 Google 表單,可以使用彙總試算表,也可以透過 GAS 傳送自動回覆電子郵件。

總結

Google 表單單獨難以實現的「確認畫面」,透過 JavaScript 活用可以靈活實現。※不過原始碼就完全可見了呢💦

只需稍作調整,就能大幅提升外觀和易用性,何不多花一點心力試試呢。

本文作者

我主要從事標記語言、JavaScript、React 和 Next.js 的前端開發。看到自己參與的網站順利上線時最開心!興趣是彈吉他。喜歡貓咪和烤地瓜🐱🍠

Hiracchi

前端工程師 / 2022年入職

查看此員工的文章

信心十足的團隊體制與迅速的應對能力是我們的優勢

Liberogic 擁有經驗豐富的人員積極推進專案,因而獲得客戶的高度評價。
我們恰當地安排專案經理和總監,致力於順利推進整個專案。 我們避免不必要的全面投入而導致成本增加,而是採用適材適所配置資源的方式,因此在業務把握到估價制作與提交的速度上也備受好評。

請注意,我們不積極進行 SES 形式的駐場業務。

Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom、Webex 等幾乎所有主要的專案管理工具和聊天工具都可供您使用。

請諮詢我們解決您的網站問題。

案例分析