2025年8月6日 星期三

Google Sheets 教學:打造多筆訂單批次更新系統(日期區間查詢與狀態更新)

在管理網路商店或處理大量訂單時,最耗時的工作之一莫過於逐筆更新訂單狀態。無論是確認款項、標示出貨,或是處理退貨,重複的操作不僅效率低落,也容易出錯。最近有網友提到,希望能透過核取方塊(Checkbox)一次選取多筆訂單進行更新,為了解決這個常見的需求,我們將分享如何利用 Google Sheets 搭配 Apps Script 與簡單的 HTML 介面,打造一個實用的「訂單批次更新系統」。

這個系統能讓你先依據日期區間篩選出特定時段的訂單,再勾選需要變更的項目,最後一鍵完成狀態更新。讓我們一起來看看如何實現吧!

功能亮點

  • 日期區間查詢: 可自訂起始與結束日期,精準撈出特定時間範圍內的訂單資料。

  • 多筆批次選取: 使用核取方塊(Checkbox),自由勾選多筆需要更新的訂單。

  • 一鍵批次更新: 輸入新的訂單狀態(例如:已付款、已出貨),點擊按鈕即可一次更新所有已選取的訂單。

  • 直觀網頁介面: 透過簡單的 HTML 頁面操作,無需直接在 Google 試算表中手動修改。

系統成品展示

操作流程非常簡單:

  1. 在網頁介面上選擇想查詢的「起始訂購日期」與「結束訂購日期」。

  2. 點擊「查詢/更新」按鈕,系統會列出該區間內的所有訂單。

  3. 勾選您想更新狀態的訂單。

  4. 在「訂單狀況」欄位輸入新的狀態,例如「已付款」。

  5. 再次點擊「查詢/更新」按鈕,系統就會將更新寫回 Google 試算表。

教學步驟

首先,你需要一份儲存訂單資料的 Google 試算表。我們已經準備好一份範本,你可以直接複製使用。

  1. 點擊下方連結前往範本試算表:

  2. 建立副本: 點選左上角 檔案 > 建立副本,將這份試算表複製到你自己的雲端硬碟。這樣你才能對它進行編輯與操作。

    這份範本包含訂單編號、日期、品名、訂單狀態等欄位,你可以根據自己的需求修改。請注意,此範例中,「訂單編號」(A欄) 是唯一值,而**「日期」(B欄) 是查詢的依據**。

接下來,我們要為試算表加入後端處理邏輯。

  1. 在你剛剛建立的試算表副本中,點選 擴充功能 > Apps Script

  2. 將編輯器中原有的程式碼清空,並貼上下方的 Code.gs 程式碼。

  3. 點擊右上角的 部署 > 新增部署作業

  4. 在彈出的視窗中,點擊齒輪圖示,類型選擇 網頁應用程式

  5. 在「誰可以存取」的選項中,選擇 任何人

  6. 點擊 部署,並在接下來的權限審查中點擊 授予存取權,選擇你的 Google 帳戶並允許所有權限。

  7. 完成後,複製產生的「網頁應用程式網址」,這個網址非常重要,下一步會用到。

Code.gs 程式碼:

JavaScript
// 腳本發佈為網路應用程式後,處理GET請求
function doGet(e) {
  // 取得從網頁傳來的參數
  var params = e.parameter;
  var BeginDate = Date.parse(params.BeginDate); // 開始日期
  var EndDate = Date.parse(params.EndDate);     // 結束日期
  var OrderId_list = params.OrderID_List;       // 訂單ID列表 (字串)
  var OrderStatus = params.OrderStatus;         // 訂單狀態

  // 將訂單ID字串用逗號分割成陣列
  var OrderList = OrderId_list ? OrderId_list.split(',') : [];

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("工作表1"); // 請確認你的工作表名稱

  var lastRow = sheet.getLastRow();
  var data = []; // 用於回傳給前端的資料

  // 取得所有資料
  var listAll = sheet.getRange(1, 1, lastRow, sheet.getLastColumn()).getValues();

  // 將標題列先放入回傳資料中
  data.push(listAll[0]);

  // 遍歷所有資料列 (從第二列開始,索引為1)
  for (var i = 1; i < listAll.length; i++) {
    var row = listAll[i];
    var listDate = new Date(row[1]).getTime(); // B欄位的日期
    var listOrderID = row[0].toString();       // A欄位的訂單編號

    // 判斷日期是否在查詢區間內
    if (listDate >= BeginDate && listDate <= EndDate) {
      
      // 如果有傳入訂單狀態,且此筆訂單ID在要更新的列表中,就進行更新
      if (OrderStatus && OrderList.indexOf(listOrderID) !== -1) {
        sheet.getRange(i + 1, 4).setValue(OrderStatus); // 更新D欄 (訂單狀態)
        sheet.getRange(i + 1, 7).setValue(new Date());  // 更新G欄 (確認日期)
        // 更新後,重新讀取該列的值以確保回傳的是最新資料
        row = sheet.getRange(i + 1, 1, 1, sheet.getLastColumn()).getValues()[0];
      }
      
      data.push(row); // 將符合條件的資料列加入回傳陣列
    }
  }

  // 將結果轉換為JSON格式並回傳
  return ContentService.createTextOutput(JSON.stringify(data))
    .setMimeType(ContentService.MimeType.JSON);
}

這個 HTML 檔案就是我們的操作介面。

  1. 在你的電腦上新增一個文字檔案,將其命名為 ordering.html

  2. 用記事本或任何程式碼編輯器打開它,貼上下方的 HTML 程式碼。

  3. 最重要的一步: 找到程式碼中的 var url = '...' 這一行,將引號內的網址替換成你在步驟二取得的網頁應用程式網址

  4. 儲存檔案。

ordering.html 程式碼:

Html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>訂單查詢與批次更新</title>
</head>
<body>

    輸入起始訂購日期: <input type="date" id="BeginDate" value="2020-02-01"><br>
    輸入結束訂購日期: <input type="date" id="EndDate" value="2020-02-17"><br>
    訂單狀況: <input type="text" id="OrderStatus" /><br>
    <input type="button" value="查詢/更新" onclick="searchOrders()">

    <div id="order_status"></div>

    <script>
        function searchOrders() {
            // 替換成你自己的 Apps Script 網頁應用程式網址
            var url = 'https://script.google.com/macros/s/AKfycbyo.../exec'; 

            var beginDate = document.getElementById("BeginDate").value;
            var endDate = document.getElementById("EndDate").value;
            var orderStatus = document.getElementById("OrderStatus").value;

            // 收集所有被勾選的訂單ID
            var checkboxes = document.getElementsByName("OrderID");
            var orderID_List = "";
            for (var i = 0; i < checkboxes.length; i++) {
                if (checkboxes[i].checked) {
                    orderID_List += checkboxes[i].value + ",";
                }
            }
            // 移除最後一個多餘的逗號
            if (orderID_List.length > 0) {
                orderID_List = orderID_List.substring(0, orderID_List.length - 1);
            }

            // 組合查詢URL
            var finalUrl = url + "?BeginDate=" + beginDate + "&EndDate=" + endDate + "&OrderID_List=" + orderID_List + "&OrderStatus=" + orderStatus;
            
            console.log("Request URL:", finalUrl); // 在開發者工具中查看送出的網址,方便除錯

            var xhr = new XMLHttpRequest();
            xhr.open('GET', finalUrl, true);
            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = JSON.parse(xhr.responseText);
                    displayResults(result);
                }
            };
            xhr.send();
        }

        function displayResults(data) {
            var html = '<table border="1" width="100%">';
            if (data.length > 0) {
                // 處理標題列
                html += '<tr><th>選取</th>';
                for(var j=0; j<data[0].length; j++){
                    html += '<th>' + data[0][j] + '</th>';
                }
                html += '</tr>';

                // 處理資料列
                for (var i = 1; i < data.length; i++) {
                    html += '<tr>';
                    // 第一欄加上 Checkbox
                    html += '<td><input type="checkbox" name="OrderID" value="' + data[i][0] + '"></td>';
                    // 其餘資料欄
                    for(var k=0; k<data[i].length; k++){
                       var cellData = data[i][k];
                       // 處理日期格式
                       if (k === 1 || k === 6) { // 假設第2和第7欄是日期
                           cellData = cellData ? new Date(cellData).toLocaleString() : '';
                       }
                       html += '<td>' + cellData + '</td>';
                    }
                    html += '</tr>';
                }
            } else {
                html += '<tr><td colspan="8">查無資料</td></tr>';
            }
            html += '</table>';
            document.getElementById("order_status").innerHTML = html;
        }
    </script>
</body>
</html>

將 ordering.html 檔案用你的瀏覽器(例如 Chrome、Edge)打開,你就可以開始操作這個系統了! 



沒有留言:

張貼留言

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

Appsheet如何設定先選分類再看細項

 若您的資料量很多,希望先選分類再看細項,可以在view中設定Gruop,有一點很重要,第一個是您要分類的項目,第二個要用_ROWNUMBER才會出現先分類的選項。 1.只有群組沒有_RowNumber會變成這樣 2.有第二層的_RowNumber 3.最後的結果,可以點下方Vi...