2026年3月20日 星期五

【AppSheet 教學】如何利用 SUM 與 SELECT 函數自動計算庫存量

在開發庫存管理系統時,最常見的需求就是「如何自動計算目前的庫存量?」。今天我們將教大家如何在 AppSheet 中透過 Virtual Column(虛擬欄位),結合 SUM() 與 SELECT() 兩個強大的函數,輕鬆實現即時庫存統計。

核心邏輯:進貨 - 銷售 = 庫存

庫存計算的邏輯其實很簡單:

庫存量 =(該產品所有進貨數量的總和)-(該產品所有銷售數量的總和)

在 AppSheet 中,我們不需要手動去更改庫存數字,而是讓系統透過公式自動掃描「進貨表」與「銷售表」來得出結果。


實作教學:新增虛擬欄位

首先,請到你的 商品表(或代售商品表) 中,點擊 Add Virtual Column(新增虛擬欄位),並命名為「庫存」。

關鍵公式

請在公式欄位輸入以下內容(欄位名稱請根據您的實際表格調整):

Excel
sum(select(進貨紀錄[進貨數量], [編號] = [_THISROW].[編號])) 
- 
sum(select(銷售紀錄[數量], [編號] = [_THISROW].[編號]))

公式解析:

  1.  函數

    • select(進貨紀錄[進貨數量], [編號] = [_THISROW].[編號]):這段話的意思是「去『進貨紀錄表』找出所有『編號』等於我現在看這這筆資料編號的『進貨數量』」。

    • 它會回傳一個數字清單(例如:[10, 5, 20])。

  2.  函數

    • 負責將 SELECT 撈出來的清單進行加總(例如:10+5+20 = 35)。

  3. [_THISROW].[編號]

    • 這是一個關鍵指標,代表「目前這一筆商品資料的編號」,確保系統不會算錯別人的庫存。


實際測試

在影片的範例中:

  • 初始狀態:某項商品(如:阿不滴雞精 A001)的庫存顯示為 6

  • 新增銷售:我們到「銷售紀錄」中新增一筆該產品的賣出紀錄,數量設為 2

  • 結果回饋:存檔後回到商品頁面,你會發現該產品的庫存已自動更新為 4


函數參考說明

如果您想深入了解這兩個函數的官方定義,可以參考 AppSheet 的說明文件:

小提醒:

關於 SELECT() 的第三個參數 [DistinctOnly](布林值):

  • 若不填寫(預設為 FALSE),會回傳所有符合條件的資料(包含重複值)。

  • 若填寫為 TRUE,則會去除重複值後再回傳。在庫存計算中,我們通常不需要去除重複值,所以保持預設即可。


結語

透過 Virtual Column 與公式的結合,AppSheet 能為您省去大量的人工計算時間,並確保數據的即時性。如果您在設定公式時遇到問題,歡迎留言討論! 



2026年3月7日 星期六

別再只會用 Google 表單!打造專屬「英文單字測驗系統」的 5 個震撼彈

別再只會用 Google 表單!打造專屬「英文單字測驗系統」的 5 個震撼彈
1. 引言:打破數位教學的「功能牆」
在數位教學的現場,Google 表單一直是老師們製作線上測驗的首選。然而,隨著教學需求日益精細,許多老師開始撞上表單功能的「天花板」——例如無法精準指定題庫中的特定範圍進行抽題,或是介面過於僵化、缺乏即時的互動感。
身為數位教育工具的推廣者,我常被問到:有沒有一種工具,既能擁有 Google 表單的便利,又能具備專業測驗平台的靈活度?答案就在你每天使用的 Google 試算表(Google Sheets)裡。透過 Google Apps Script (GAS) 的強大功能,我們可以把試算表變成一個全自動化的後端資料庫,打造出具備發音、提示、即時紀錄與排行榜的專屬測驗系統。
2. 突破限制:為什麼「指定題庫範圍」是老師的救星?
傳統 Google 表單在處理大型題庫時,往往只能選擇全部隨機或是固定題目,難以配合每週的教學進度。本系統最大的突破點,在於它賦予了老師「精準控題」的權力,完美達成「適性教學(Differentiated Instruction)」。
Google 表單製作的題庫無法做到範圍內不亂數取部分題庫的功能。
透過試算表的「設定」分頁,老師可以隨時調整「開始題數」與「結束題數」。例如,這週只想考題庫中第 11 到 15 題,只要設定好範圍並指定抽題數量,系統就會精準抓取。更棒的是,如果將亂數功能設為「N(No)」,測驗將嚴格按照題庫順序呈現;設為「Y」則會打亂順序。這種靈活性讓老師能針對不同程度的學生、不同的學習階段,給予最精確的練習內容。
3. 即時反饋的魔力:學號串連與錯題歷程
學習成效的關鍵在於「訂正」與「反省」。本系統並非一次性的填答,而是透過「學號(Student ID)」與「姓名」建立起完整的學習追蹤。
  • 學號定位系統: 學生進入系統時需輸入學號(建議英文加數字),這組 ID 是串連後端資料庫的關鍵 Key,讓每筆成績都能精確歸戶。
  • 深度的錯題分析: 學生交卷後,不僅能看到總分,還能點擊「查看我的歷史紀錄」。系統會從雲端即時抓取過往數據,清楚標示出「哪幾題答錯」,例如介面會明確顯示「就是錯 9 題」。
  • 數據透明化: 這種透明的紀錄能幫助學生快速抓出學習盲點,而老師端則能透過後端試算表中的 QUERY 函數與綠色儲存格內的 Array Formula(陣列函數),自動彙整所有學生的練習狀況。
4. 多感官學習整合:內建發音與智能提示
在單字測驗中,視覺與聽覺的連結至關重要。本系統特別針對語言學習設計了兩大貼心功能:
你可以聽發音……這(測驗介面)都有提示。
  • 即時語音功能: 測驗介面中的每個單字旁都設有發音按鈕。作答時或檢視錯題時,學生只需點擊即可聽取正確唸法,將測驗轉化為聽力練習。
  • 智能作答提示: 為了降低學生的挫折感,系統會提供單字長度的提示(例如:前後共八個字母),甚至提供小寫提示。這讓測驗不再只是冰冷的「對」與「錯」,而是一個引導學生回憶、鞏固記憶的過程。
5. 激發競爭動機:自動化即時排行榜
動機是學習最好的燃料。利用 GAS 的即時寫入功能,學生的成績在按下「交卷」的那一刻,就會同步更新到後端的試算表中,並立即反映在網頁介面的「班級排行榜」上。
這套系統讓排行榜的運作完全「去人工化」。老師不再需要手動登記分數或排序,系統會根據學生的最新成績自動更新名次。當學生看到自己的努力即時轉化為排名上升,這種微競爭的設計能有效激發學生的榮譽感,讓原本枯燥的單字複習變得像遊戲闖關一樣有趣。
6. 部署指引:低代碼與 AI 協作的技術實現
你可能會問:製作這麼精密的系統一定很難吧?事實上,這是一個「AI 協作」的典型案例。
測驗 AI 協助產生程式碼是 AI 產生的。
核心程式碼由 AI 輔助優化,老師們只需按照以下步驟即可完成部署:
  1. 獲取範本: 老師需先前往「彰化一整天」部落格將「線上題庫測驗」模板加入購物車並結帳(即便免費亦須完成流程)。隨後在 Email 中完成驗證啟用,即可在網站上點擊連結下載並「建立副本」。
  2. GAS 管理部署: 在試算表的「擴充功能」中開啟 Apps Script。請選擇「管理部署(Manage Deployments)」而非僅僅是新增,這樣能確保後續修改程式碼時,URL 保持一致。部署時請務必將存取權限設為「所有人(Anyone)」。
  3. 安全性授權: 初次部署會遇到 Google 的警告,請點擊「進階(Advanced)」並選擇「Go to 英文單字(unsafe)」以完成帳號授權。
  4. 前端網址串接: 複製產生的 Web App URL,開啟前端 HTML 檔案,在程式碼前幾行找到對應位置,將 URL 貼入雙引號中。
  5. 嵌入協作平台: 使用 Google 協作平台的「整頁嵌入」功能,將改好網址的 HTML 程式碼貼上。專家提醒: 協作平台嵌入時可能會有兩側留白或寬度限制,這是平台特性,並不影響測驗功能的運作。
7. 結語:重新定義數位教室的自主學習
這套系統的核心價值在於**「數據自主權」**。相較於受限於廠商開發的封閉平台,這套架構讓老師能完全掌控題庫與學生數據,且部署成本幾乎為零。

隨著 AI 與低代碼工具的普及,科技的門檻已不再是障礙。這讓我們不得不思考:當創造一個專屬教學工具只需要一份試算表時,我們該如何重新定義教室裡的自主學習?除了單字測驗,這種「試算表即資料庫」的自動化架構,還能如何轉化應用在你其他的學科教學中? 



2026年3月4日 星期三

為什麼你的 Google 表單程式總是不聽話?揭開 JavaScript 除錯的隱藏陷阱

1. 前言:那個讓你抓狂的「執行錯誤」
你有過這種經驗嗎?熬夜照著網路教學改好了 Google 表單的程式碼,滿心期待地按下送出按鈕,結果畫面卻像當機一樣毫無反應。或是明明填了資料,後端試算表卻一片空白。
這種時候,大多數初學者的直覺是「一定是哪行寫錯了」,接著開始漫無目的地修改程式碼,祈禱下一次執行會發生奇蹟。但相信我,作為一名開發者,最重要的基本功不是「寫碼」,而是「除錯(Debug)」。寫程式就像是在森林裡偵察,如果你看不見資料流動的蹤跡,那你永遠只是在黑暗中亂撞。
2. 致命的「保留字」:別讓你的變數名稱成為殺手
在 JavaScript 的世界裡,有些單字是系統「專用」的,我們稱之為「保留字(Reserved Words)」。我常看到初學者為了方便,隨手取一個理所當然的名稱,卻不知道自己已經踩進了地雷區。
根據實戰案例,以下這幾個名稱是導致表單失效的常見元兇:
  • cf
  • status
  • location
  • DATCF (這是網友實戰中極具代表性的錯誤命名)
為什麼不能用?因為在瀏覽器環境中,這些字眼往往已經代表了特定的物件或功能。最典型的現象是:當你打開除錯工具觀察變數時,你會發現你的變數竟然顯示為 f(代表 function)或特定的系統物件。
「這就是一般初學者都會遇到的問題,就是變數用到了保留字……這都造成很多錯誤。」
當你的變數被系統誤認成一個「函式」而非「資料」時,後續的處理流程自然會崩潰。養成良好的命名習慣,不僅是為了程式能跑,更是專業開發者的基本素養。
3. 消失的 .value:你傳送的是「內容」還是「空殼」?
另一個讓無數新手卡關的細節,就是忘記加上 .value。這看似微小的差別,卻是「傳送成功」與「傳送失敗」的分水嶺。
讓我們看一段對比:
  • 錯誤寫法: 傳送 uid
  • 正確寫法: 傳送 uid.value
這兩者在本質上有天壤之別。如果你只傳送 uid,你傳出的是整個「控制項物件(HTML Element)」,在系統眼裡它就是一個複雜的 UI 盒子(Input Control);而加上 .value,才是伸手進盒子裡取出使用者輸入的那串「資料」。
我常對學生打比方:這就像你要寄一封信,結果你寄出的是整個「郵筒」而不是裡面的「信件」。如果後端接收不到正確的值,請務必先檢查你的變數後方是否漏掉了這幾個關鍵字母。
4. Chrome F12:開發者的「X 光機」
除錯不該靠猜測。如果你不學會使用 Chrome 內建的開發者工具,你永遠無法跨入專業開發者的門檻。
如何像高手一樣啟動偵錯?
  1. 按下鍵盤上的 F12
  2. 點選上方標籤中的 Sources
  3. Pro Tip (高手捷徑): 因為 Google 表單的開發環境檔案眾多,直接用滑鼠找太慢了。請按下 Ctrl+P (Mac 為 Cmd+P),直接輸入檔案關鍵字(例如搜尋 V 或是與專案相關的檔名)來快速開啟 HTML 或 JavaScript 檔案。
斷點(Breakpoint):捕捉資料的犯罪現場
在資料準備送出的那一行(通常是 URL 組裝或 API 呼叫前),點擊左側行號設置一個「斷點」。接著執行程式,它會停在該處。此時,請檢查右側的 Local(區域變數) 面板:
  • 如果變數顯示為 undefined,代表沒抓到。
  • 如果變數顯示為 function 或 input,代表你誤用了保留字或忘了加 .value
  • 只有看到清清楚楚的「字串值」,才代表資料正確流入了。
5. 實戰小技巧:讓資料「自己開口說話」
除了專業的斷點技術,這裡有兩個我私藏的「快速驗證」技巧,能幫你省下大量摸索時間:
  • 技巧 A:console.log() 即時監測 在程式碼中插入 console.log(變數名稱)。這是最簡單的「監視器」,讓你能在 Console 面板直接看到變數目前的狀態,確認傳送前資料是否完整。
  • 技巧 B:利用 innerHTML 讓 URL 現形 這是一個非常高效率的做法。在網頁下方設定一個隱藏的 <div> 或區域,在執行送出前,利用 innerHTML 將產生的 URL ID 或完整連結秀在網頁上。 為什麼要這麼做? 因為這能讓你「親眼看見」最終生成的 URL。你可以直接複製這個連結並貼到瀏覽器測試,直接驗證後端(如 Google Apps Script)的 API 是否運作正常,而不需要每次都重新填寫整張表單。
6. 結語:從簡單開始,不要「亂改」
面對錯誤,最忌諱的就是在大規模修改後才發現問題,那會讓你根本分不清是哪一版改壞的。對於初學者,我最誠懇的建議是:「不懂就不要亂改」
專業開發者的祕密武器是「增量開發」。與其一次加入所有複雜的功能,不如先從最基礎的結構開始,確保基本的資料傳送能成功,再「一個一個功能往上加」。
「你可以不要先加那麼多,然後一個一個加。」
下次當你的程式碼出錯時,你會選擇盲目修改,還是先打開 F12 設置斷點,用數據揭開問題的真相呢?記住,工具在手,你就不再是猜測者,而是掌控全域的開發者。


【AppSheet 教學】如何利用 SUM 與 SELECT 函數自動計算庫存量

在開發庫存管理系統時,最常見的需求就是「如何自動計算目前的庫存量?」。今天我們將教大家如何在 AppSheet 中透過  Virtual Column(虛擬欄位) ,結合  SUM()  與  SELECT()  兩個強大的函數,輕鬆實現即時庫存統計。 核心邏輯:進貨 - 銷售 ...