🚀 免伺服器費 Serverless 📊 雙重身分支援 🛡️ 四重防護資安驗證

Google 試算表 x GAS 學生學科成績查詢系統

告別紙本個別印製與資安外洩風險!直接以最熟悉的 Google 試算表 做資料庫,搭配 Google Apps Script 自動運算 PR 值、級距人數,並透過 Chart.js 生成五力雷達圖與成績趨勢折線圖。5 分鐘極速部署,終身 0 維護費!

Google 試算表 x GAS 學生學科成績查詢系統主視覺
💰

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)」
Apps Script 部署設定截圖

3 設定執行身分與存取權限

確保學生與家長能夠直接瀏覽查詢,同時確保試算表資料庫不被竄改。

  • 執行身分:選擇 我 (您的 Google 帳號)
  • 誰可以存取:選擇 所有人 (Anyone)
  • 點擊「部署」,並授予 Google 帳號讀取試算表資料的必要權限。
登入驗證與設定

4 複製網頁網址發布給學生

部署完成後產生的網頁應用程式網址即為系統首頁!

  • 複製 https://script.google.com/macros/s/.../exec 正式網址。
  • 可將網址嵌入 Google Sites 協作平台或轉成 QR Code 提供給班級學生。
  • 學生輸入班級、座號、學號與身分證末4碼即可立即查詢!
學生查詢畫面展示

🛠️ 試算表資料格式防呆速查工具

在將名單匯入試算表前,可在此快速測試班級代碼與身分證驗證規則是否符合系統規範

即時診斷結果:
請在上方輸入班級或身分證字號進行格式即時檢測...

💻 系統核心原始碼 (Google Apps Script)

若您想要自行微調或建置全新專案,可直接複製下方 Code.gs 核心運算邏輯

GAS 後端核心運算邏輯 | Code.gs (v29.0)
// 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

GAS 授權Q1. 第一次在 Apps Script 部署時,出現「Google 尚未驗證這個應用程式」該如何處理?

這完全是正常且安全的! 因為這是您個人 Google 帳號建立的專屬私有腳本,尚未付費申請 Google 商業公開市集驗證。請按照以下 3 步點擊授權:

  1. 在出現「Google 尚未驗證這個應用程式 (Google hasn't verified this app)」警告視窗時,點擊左下方的 「進階 (Advanced)」
  2. 點擊展開後的底層連結 「前往『學科成績查詢系統』(不安全) / Go to ... (unsafe)」
  3. 在下一頁捲到底部,點擊 「允許 (Allow)」 授予存取權限即可完成部署。

註:授權僅代表您允許「您自己的腳本」讀取「您自己的試算表」,絕對不會有任何外部第三方竊取您的資料。

GAS 更新Q2. 修改了試算表成績或新增考試分頁後,需要重新在 GAS 點擊「部署」嗎?

答案是:不需要!

  • 僅更動試算表資料(貼上成績、修改學生姓名、新增段考分頁):完全不用重新部署!當學生在前端網頁點擊查詢時,Google Apps Script 會即時向試算表撈取當前最新資料,資料秒速同步。
  • 修改了 Apps Script 程式碼(如編輯了 Code.gs 或 Index.html):才需要重新部署!請務必遵循以下「新版本」部署流程(見 Q3)。
GAS 部署Q3. 修改了 Apps Script 程式碼後,如何正確更新線上版本?為什麼改了代碼線上沒變?

許多老師改了 Code.gs 存檔後發現線上網址完全沒變,這是因為 GAS 仍維持在舊版本的封裝狀態。正確更新步驟如下:

  1. 在 Apps Script 編輯器右上角點擊 「部署」 > 「管理部署作業」
  2. 在彈出視窗左側選取現有的網頁應用程式項目,點擊右上角的 「✏️ 編輯 (鉛筆圖示)」
  3. 在「版本」下拉選單中,點選 「新版本 (New version)」(這一步最關鍵!)。
  4. 點擊右下角的 「部署」 按鈕完成更新。

這樣原本發布給學生的 /exec 網址才會即時運行最新修改的程式碼,且網址完全不變,無需重新通知學生!

GAS 設定Q4. 部署時「執行身分」與「誰可以存取」選錯會發生什麼事?

這兩個設定決定了系統的運作方式,請務必嚴格依據標準設定:

  • 執行身分 (Execute as):必須選擇 我 (Me / 您的帳號)
    ❌ 若選成「存取網頁應用程式的使用者」:學生登入時會被強制要求登入各自的 Google 帳號,且因學生沒有您試算表的權限,將直接出現「Script Error」無法查詢。
  • 誰可以存取 (Who has access):必須選擇 所有人 (Anyone)
    ❌ 若選成「僅限自己」或「機構內使用者」:校外家長、手機未登入學校 Google 帳號的學生將直接出現 403 無權限存取畫面。
GAS 網址Q5. Apps Script 產生的網址有 /dev/exec,有何差別?

在部署視窗與測試時會看到兩種網址:

  • .../exec(正式發布網址):這是唯一要提供給學生與家長的網址! 任何人都可在免登入 Google 帳號的情況下安全開啟並進行查詢。
  • .../dev(開發測試網址):僅供試算表擁有者自己測試最新草稿代碼,學生開啟會要求管理者登入權限,請勿將 /dev 網址公開發布
試算表格式Q6. 為什麼學生登入後查不到成績,顯示「查無此學生」?

請依序排查以下 4 個常見原因:

  1. 班級格式不一致:例如「學生資料」打 701,但成績表打成 七年1班7-1,系統字串比對失敗。
  2. 前後有多餘空格:請檢查學號、身分證字號欄位前後是否有不小心複製到的空白字元(建議全選欄位使用「尋找並取代」將空格清除)。
  3. 標題列被竄改:第一列標題(學號、班級、座號、姓名、身分證字號)是後端定位的關鍵,請勿更改文字或刪除欄位。
  4. 身分證未填或少於4碼:系統比對的是末 4 碼,請確保學生資料中有正確填入身分證字號。
數據運算Q7. 為什麼網頁上的 PR 值一直顯示「-」或未正確換算?

PR 值的自動運算需滿足以下三項條件:

  1. 成績工作表中必須包含 「校排」「年排」 欄位。
  2. 「參數設定」 工作表中,第一欄 (A欄) 的考試名稱必須與成績分頁標籤名稱 完全一致(含學期、底線符號,例如 114-1_第一次段考)。
  3. 「參數設定」中對應年級的總應考人數必須填入 純數字(例如 320),不可填文字如「約320人」。
缺考防呆Q8. 學生缺考、請假或轉學,成績與名單該如何處理?
  • 缺考或無成績:請將該儲存格 直接留白 或填入 -千萬不要輸入 0!若輸入 0,系統會判定該生實考 0 分計入班級平均並大幅拉低班平均,折線圖也會出現垂直陡降。
  • 轉學生/休學:直接在「學生資料」分頁將該學生整行刪除即可,系統下拉選單會即時剔除。
身分支援Q9. 資源班或同時具備雙重班級身分的學生該如何設定?

本系統(v28.0+ 雙重身分支援版)特別針對台灣國高中特殊班級情境進行了強化相容:

在「學生資料」的班級欄位中,可使用半形逗號或斜線隔開多個班級,例如:104,113701,資源班。系統讀取後會在登入頁的班級下拉選單中分別列出 104113,學生可自由切換以任一身分登入查詢對應成績!

隱私防護Q10. 學生查詢時,是否能透過瀏覽器「檢視網頁原始碼」偷看其他人的成績?

絕對不可能!

市面上許多簡易網頁會將整份試算表資料一次載入前端瀏覽器再用 JS 篩選,這會造成重大個資外洩漏洞。本系統採用嚴謹的「伺服器端過濾 (Server-side filtering)」架構

當學生輸入身分資訊送出後,前端只送出查詢請求給 Google Apps Script 後端伺服器;後端驗證身分無誤後,僅回傳該名學生個人的單筆成績資料給瀏覽器。因此學生打開原始碼或 Network 封包,也只能看見自己的數據,完全無法窺探全班或他人個資。

權限管理Q11. Google 試算表的共用權限需要開給學生或家長嗎?

千萬不要!試算表的共用權限請維持「僅限私人 (僅限自己編輯)」。

因為網頁是透過您部署時設定的「以我的身分執行」代為讀取試算表,因此學生端完全不需要任何試算表的讀取權限。若將試算表設為「知道連結的人均可檢視」,反而會導致全校原始成績單曝光,請務必妥善保管後台試算表權限!

立即為您的班級建立現代化成績查詢系統

完全免費、開源透明、免維護費,讓數據化分析成為親師溝通與學生自主學習的最佳助力!

📋 立即複製公版試算表 💬 前往奕鈞老師粉專交流
✅ 已成功複製到剪貼簿!