Google 試算表 x GAS 學生學科成績查詢系統
告別紙本個別印製與資安外洩風險!直接以最熟悉的 Google 試算表 做資料庫,搭配 Google Apps Script 自動運算 PR 值、級距人數,並透過 Chart.js 生成五力雷達圖與成績趨勢折線圖。5 分鐘極速部署,終身 0 維護費!
0 元建置成本
免租主機、免買資料庫,Google 雲端全包
五力雷達分析
Chart.js 繪製雷達圖與高分縮放折線圖
後端資料過濾
四重驗證,學生無法由原始碼偷看他人成績
雙身分獨立後台
學生查個人、導師看全班級距與平均
為什麼你需要這套成績查詢系統?
解決傳統成績公布與印製痛點,保護學生隱私並提供有溫度的數據回饋
❌ 傳統做法的痛點
- 📄 紙本列印繁瑣:每次段考都要排版套印、裁切發放,耗時又浪費紙張。
- ⚠️ 個資外洩風險:Line 群組或雲端直接發大表,容易侵害學生個人隱私。
- 🧊 冷冰冰純數字:傳統成績單只有分數與排名,孩子看不出學科均衡與進步趨勢。
- 💸 商用系統昂貴:市售成績系統動輒每年數千至數萬元維護費,且功能受限。
✅ 本系統的革新體驗
- ⚡ 試算表直接同步:複製貼上段考成績,網頁秒速更新,不用懂 SQL 程式碼。
- 🛡️ 四重驗證嚴格把關:班級+座號+學號+身分證末4碼,防範暴力破解。
- 🕸️ 雷達圖五力分析:一眼看出學科強弱項,智慧縮放折線圖看見微幅進步。
- 💯 完全免費且開源:建立副本即擁有完整系統所有權,資料 100% 自行掌握。
四大核心功能設計
結合教師實務教學需求與嚴謹資訊安全架構
Google 試算表即資料庫
採用 Serverless 無伺服器架構,後台就是大家最熟悉的 Google 試算表。支援隨時新增「114-1_第二次段考」或「平時成績」分頁,系統自動動態掛載與呈現。
Chart.js 學科五力視覺化
告別生硬表格!透過 Chart.js 自動產生個人五力雷達圖;折線圖更貼心支援「0-100 全幅」與「70-100 智慧放大」兩種模式,高分群也能看見進步幅度。
四重防護與個資安全
學生登入需比對班級、座號、學號與身分證末 4 碼,搭配圖形驗證碼防機器人。後端採用獨立查詢過濾,學生網頁原始碼中絕對找不到其他同學的分數。
導師專屬全班管理後台
具備獨立的導師登入介面,導師登入後可切換檢視全班成績總表、各科平均分數、10 分級距分佈統計與不及格預警,是班級經營與個別晤談的得力助手。
Google 試算表三大分頁結構與規範
系統完全依賴試算表欄位名稱進行邏輯辨識,請務必遵循以下欄位規範
1️⃣ [參數設定] 工作表
用於計算全校 PR 值與年級基準。
- A欄 (考試名稱):需與成績分頁名稱完全相符 (如
114-1_第一次段考)。 - B、C、D欄 (年級人數):依序填入七年級(1)、八年級(2)、九年級(3)應考總人數。
- 防呆提醒:若未填寫人數,網頁 PR 值將無法正常換算。
2️⃣ [學生資料] 工作表
用於驗證學生與導師登入身分。
- 班級:請統一使用 3 碼數字 (如
701,805,912)。 - 座號 / 學號:學生登入的帳號比對欄位。
- 姓名:網頁歡迎名稱顯示。
- 身分證字號:系統會自動擷取末 4 碼進行登入加密校驗。
3️⃣ [成績資料] 工作表
段考與平時考成績存放區。
- 段考分頁:命名如
114-1_第一次段考,需含學號、班級、校排及各學科。 - 平時分頁:名稱包含「平時」或「平常」,自動歸類在平時成績專區。
- 排除欄位:標題包含「作文」、「師說」、「備註」者不納入總分平均。
5 分鐘極速部署步驟
無需安裝開發環境,跟著四個步驟點擊即可完成上線
1 建立試算表公版副本
點擊下方連結建立專屬於您的 Google 試算表副本,取得完整資料庫結構與預設後台腳本。
- 點選「檔案」>「建立副本」保存至您的 Google 雲端硬碟。
- 貼上貴班或貴校學生名單及段考成績。
- 確認班級為 3 碼數字(如 701),缺考處請留白勿打 0。
2 開啟 Apps Script 部署為網頁應用程式
透過 Google 原生 Apps Script 功能,一鍵將試算表轉化為高互動網頁。
- 在試算表上方選單點選 「擴充功能」 > 「Apps Script」。
- 在編輯器右上角點擊 「部署」 > 「新增部署作業」。
- 點選左側齒輪圖示,選擇 「網頁應用程式 (Web app)」。
3 設定執行身分與存取權限
確保學生與家長能夠直接瀏覽查詢,同時確保試算表資料庫不被竄改。
- 執行身分:選擇
我 (您的 Google 帳號)。 - 誰可以存取:選擇
所有人 (Anyone)。 - 點擊「部署」,並授予 Google 帳號讀取試算表資料的必要權限。
4 複製網頁網址發布給學生
部署完成後產生的網頁應用程式網址即為系統首頁!
- 複製
https://script.google.com/macros/s/.../exec正式網址。 - 可將網址嵌入 Google Sites 協作平台或轉成 QR Code 提供給班級學生。
- 學生輸入班級、座號、學號與身分證末4碼即可立即查詢!
🛠️ 試算表資料格式防呆速查工具
在將名單匯入試算表前,可在此快速測試班級代碼與身分證驗證規則是否符合系統規範
💻 系統核心原始碼 (Google Apps Script)
若您想要自行微調或建置全新專案,可直接複製下方 Code.gs 核心運算邏輯
// Code.gs - 學生學科成績查詢系統核心後端邏輯
function doGet() {
return HtmlService.createTemplateFromFile('Index')
.evaluate()
.setTitle('學科成績查詢系統')
.addMetaTag('viewport', 'width=device-width, initial-scale=1');
}
// 取得全校有效班級清單 (支援雙重身分/資源班拆分)
function getClasses() {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("學生資料");
if (!sheet) return [];
var data = sheet.getDataRange().getDisplayValues();
if (data.length < 2) return [];
var idx = -1;
for(var i=0; i<data[0].length; i++){
if(String(data[0][i]).indexOf("班") > -1) { idx = i; break; }
}
if (idx === -1) return [];
var classes = new Set();
for (var i = 1; i < data.length; i++) {
var rawClass = String(data[i][idx]).trim();
var parts = rawClass.split(/[,,、/ ]+/);
parts.forEach(p => { if(p.trim()) classes.add(p.trim()); });
}
return Array.from(classes).sort(function(a, b) {
return a.localeCompare(b, undefined, {numeric: true, sensitivity: 'base'});
});
} catch (e) { return []; }
}
// 取得考試參數設定與年級總人數
function getExamParams() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("參數設定");
var config = { enrollment: {}, radarTarget: "" };
if (sheet) {
var data = sheet.getDataRange().getDisplayValues();
if (data.length > 1 && data[1].length > 4) config.radarTarget = String(data[1][4]).trim();
for (var i = 1; i < data.length; i++) {
var examName = String(data[i][0]).trim();
var count7 = parseInt(data[i][1]); var count8 = parseInt(data[i][2]); var count9 = parseInt(data[i][3]);
if (examName) {
config.enrollment[examName] = {};
if (!isNaN(count7)) config.enrollment[examName]["1"] = count7;
if (!isNaN(count8)) config.enrollment[examName]["2"] = count8;
if (!isNaN(count9)) config.enrollment[examName]["3"] = count9;
}
}
}
return config;
}
// 智慧年級自動辨識 (支援 701/101 格式)
function detectGrade(classStr) {
var s = String(classStr).trim();
if (s.length === 3 && !isNaN(s)) {
var firstChar = s.charAt(0);
if (firstChar === '1' || firstChar === '7') return "1";
if (firstChar === '2' || firstChar === '8') return "2";
if (firstChar === '3' || firstChar === '9') return "3";
}
return "";
}
常見問題與 GAS 操作深入指南
彙整老師與行政同仁在 Apps Script 部署、權限設定、資料除錯與資安管理的最完整 Q&A
這完全是正常且安全的! 因為這是您個人 Google 帳號建立的專屬私有腳本,尚未付費申請 Google 商業公開市集驗證。請按照以下 3 步點擊授權:
- 在出現「Google 尚未驗證這個應用程式 (Google hasn't verified this app)」警告視窗時,點擊左下方的 「進階 (Advanced)」。
- 點擊展開後的底層連結 「前往『學科成績查詢系統』(不安全) / Go to ... (unsafe)」。
- 在下一頁捲到底部,點擊 「允許 (Allow)」 授予存取權限即可完成部署。
註:授權僅代表您允許「您自己的腳本」讀取「您自己的試算表」,絕對不會有任何外部第三方竊取您的資料。
答案是:不需要!
- 僅更動試算表資料(貼上成績、修改學生姓名、新增段考分頁):完全不用重新部署!當學生在前端網頁點擊查詢時,Google Apps Script 會即時向試算表撈取當前最新資料,資料秒速同步。
- 修改了 Apps Script 程式碼(如編輯了 Code.gs 或 Index.html):才需要重新部署!請務必遵循以下「新版本」部署流程(見 Q3)。
許多老師改了 Code.gs 存檔後發現線上網址完全沒變,這是因為 GAS 仍維持在舊版本的封裝狀態。正確更新步驟如下:
- 在 Apps Script 編輯器右上角點擊 「部署」 > 「管理部署作業」。
- 在彈出視窗左側選取現有的網頁應用程式項目,點擊右上角的 「✏️ 編輯 (鉛筆圖示)」。
- 在「版本」下拉選單中,點選 「新版本 (New version)」(這一步最關鍵!)。
- 點擊右下角的 「部署」 按鈕完成更新。
這樣原本發布給學生的 /exec 網址才會即時運行最新修改的程式碼,且網址完全不變,無需重新通知學生!
這兩個設定決定了系統的運作方式,請務必嚴格依據標準設定:
- 執行身分 (Execute as):必須選擇
我 (Me / 您的帳號)。
❌ 若選成「存取網頁應用程式的使用者」:學生登入時會被強制要求登入各自的 Google 帳號,且因學生沒有您試算表的權限,將直接出現「Script Error」無法查詢。 - 誰可以存取 (Who has access):必須選擇
所有人 (Anyone)。
❌ 若選成「僅限自己」或「機構內使用者」:校外家長、手機未登入學校 Google 帳號的學生將直接出現 403 無權限存取畫面。
/dev 與 /exec,有何差別?
在部署視窗與測試時會看到兩種網址:
.../exec(正式發布網址):這是唯一要提供給學生與家長的網址! 任何人都可在免登入 Google 帳號的情況下安全開啟並進行查詢。.../dev(開發測試網址):僅供試算表擁有者自己測試最新草稿代碼,學生開啟會要求管理者登入權限,請勿將 /dev 網址公開發布。
請依序排查以下 4 個常見原因:
- 班級格式不一致:例如「學生資料」打
701,但成績表打成七年1班或7-1,系統字串比對失敗。 - 前後有多餘空格:請檢查學號、身分證字號欄位前後是否有不小心複製到的空白字元(建議全選欄位使用「尋找並取代」將空格清除)。
- 標題列被竄改:第一列標題(學號、班級、座號、姓名、身分證字號)是後端定位的關鍵,請勿更改文字或刪除欄位。
- 身分證未填或少於4碼:系統比對的是末 4 碼,請確保學生資料中有正確填入身分證字號。
PR 值的自動運算需滿足以下三項條件:
- 成績工作表中必須包含 「校排」 或 「年排」 欄位。
- 「參數設定」 工作表中,第一欄 (A欄) 的考試名稱必須與成績分頁標籤名稱 完全一致(含學期、底線符號,例如
114-1_第一次段考)。 - 「參數設定」中對應年級的總應考人數必須填入 純數字(例如
320),不可填文字如「約320人」。
- 缺考或無成績:請將該儲存格 直接留白 或填入
-。千萬不要輸入 0!若輸入 0,系統會判定該生實考 0 分計入班級平均並大幅拉低班平均,折線圖也會出現垂直陡降。 - 轉學生/休學:直接在「學生資料」分頁將該學生整行刪除即可,系統下拉選單會即時剔除。
本系統(v28.0+ 雙重身分支援版)特別針對台灣國高中特殊班級情境進行了強化相容:
在「學生資料」的班級欄位中,可使用半形逗號或斜線隔開多個班級,例如:104,113 或 701,資源班。系統讀取後會在登入頁的班級下拉選單中分別列出 104 與 113,學生可自由切換以任一身分登入查詢對應成績!
絕對不可能!
市面上許多簡易網頁會將整份試算表資料一次載入前端瀏覽器再用 JS 篩選,這會造成重大個資外洩漏洞。本系統採用嚴謹的「伺服器端過濾 (Server-side filtering)」架構:
當學生輸入身分資訊送出後,前端只送出查詢請求給 Google Apps Script 後端伺服器;後端驗證身分無誤後,僅回傳該名學生個人的單筆成績資料給瀏覽器。因此學生打開原始碼或 Network 封包,也只能看見自己的數據,完全無法窺探全班或他人個資。
千萬不要!試算表的共用權限請維持「僅限私人 (僅限自己編輯)」。
因為網頁是透過您部署時設定的「以我的身分執行」代為讀取試算表,因此學生端完全不需要任何試算表的讀取權限。若將試算表設為「知道連結的人均可檢視」,反而會導致全校原始成績單曝光,請務必妥善保管後台試算表權限!