Google Apps Script 終極指南:實現校園「行

 

前言:「行政減量」—— 這不僅是教育政策的口號,更是無數第一線教師內心最深切的期盼。

您是否也感同身受?每日的教學熱情,正一點一滴-地被淹沒在無盡的行政庶務中:批改作業後的成績登錄、繁瑣的班級通知、協調家長會的時程、追蹤學生的作業繳交狀況……這些工作雖然必要,卻佔據了您備課、研究教學、甚至與學生深入互動的寶貴時間。

我們總在等待政策由上而下地落實,但如果有一種方法,能讓您由下而上、立刻為自己實現「行政減量」,您是否願意嘗試?

這個強大的工具,就內建在您每天使用的 Google Workspace 中。它不需要學校採購昂貴的軟體,也不需要您成為頂尖的程式設計師。它,就是 Google Apps Script (GAS)。這篇文章,將是您奪回教學專注力、實現真正行政減量的完整實戰手冊。


本文目錄


Part 1: 重新認識 GAS - 您響應「行政減量」的最佳利器

簡單來說,Google Apps Script (GAS) 是整個 Google 教育工具的「中央神經系統」。它就像一位聽得懂指令的數位助理,您只要用簡單的程式碼(基於 JavaScript)告訴它要做什麼,它就能指揮 Google Sheets、Forms、Gmail、Calendar 等工具,自動化地協同作業。

 

為什麼 GAS 是實現「行政減量」的關鍵?

  • 真正實現行政減量:這是 GAS 最核心的價值。它能將瑣碎、重複的行政工作(如成績登錄、通知寄發、資料彙整)交給腳本,讓您從表單與公文的循環中解放,找回教學的初心與熱情。
  • 釋放寶貴教學時間:將評分回饋、活動報名、資料追蹤等工作自動化,把時間還給課程設計與和學生的深度互動。
  • 提升親師溝通效率:自動化處理家長會談安排、成績報告,讓溝通更即時、更到位,且有據可查,減少來回溝通的隱形成本。
  • 數據驅動的教學決策:自動彙整學生的學習數據,讓您一目了然地掌握班級狀況,將時間花在「分析」而非「整理」數據上。
  • 零成本導入:只要有 Google 帳號就能免費使用,讓行政減量不再需要等待大筆預算,每位老師都能立即開始。

Part 2: GAS 的 10 個殺手級「行政減量」應用場景

讓我們看看 GAS 如何在真實的校園情境中,將行政減量的口號化為具體行動。

【教學與班級經營應用】

案例 1:半自動化作業評分與回饋系統

GAS 減量方案:在 Google Sheets 中填寫分數與評語代碼後,點擊「一鍵寄送回饋」。

function sendFeedbackEmails() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("成績單");
  const data = sheet.getDataRange().getValues();
  const feedbackTemplates = {
    "1": "表現優異,請繼續保持!",
    "2": "觀念正確,但細節可以更小心。",
    "3": "仍需努力,請找時間與老師討論。"
  };

  for (let i = 1; i < data.length; i++) {
    const [studentName, studentEmail, score, feedbackCode] = data[i];

    const subject = `關於您本次作業的回饋`;
    const message = `${studentName} 同學您好,\n\n您本次的成績為 ${score} 分。\n老師的評語:${feedbackTemplates[feedbackCode.toString()]}\n\n希望您繼續努力!`;
    
    GmailApp.sendEmail(studentEmail, subject, message);
  }
}

案例 2:個人化學習路徑小幫手

GAS 減量方案:根據線上前測成績,系統自動寄發不同等級的學習資源連結。

function assignLearningPath(e) {
  const formResponse = e.response;
  const userEmail = formResponse.getRespondentEmail();
  const score = formResponse.getItemResponses()[0].getResponse();

  let subject = "您的個人化學習建議";
  let message;

  if (score >= 90) {
    message = "恭喜您獲得高分!推薦您挑戰以下進階資源:[進階資源連結]";
  } else if (score >= 60) {
    message = "您的基礎穩固,請透過以下資源鞏固學習:[鞏固資源連結]";
  } else {
    message = "別氣餒,請先觀看以下基礎教學影片,老師會再關心您:[基礎教學連結]";
  }
  GmailApp.sendEmail(userEmail, subject, message);
}

案例 3:智慧作業/閱讀心得繳交追蹤器

GAS 減量方案:在繳交截止日當晚 10 點自動執行,找出未交者並寄出催繳信。

function checkSubmissionsAndRemind() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("作業繳交總表");
  const data = sheet.getDataRange().getValues();

  for (let i = 1; i < data.length; i++) {
    const [studentName, studentEmail, submissionStatus] = data[i];

    if (submissionStatus !== "已繳交") {
      const subject = "作業繳交通知提醒";
      const message = `${studentName} 同學您好,提醒您本次作業尚未繳交,請盡快完成。`;
      GmailApp.sendEmail(studentEmail, subject, message);
    }
  }
}

案例 4:公平且具記錄的課堂隨機點名器

GAS 減量方案:建立「隨機抽一位」的自訂選單,點擊後不僅顯示姓名,更自動記錄次數。

function onOpen() {
  SpreadsheetApp.getUi()
      .createMenu('課堂工具')
      .addItem('隨機抽一位', 'randomStudentPicker')
      .addToUi();
}

function randomStudentPicker() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const students = sheet.getRange("A2:A31").getValues();
  const randomIndex = Math.floor(Math.random() * students.length);
  const selectedStudent = students[randomIndex][0];
  
  const countCell = sheet.getRange(randomIndex + 2, 2);
  const currentCount = countCell.getValue() || 0;
  countCell.setValue(currentCount + 1);

  SpreadsheetApp.getUi().alert(`抽中的是: ${selectedStudent}`);
}

案例 5:學生行為與正向表現即時記錄器

GAS 減量方案:老師用手機表單提交,GAS 自動將紀錄彙整到總表。

function logStudentBehavior(e) {
  const itemResponses = e.response.getItemResponses();
  const studentId = itemResponses[0].getResponse();
  const eventType = itemResponses[1].getResponse();
  const description = itemResponses[2].getResponse();
  const timestamp = new Date();

  const logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("學生行為總紀錄");
  logSheet.appendRow([timestamp, studentId, eventType, description]);
}

【學校行政與親師溝通應用】

案例 6:全自動家長會談預約系統

GAS 減量方案:家長選擇時段後,GAS 自動預約並將該時段從選項中移除。

function processAppointment(e) {
  const form = FormApp.getActiveForm();
  const selectedTime = e.response.getItemResponses()[0].getResponse();

  // ... (此處應有程式碼在 Calendar 上建立活動) ...

  const timeQuestion = form.getItems(FormApp.ItemType.LIST)[0].asListItem();
  const choices = timeQuestion.getChoices();
  const newChoices = choices.filter(choice => choice.getValue() !== selectedTime);
  
  timeQuestion.setChoices(newChoices);
}

案例 7:校外教學報名與通知單自動化管理

GAS 減量方案:家長報名後,GAS 自動生成客製化的同意書並寄出。

function generatePermissionSlip(e) {
  const studentName = e.response.getItemResponses()[0].getResponse();
  const parentEmail = e.response.getRespondentEmail();
  const templateId = "YOUR_TEMPLATE_DOC_ID";

  const newDocFile = DriveApp.getFileById(templateId).makeCopy(`家長同意書 - ${studentName}`);
  const newDoc = DocumentApp.openById(newDocFile.getId());
  
  newDoc.getBody().replaceText("{{學生姓名}}", studentName);
  newDoc.saveAndClose();

  GmailApp.sendEmail(parentEmail, "校外教學家長同意書", `請查收附件的同意書。`, {
    attachments: [newDocFile.getAs(MimeType.PDF)]
  });
}

案例 8:一鍵生成代課老師交接包

GAS 減量方案:老師在線上表單打勾,系統自動彙整資料寄給相關人員。

function onEdit(e) {
  const range = e.range;
  if (range.getColumn() == 2 && range.getValue() == true) {
    const sheet = e.source.getActiveSheet();
    const teacherName = sheet.getRange(range.getRow(), 1).getValue();
    const lessonPlanLink = sheet.getRange(range.getRow(), 3).getValue();

    const officeEmail = "office@myschool.edu.tw";
    const subject = `${teacherName} 老師代課交接資料`;
    const body = `這是 ${teacherName} 老師的代課資料,課程計畫連結:${lessonPlanLink}`;
    
    GmailApp.sendEmail(officeEmail, subject, body);
    range.setValue(false);
  }
}

案例 9:圖書館圖書逾期自動提醒系統

GAS 減量方案:設定每日自動運行的腳本,主動找出逾期紀錄並寄信通知導師。

function libraryOverdueReminder() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("借閱紀錄");
  const data = sheet.getDataRange().getValues();
  const today = new Date();

  for (let i = 1; i < data.length; i++) {
    const [bookTitle, studentName, , dueDate, status, teacherEmail] = data[i];

    if (status !== "已歸還" && new Date(dueDate) < today) {
      GmailApp.sendEmail(teacherEmail, "圖書逾期提醒", `貴班 ${studentName} 同學借閱的《${bookTitle}》已逾期。`);
    }
  }
}

案例 10:校園公告多平台一鍵發布

GAS 減量方案:在單一地點輸入公告,GAS 自動同步到所有指定平台。

function distributeAnnouncement(e) {
  const announcement = e.value;
  const teacherList = "all-teachers@myschool.edu.tw";
  const chatWebhookUrl = "YOUR_GOOGLE_CHAT_WEBHOOK_URL";

  GmailApp.sendEmail(teacherList, "【重要公告】", announcement);

  const payload = JSON.stringify({ "text": announcement });
  const options = {
    "method": "post",
    "contentType": "application/json",
    "payload": payload
  };
  UrlFetchApp.fetch(chatWebhookUrl, options);
}

Part 2.5: GAS 的魔法核心 - 串連 Google 工具,打造校園自動化工作流

前面的案例讓我們看到了 GAS 的各種可能性,但它最強大的地方,在於能將這些獨立的功能串連起來,形成一個完整的、無人干預的「自動化工作流」。就像多米諾骨牌,第一個動作觸發後,後續所有流程將自動完成。

[象徵工作流程的網路連結圖,節點之間有流動的線條。]

以下,我們將深入拆解三個校園真實情境,看 GAS 如何指揮 Google 各項工具協同作戰。

工作流一:新生入學全自動化流程

  • 目標:新生完成報到後,系統自動為其建立數位檔案、安排迎新活動、並通知所有相關單位。
  • 參與工具Google FormsGoogle SheetsGoogle DriveGoogle DocsGoogle CalendarGmail

自動化流程詳解:

  1. 資訊入口 (Google Forms):行政同仁將新生的基本資料填入一個「新生報到表單」。
  2. 數據中心 (Google Sheets):表單提交後,所有資料自動存入「新生總表」。【GAS 指揮部啟動】
  3. 建立個人檔案庫 (Google Drive & Google Docs):GAS 指揮 DriveApp 建立專屬資料夾,並指揮 DocumentApp 複製一份「新生觀察紀錄表」範本,填入資料後存檔。
  4. 安排迎新活動 (Google Calendar):GAS 指揮 CalendarApp 在「學校輔導室」的行事曆上,建立個人化的迎新座談活動,並邀請家長與老師。
  5. 多方自動通知 (Gmail):GAS 指揮 GmailApp,分頭寄送歡迎信給家長、通知信給班導師、以及任務信給資訊組長。

成果:原本需要多方手動協調,耗時至少半天的流程,現在只需要一次表單提交,在 30 秒內自動完成所有數位建檔與通知作業

工作流二:校內社團線上申請與審核流程

  • 目標:學生線上申請社團,申請單自動發送給指導老師審核,審核結果再自動通知學生,全程無紙化。
  • 參與工具Google FormsGoogle SheetsGmail(GAS Web App)

自動化流程詳解:

  1. 學生申請 (Google Forms):學生填寫「社團申請表」。
  2. 紀錄申請 (Google Sheets):申請資料存入「社團申請總表」。【GAS 指揮部啟動】
  3. 發送審核通知 (Gmail):GAS 寄一封包含「【點此批准】」和「【點此駁回】」特製連結的審核信給指導老師。
  4. 老師一鍵審核 (GAS Web App):老師點擊連結,觸發一個部署為「網路應用程式」的 GAS 腳本,回傳審核指令。
  5. 更新狀態並通知結果 (Google Sheets & Gmail):GAS 收到指令後,更新試算表中的審核狀態,並寄發最終結果通知信給學生。

成果:將傳統需要列印、跑流程簽名的過程,變為全線上的自動化流程,所有紀錄皆永久保存在雲端,輕鬆實現行政減量


Part 3: 新手入門:打造您的第一個「低分自動提醒」減量工具

看了這麼多強大的工作流,是不是也想動手試試看了呢?讓我們從一個簡單卻能立即展現行政減量價值的工具開始。

步驟一:準備您的成績單 (Google Sheets)

  1. 開啟一個新的 Google Sheets 檔案。
  2. 建立至少四個欄位標題:「學生姓名」、「家長 Email」、「最新小考成績」、「通知狀態」。

 

步驟二:進入 Apps Script 編輯器

  1. 點擊上方選單的「擴充功能」 (Extensions)。
  2. 選擇「Apps Script」。

步驟三:貼上魔法程式碼

您會看到一個程式碼編輯器的畫面。請將裡面的內容全部刪除,然後貼上以下程式碼:

// 這是一個特殊的函式,只要這個試算表有任何編輯,它就會自動執行
function onEdit(e) {
  const sheet = e.source.getActiveSheet();
  const range = e.range;

  // 檢查被編輯的是不是「最新小考成績」欄 (C欄),且不是第一行標題
  if (range.getColumn() == 3 && range.getRow() > 1) {
    const score = range.getValue();
    
    if (score < 60) {
      const studentName = sheet.getRange(range.getRow(), 1).getValue();
      const parentEmail = sheet.getRange(range.getRow(), 2).getValue();
      const statusCell = sheet.getRange(range.getRow(), 4);

      if (statusCell.getValue() != '已通知') {
        const subject = `${studentName} 的學習狀況提醒`;
        const message = `親愛的家長您好,\n\n提醒您,${studentName} 在本次小考的成績為 ${score} 分,需要您多加關心與鼓勵。\n\n建議您可以與孩子聊聊,了解他/她是否在學習上遇到了困難。學校方面,我也會特別關注,並提供必要的協助。\n\n祝 安康\n\n[您的姓名] 老師 敬上`;
        
        GmailApp.sendEmail(parentEmail, subject, message);
        statusCell.setValue('已通知');
      }
    }
  }
}

步驟四:儲存與授權

  1. 點擊編輯器上方像「磁碟片」圖示的「儲存專案」按鈕。
  2. 這一步非常重要:因為這個腳本需要寄送 Email 的權限,您需要手動執行一次來授權。點擊上方的「執行」按鈕。
  3. 此時會跳出一個「需要授權」的視窗。請跟隨指示,選擇您的 Google 帳號,點擊「進階」 > 「前往『(專案名稱)』(不安全)」,並在下個頁面點擊「允許」,授予腳本存取您資料的權限。(這是標準流程,因為是您自己寫的腳本,所以是安全的)。

步驟五:實際測試

  1. 回到您的成績單試算表。
  2. 在「家長 Email」欄位填上您自己的 Email 以便測試。
  3. 然後,在「最新小考成績」欄位輸入一個低於 60 的數字,例如 55,然後按下 Enter。

幾秒鐘後,去檢查您的信箱,應該就會收到一封來自您自己的提醒信了!同時,試算表上同一行的「通知狀態」欄也會自動變為「已通知」。

完成後,您就親手打造了一個 24 小時工作的「親師溝通助理」。每一次的自動通知,都是一次成功的行政減量


Part 4: 邁向進階之路 - 讓您的腳本更強大穩定

當您熟悉了基本操作後,可以探索以下技巧,讓您的自動化腳本更上一層樓,這也是行政減量能否規模化的關鍵。

1. 深入了解「觸發器 (Triggers)」

觸發器是自動化的心臟。除了我們在教學中用到的簡易觸發器 onEdit(),您應該學會使用「可安裝觸發器」:

  • 時間驅動 (Time-driven):最常用於排程任務。例如設定「圖書館逾期提醒」腳本在每天早上 8 點自動執行。
  • 事件驅動 (Event-driven):如 `On form submit`,這是處理 Google Forms 回覆最強大的方式,比 `onEdit` 更穩定可靠。

2. 打造自訂介面 (HTML Service)

GAS 不僅能在後端運作,還能使用標準的 HTML、CSS 和 JavaScript 建立圖形化介面,例如自訂的彈出視窗或側邊欄。

3. 學會處理錯誤 (Error Handling)

當您的腳本處理大量資料時,錯誤在所難免。`try...catch` 語法可以讓您的腳本更加「健壯」,即使遇到單筆資料問題,也能繼續完成其他任務。

try {
  // 嘗試執行這段程式碼
  GmailApp.sendEmail(invalidEmail, "主旨", "內容");
} catch (e) {
  // 如果 try 區塊發生錯誤,就執行這裡
  Logger.log(`寄信失敗:${e.toString()},收件人:${invalidEmail}`);
}

4. 撰寫可維護的程式碼

當您的腳本越來越複雜時,良好的撰寫習慣至關重要:加上註解、使用有意義的變數名稱、集中管理設定等。


Part 5: 結論:用科技賦能教學,響應「行政減量」從我做起

行政減量」不應只是被動等待的政策,它更可以是一種主動出擊的思維。Google Apps Script 賦予了每位老師實踐這種思惟的能力。

從簡單的範例程式碼,到跨工具的複雜工作流,再到讓腳本更穩健的進階技巧,您已經看到了這項工具的巨大潛力。它讓我們能將那些不具創造性、卻佔據大量時間的行政工作,交給最擅長處理重複任務的電腦腳本。這不僅是為了奪回寶貴的時間,更是為了找回身為教育者的專業與熱情,讓我們能將心力重新聚焦在每一個獨一無二的學生身上。

今天,就從您教學或行政工作中最繁瑣、最重複的一件事開始思考吧。花一點時間,複製一段範例程式碼,修改成您需要的樣子。您的每一次成功,不僅是個人的效率提升,更是對「行政減量」最鏗鏘有力的響應。

 

 

下一篇:ChatGPT為什麼可以如此的便宜!?

創作者介紹
創作者 小黃老師嘿技術 的頭像
小黃老師

小黃老師嘿技術

小黃老師 發表在 痞客邦 留言(0) 人氣( 233 )