GAS 行政流自學講義|社團報名及管理平台

用 GAS 做出一套可運轉的社團管理流程

這份講義以「整合版_社團管理平台.gs」為學習素材。你會從社團行政的真實流程出發,理解 Google 試算表、Google 表單、Apps Script、Drive 如何串接成一套可重複使用的社團報名與管理平台。

14張工作表,對應不同行政節點
2組表單:報名表與簽到表
3種分發模式:先搶先贏、抽籤、志願序
1個選單,完成主要操作流程

1開始之前:你要把它當成一個行政流程來學

這份 GS 不是單純拿來「產生一張報名表」的程式。它比較接近一套社團行政工作流:先準備學期資料,接著建立報名表,收回報名資料後進行驗證與分發,再產生錄取、候補、繳費、簽到、成果與統計資料。

自學重點:請不要一開始就急著看每一行程式。你可以先問自己:「這個行政流程有哪些資料?資料會從哪裡來?經過哪些判斷?最後要產出什麼結果?」理解資料流,比背函式名稱更重要。
第一層先看流程

理解社團管理從報名到成果的完整順序,先知道每一步的目的。

第二層再看資料表

觀察每張工作表保存什麼資料,以及它在流程中扮演哪一個狀態。

第三層最後看函式

把函式理解成「按鈕背後的行政動作」,例如驗證、分發、公告、統計。

2核心概念:行政自動化就是資料狀態管理

社團管理最花時間的地方,通常不是填表本身,而是後續的整理與判斷:有沒有重複報名?學生是否在名冊內?志願是否重複?社團是否額滿?候補如何排序?公告能不能遮蔽姓名?繳費資料是否能由錄取名單自動產生?

這份 GS 把上述問題拆成不同的資料狀態。當資料狀態清楚,程式就能協助你完成重複、可規則化的行政判斷。

資料治理欄位先穩,流程才穩

程式會依欄位名稱讀寫資料。學習時請特別留意「學號」「社團ID」「驗證狀態」這類欄位。

流程控管先試算,再發布

分發結果不會直接公開,而是先產生試算資料,確認後才正式發布。

個資意識內部完整,外部遮蔽

系統內部可以保存完整名冊,但公告時可使用遮蔽姓名,減少不必要的個資揭露。

3平台架構:以試算表作為行政中樞

這套平台採取「Spreadsheet as Backend」的設計。Google 試算表負責保存資料與提供操作入口;Google 表單負責收集報名與簽到;Apps Script 負責資料驗證、流程轉換、分發、公告與統計;Drive 則可用來整理社團成果資料夾。

Google Sheets

保存基本資料、學生名冊、社團課程、報名資料、錄取、候補、繳費、出席、成果與統計。

Google Forms

自動產生報名表與簽到表,並設定收集 Google 帳號、限制回應與表單目的地。

Apps Script

提供「社團管理平台」選單,把複雜流程變成可點選的操作。

Drive / Calendar

Drive 可建立成果資料夾;Calendar ID 保留作為日後上課提醒與期程通知的擴充點。

你可以用這張圖理解資料如何流動

📋
基本設定學校、學期、承辦人、報名說明
👧
學生名冊學號、帳號、班級、遮蔽姓名
🎨
社團課程社團ID、教師、地點、名額、費用
📝
報名表單三志願、收集 Google 帳號
⚙️
驗證分發名冊比對、志願檢查、衝堂檢查
📣
公告繳費錄取、候補、班級版名單、繳費
📊
簽到成果出席紀錄、成果資料夾、統計儀表板

4建議操作流程:請照順序跑一次

自學時,最有效的方法是先用 Demo 資料完整跑過一輪。跑完之後,再回頭看每個函式在流程中扮演什麼角色。

順序你要做的事對應選單/函式觀察重點
1建立一份 Google 試算表,貼上 GS 程式後重新整理頁面。onOpen()上方是否出現「社團管理平台」選單。
2執行初始化新學期。initializeSemester()是否自動建立 00 到 99 的所有工作表。
3建立 Demo 測試資料。seedDemoData()學生、社團、報名資料是否被正確填入。
4檢查基本資料、學生名冊與社團 ID。showBasicInfoCheck()validateStudentRoster()fillMissingClubIds()哪些資料會影響後續表單與分發。
5產生報名表草稿,確認欄位與志願選項。createRegistrationFormDraft()表單預設不收件,這是為了保留確認空間。
6開放報名、同步回應、驗證報名。openRegistrationFormForResponses()syncRegistrationResponsesFromForm()validateRegistrations()觀察系統如何檢查學號、帳號、志願、衝堂與重複志願。
7產生分發試算並發布。generateAssignmentDraft()publishAssignmentDraft()理解「試算」與「正式發布」的差別。
8產生繳費資料與公告。generatePaymentsFromAdmissions()generateAdmissionAnnouncement()觀察錄取名單如何延伸成繳費與公告資料。
9建立簽到表、同步與驗證出席紀錄。createAttendanceFormDraft()syncAttendanceResponsesFromForm()validateAttendanceRecords()檢查簽到者是否為正式錄取學生。
10建立成果資料夾、更新成果資料與儀表板。createClubOutcomeFolders()updateOutcomeRegistry()updateStatisticsDashboard()看見整個行政流程最後如何回到可統計、可查詢、可公告的資料。
操作提醒:第一次練習時,請先用 Demo 資料,不要直接使用正式學生名冊。等你理解流程、欄位與錯誤訊息後,再改成正式資料會比較安全。

5資料表設計:看懂每張表在流程中的位置

這份 GS 很適合用來練習「把行政工作拆成資料表」。你可以把每一張工作表視為一個行政節點:它不是單純儲存資料,而是在保存某個流程狀態。

工作表你要怎麼理解它代表欄位
00_基本資料整個平台的學校、學期與表單文字設定。schoolName、academicYear、semester、organizerName、registrationFormTitle
00_系統設定控制報名時間、分發模式、校內網域與表單連結。registrationStartAt、registrationEndAt、assignmentMode、internalGoogleDomain、formUrl
01_學生名冊報名驗證的基準資料。系統會用它判斷學生是否存在。學號、學生Google帳號、姓名、遮蔽姓名、班級、年級、家長Email
02_社團課程表所有社團開課資料與分發容量的來源。社團ID、社團名稱、指導老師、星期、節次、招收人數、社團費用
03_社團報名資料表單回應同步後的報名主檔。報名ID、報名Google帳號、學號、三個志願、驗證狀態、報名狀態
04_錄取名單正式分發結果。後續公告、繳費、簽到會依它延伸。錄取ID、分發批次ID、社團ID、學號、錄取志願、錄取狀態
05_候補名單沒有錄取時的候補排序與狀態。候補ID、社團ID、候補志願、候補序號、候補狀態
06_繳費管理由正式錄取名單產生的繳費清冊。繳費ID、應繳金額、已繳金額、繳費狀態、備註
07_出席紀錄簽到表同步後的出席資料。出席ID、社團ID、學號、簽到Google帳號、日期、出席狀態、驗證狀態
08_成果資料社團成果、照片、影片或檔案的登錄位置。成果ID、社團ID、類型、標題、Drive檔案ID、是否公開
09_統計儀表板把報名、錄取、候補、繳費與出席整理成指標。指標、數值、更新時間
10_公告輸出保存系統產生的公告文字,方便複製到校網或通知管道。公告ID、公告類型、標題、內容、建立者
11_承辦檢查表上線前的檢查結果,幫你把錯誤提前找出來。檢查項目、狀態、說明、建議處理方式
99_系統日誌保存操作與錯誤紀錄,方便追查問題。時間、等級、動作、訊息、執行者、詳細資料
學習提醒:練習時不要任意修改欄位名稱。這份程式多數讀寫依靠欄位名稱,例如「學號」「社團ID」「驗證狀態」。欄位順序可以透過 schema 修復,但欄位名稱一旦改掉,流程就容易中斷。

6程式模組:把函式看成行政動作

你不需要一開始就讀懂所有程式細節。比較好的做法,是先把函式分成不同類型:有些函式負責建表,有些負責檢查,有些負責產生表單,有些負責分發與公告。

主要模組對照

模組代表函式
資料表維護ensureAllSheetSchemas_()migrateSheetToSchema_()
基本設定getBasicInfo_()getSystemSettings_()validateBasicInfo_()
學生名冊refreshStudentMaskedNames()validateStudentRoster()
報名表createRegistrationFormDraft()syncRegistrationResponsesFromForm()
報名驗證validateRegistrations()validateDuplicateChoices_()validateChoiceScheduleConflict_()
分發runAssignment_()generateAssignmentDraft()publishAssignmentDraft()
繳費generatePaymentsFromAdmissions()
簽到createAttendanceFormDraft()validateAttendanceRecords()
公告與統計generateAdmissionAnnouncement()updateStatisticsDashboard()
成果與 DrivecreateClubOutcomeFolders()updateOutcomeRegistry()

三種分發模式

FIRST_COME先搶先贏

依報名時間排序,適合名額充足、規則簡單或短期活動。

LOTTERY抽籤

以固定種子產生可重現的隨機排序,適合熱門社團的公平分配。

PREFERENCE志願序

依第一、第二、第三志願逐輪分發,較符合正式社團選課情境。

建議優先讀懂的三段程式

// 1. 對外公告時遮蔽學生姓名
function maskStudentName_(name) {
  const normalizedName = String(name || '').trim();
  if (!normalizedName) return '';
  if (normalizedName.length === 1) return 'O';
  if (normalizedName.length === 2) return normalizedName.charAt(0) + 'O';
  return normalizedName.charAt(0) + 'O' + normalizedName.charAt(normalizedName.length - 1);
}

// 2. 表單收集 Google 帳號,必要時限制同一使用者只能回應一次
function applyInternalGoogleAccountFormSettings_(form, limitOneResponsePerUser) {
  form.setCollectEmail(true);
  form.setRequireLogin(true);
  if (limitOneResponsePerUser) form.setLimitOneResponsePerUser(true);
}

// 3. 從選單操作,不必記函式名稱
SpreadsheetApp.getUi()
  .createMenu('社團管理平台')
  .addItem('初始化新學期', 'initializeSemester')
  .addItem('產生報名表草稿', 'createRegistrationFormDraft')
  .addItem('產生分發試算', 'generateAssignmentDraft')
  .addItem('發布分發結果', 'publishAssignmentDraft');

7完整 GS 程式碼:一鍵複製到 Apps Script

完成前面的流程理解後,你可以直接複製下方完整程式碼,到 Google 試算表的 擴充功能 → Apps Script 中貼上。第一次執行時,系統會要求授權,這是因為程式需要操作試算表、表單與雲端硬碟。

建議做法:請先在測試用試算表貼上這份程式碼,執行 initializeSemester()seedDemoData() 完整跑過一次,再改成正式學校資料。
整合版_社團管理平台(2).gs
點擊按鈕可複製完整 GAS 程式碼

8自學任務:用改資料的方式理解程式

學這份 GS 時,不一定要馬上改程式。你可以先改資料、改設定、看結果如何變化。這比直接改程式更容易理解整套平台的設計。

任務 1補齊社團 ID

02_社團課程表 新增 5 個社團,不手動填社團 ID,執行補齊社團 ID,觀察 ID 產生規則。

任務 2製造錯誤資料

故意在學生名冊放入錯誤 Email 或重複學號,執行學生名冊驗證,觀察錯誤訊息是否能指出問題。

任務 3比較分發模式

把分發模式從 PREFERENCE 改成 LOTTERY,重新產生分發試算,比較錄取結果差異。

任務 4從錄取長出繳費

發布分發結果後產生繳費資料,觀察 06_繳費管理 如何由 04_錄取名單 產生。

進階思考

  1. 如果要讓導師只看自己班級的錄取名單,資料表與權限應該怎麼切?
  2. 如果報名表要加入家長同意欄位,會影響哪些資料表與公告內容?
  3. 如果學校有多個報名梯次,分發批次 ID 要如何使用才不會混在一起?
  4. 如果要寄送錄取通知,應該直接寄出,還是先產生草稿?為什麼?

9常見卡關:先從資料與設定檢查

排錯順序:先看 99_系統日誌,再看 11_承辦檢查表;先確認資料表欄位,再確認表單連結;先修資料,再懷疑程式。

10可以怎麼再進一步改造

Level 1加入報名狀況即時檢查

新增一個選單,統計各社團第一志願、第二志願、第三志願人數,方便在報名期間觀察熱門程度。

Level 2自動產生錄取通知草稿

由錄取名單讀取家長 Email,產生錄取社團、費用、地點與繳費提醒。建議先產生草稿,不要直接寄出。

Level 3加入班級導師檢視頁

使用 Web App 讓導師查詢自己班級的錄取與繳費狀態,同時避免看到全校個資。

Level 4加入 AI 行政摘要

把儀表板與檢查表內容整理成給校長、主任、承辦或導師的不同版本摘要。

11正式使用前自我檢核表

資料面

  • 00_基本資料已填妥學校、學期、承辦人與報名說明。
  • 00_系統設定已填報名開始/截止時間、分發模式、校內 Google 網域。
  • 01_學生名冊已匯入,且學號、姓名、班級、Google 帳號欄位完整。
  • 02_社團課程表已填上課時間、招收人數、社團費用與開課狀態。

流程面

  • 已執行學生遮蔽姓名更新。
  • 已執行學生名冊驗證。
  • 已補齊社團 ID。
  • 已產生報名表草稿並確認表單內容。
  • 已執行上線前檢查,且「11_承辦檢查表」沒有需處理項目。
正式上線原則:凡是會影響學生權益的流程,例如報名開放、分發發布、公告輸出與繳費通知,都建議採取「先產生草稿/試算 → 人工確認 → 正式發布」的節奏。