2025年4月13日 星期日

Google 表單教學:免寫網站!用 Apps Script 製作即時訂單查詢系統

 很多朋友使用 Google 表單來收集訂單、報名資料或其他資訊,但常常遇到一個困擾:Google 表單本身沒有提供讓使用者查詢自己資料的功能。例如,客戶下單後想查詢訂單處理狀態,或是活動報名者想確認報名是否成功,都無法直接透過表單完成。

為了解決這個問題,今天我們要來教大家如何利用 Google Apps Script (GAS),為你的 Google Sheet 資料加上一個簡易的查詢系統,並將它嵌入到任何可以貼上 HTML 的地方,例如 Blogger、Google Sites 或你自己的網站,讓使用者可以輸入特定關鍵字(像是訂單編號、身分證字號等)來即時查詢相關資料。

這個方法的好處是:

  1. 免費: 完全使用 Google 的免費服務 (Google Sheet, Apps Script, Blogger/Sites)。

  2. 即時: 查詢結果直接來自 Google Sheet,資料更新後查詢結果也同步更新。

  3. 彈性: 可自行修改查詢的欄位與顯示方式。

成果預覽: (類似影片 0:57 處展示的頁面)

使用者在一個簡單的網頁介面上輸入查詢關鍵字(例如訂單編號),按下「查詢」按鈕後,符合條件的資料就會以表格形式顯示出來。



製作步驟:

第一步:準備你的 Google Sheet 資料

首先,你需要有一個 Google Sheet 檔案,裡面包含你想讓使用者查詢的資料。

  • 必要條件: 資料的第一列必須是「欄位標題」(Header Row),例如:身分證號、訂單編號、姓名、訂單狀態... 等。

  • 查詢欄位: 你需要決定讓使用者用哪一個欄位的資料來當作查詢關鍵字。 在本教學範例中,我們一開始示範用「身分證號」(第一欄),後來改成用「訂單編號」(第二欄)來查詢。

範例資料結構: (類似影片 1:17 處的表格)

身分證號訂單編號姓名訂單狀態
A01A0001蔡明和已寄出
A02A0002一整天等待匯款
A01A0003蔡明和等待匯款
A03A0004範例名已寄出

第二步:撰寫並部署 Google Apps Script

  1. 打開你的 Google Sheet 檔案。

  2. 點選頂部菜單的「工具」>「指令碼編輯器」。

  3. 你會進入 Apps Script 編輯器畫面。將原本預設的程式碼 (function myFunction() { ... }) 全部刪除。

  4. 將下方的 Apps Script 程式碼完整複製並貼到編輯器中。

  5. 【重要修改】 找到程式碼中這一段(大約在第 20 行):

    // 搜尋是否有資料存在
    for (var i = 1; i < listAll.length; i++) {
      if (listAll[i][0] == uid) { // <--- 修改這裡的數字 [0]
        data.push(listAll[i]);
      }
    }
    JavaScript

    listAll[i][0] 中的數字 0 代表「要用來比對查詢關鍵字的是第幾欄」。

    • 0 代表第一欄 (Column A)

    • 1 代表第二欄 (Column B)

    • 2 代表第三欄 (Column C),以此類推。

    • 請根據你想讓使用者查詢的欄位,修改這個數字。 例如,若要用「訂單編號」(範例中的第二欄)查詢,就將 [0] 改成 [1]

    • == uid 代表進行「完全符合」的比對。

  6. 點擊上方的「儲存專案」圖示 (💾),並為這個指令碼專案命名(例如:訂單查詢系統)。

  7. 部署指令碼:

    • 點擊右上角的「部署」>「新增部署」。

    • 在「選取類型」旁點擊齒輪圖示,選擇「網路應用程式」。

    • 設定:

      • 描述:可自行輸入(例如:訂單查詢 v1)。

      • 執行身分:選擇「我」。

      • 誰可以存取: 選擇「任何人 (甚至匿名使用者)」 (這是讓公開網頁能呼叫的關鍵)。

    • 點擊「部署」。

    • 授權: 第一次部署會要求授權。點擊「授予存取權」,選擇你的 Google 帳戶,可能會顯示「Google 尚未驗證這個應用程式」,點擊「進階」>「前往 [你的專案名稱] (不安全)」,然後點擊「允許」。

    • 複製網址: 授權成功後,會顯示一個「網路應用程式網址」,請務必將這個網址複製下來,等一下會用到。點擊「完成」。

Apps Script 程式碼:

// 【Google Apps Script】 - 貼到 Google Sheet 的指令碼編輯器

function doGet(e) {
  var params = e.parameter;
  var uid = params.uid; // 從網址接收查詢參數 'uid'

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet(); // 或者用 ss.getSheetByName("你的工作表名稱");

  var lastRow = sheet.getLastRow();
  var lastColumn = sheet.getLastColumn();
  var data = []; // 儲存查詢結果的陣列

  // 取得工作表所有資料 (包含標題列)
  var listAll = sheet.getRange(1, 1, lastRow, lastColumn).getValues();

  // 將標題列先加入結果陣列
  if (listAll.length > 0) {
    data.push(listAll[0]);
  }

  // 搜尋是否有資料存在 (從第二列開始,i=1)
  for (var i = 1; i < listAll.length; i++) {
    // 比對查詢關鍵字 uid 是否與指定欄位相符
    // *** 【重要】修改下方 listAll[i][0] 中的數字 0,0代表第一欄, 1代表第二欄, 以此類推 ***
    if (listAll[i][0] == uid) {
      data.push(listAll[i]); // 如果符合,將該列資料加入結果陣列
    }
  }

  // 將查詢結果轉換成 JSON 格式回傳
  var result = JSON.stringify(data);
  return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
}
JavaScript

第三步:製作查詢介面 (HTML + JavaScript)

  1. 複製下方的 HTML 與 JavaScript 程式碼。

  2. 你可以將這段程式碼貼到:

    • Blogger: 新增文章,切換到「HTML 檢視模式」貼上。

    • Google Sites: 使用「嵌入」>「嵌入程式碼」功能貼上。

    • 任何支援 HTML 的網頁空間。

  3. 【重要修改】 找到程式碼中這一段(大約在第 41 行):

    var url = "【請貼上你剛剛複製的網路應用程式網址】";
    JavaScript

    將 【請貼上你剛剛複製的網路應用程式網址】 這串文字,換成你剛剛在第二步部署後複製的那個網址

  4. 【選擇性修改】 你可以修改輸入框前面的提示文字、按鈕文字、或查詢結果的區域名稱 (id="order_status"),但記得若修改了 id,對應的 JavaScript 也要修改。修改輸入框的 id="uid",則 Apps Script 中的 params.uid 也要對應修改。

  5. 儲存或發佈你的網頁/文章。

HTML + JavaScript 程式碼:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>訂單查詢</title>
  <!-- 可以加上 CSS 美化樣式 -->
  <style>
    table, th, td {
      border: 1px solid black;
      border-collapse: collapse;
      padding: 5px;
    }
    th {
      background-color: #f2f2f2;
    }
  </style>
</head>
<body>

<h2>訂單查詢</h2>

<!-- 【選擇性修改】修改提示文字 -->
請輸入訂單編號:
<!-- 【注意】輸入框的 id="uid" 需與 Apps Script 的參數名對應 -->
<input type="text" id="uid" placeholder="輸入查詢關鍵字">

<!-- 【選擇性修改】修改按鈕文字 -->
<input type="button" value="查詢" onclick="showList(document.getElementById('uid').value);">
<br><br>

<!-- 顯示查詢結果的區域 -->
<span id="order_status">請輸入關鍵字後點擊查詢按鈕</span>

<script>
function showList(crit) {
  if (!crit) {
    document.getElementById('order_status').innerHTML = '<font color="red">請輸入查詢關鍵字!</font>';
    return;
  }

  document.getElementById('order_status').innerHTML = '查詢中...';

  // *** 【重要】請將下方 url 的值換成你部署後取得的網路應用程式網址 ***
  var url = "【請貼上你剛剛複製的網路應用程式網址】";
  var finalUrl = url + "?uid=" + encodeURIComponent(crit); // 組合查詢網址

  var xhr = new XMLHttpRequest();
  xhr.open("GET", finalUrl, true);
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
      try {
        // 解析 Apps Script 回傳的 JSON 資料
        var jsonData = JSON.parse(xhr.responseText);

        // 如果回傳的資料只有一筆 (通常是標題列),表示查無資料
        if (jsonData.length <= 1) {
          document.getElementById('order_status').innerHTML = '<font color="red">查無資料</font>';
        } else {
          // 建立 HTML 表格來顯示資料
          var html = '<table>';
          // 建立表頭 (第一筆資料是標題)
          html += '<tr>';
          for (var j = 0; j < jsonData[0].length; j++) {
            html += '<th>' + jsonData[0][j] + '</th>';
          }
          html += '</tr>';

          // 建立資料列 (從第二筆資料開始)
          for (var i = 1; i < jsonData.length; i++) {
            html += '<tr>';
            for (var j = 0; j < jsonData[i].length; j++) {
              html += '<td>' + jsonData[i][j] + '</td>';
            }
            html += '</tr>';
          }
          html += '</table>';
          document.getElementById('order_status').innerHTML = html;
        }
      } catch (e) {
        document.getElementById('order_status').innerHTML = '<font color="red">查詢出錯,請稍後再試或聯繫管理員。</font>';
        console.error("JSON Parsing Error:", e);
        console.error("Received Text:", xhr.responseText);
      }
    } else if (xhr.readyState == 4) {
         document.getElementById('order_status').innerHTML = '<font color="red">查詢失敗 (Status: ' + xhr.status + ')</font>';
    }
  };
  xhr.send();
}
</script>

</body>
</html>
Html

第四步:測試

打開你剛剛嵌入 HTML 的網頁或 Blogger 文章,在輸入框中輸入你在 Google Sheet 中存在的訂單編號或其他關鍵字,按下「查詢」按鈕,看看是否能成功顯示對應的資料。也可以試試輸入不存在的關鍵字,看看是否顯示「查無資料」。


常見問題與進階:

  • 修改了 Apps Script 程式碼後查詢沒反應?

    • 請儲存 Apps Script。

    • 最重要的是,你需要重新部署一次網路應用程式(部署 > 管理部署 > 選擇你的部署 > 編輯(鉛筆圖示) > 版本選擇「新增版本」> 部署)。每次修改後端 Apps Script 都需要重新部署。

  • 查詢欄位不是第一欄? 依照【第二步:第 5 點】修改 Apps Script 中的欄位索引數字。

  • 想用多個條件查詢(例如:身分證 + 手機號碼)?

    • Apps Script (doGet): 需要接收多個參數 (例如 params.uidparams.phone),並修改 if 判斷式,使用 && (AND) 連接多個條件比對 (例如 if (listAll[i][0] == uid && listAll[i][3] == phone) )。

    • HTML/JavaScript: 需要增加輸入欄位,並在 showList 函數中組合網址時加入多個參數 (例如 finalUrl = url + "?uid=" + uidValue + "&phone=" + phoneValue;)。

  • 效能問題: 如果你的 Google Sheet 資料量非常大(上萬筆),每次查詢都讀取整個工作表可能會變慢。進階作法可以考慮只讀取特定範圍或使用更有效率的查詢方式,但會更複雜。

希望這個教學對你有幫助!透過簡單的設定,你就能為你的 Google 表單資料建立一個方便的查詢系統了。如果遇到問題,歡迎到論壇或留言討論。



沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。

Excel 篩選後如何複製貼上欄位?網友問題解答!

大家好,我是「彰化一天」的部落格站長。今天要來解答一位網友關於 Excel 的問題,這個問題是在另一篇教學中被問到的,相信很多人都會遇到,所以特別寫一篇文章來分享。 問題: 篩選後,如何將篩選出來的資料複製貼上到指定欄位? 解答: 在 Excel 中,直接複製篩選後的資料並貼到不...