星期二, 10月 20, 2026

[GAS] 拆活動時段

報名活動使用 Google Forms 時,發現時段是以下列方式呈現,直覺是資料這樣儲存,是要怎麼統計,練習一下在 Google Sheet 內把時段拆開並進行統計

Google Form 上的選單選項
各時段示意圖
設計流程圖
拆解活動時段 gs Code

重點紀錄
  • 該 GAS 是綁定在 Google Sheets 上,而不是 Google Forms
  • gs Code 抓取 Google Sheet 部分,為了方便手動執行測試,會判斷是從 Google Form 還是 GAS 內直接執行的
  • Range.insertCheckboxes() 是指把指定範圍內的 cell 變成 checkbox 並設定勾選值
/**
 * Google Forms 提交後,自動拆解 A、B、C 時段。
 *
 * C 欄:原始報名選項
 * D 欄:A 時段
 * E 欄:B 時段
 * F 欄:C 時段
 */
function onFormSubmit(e) {

  // 從試算表取得工作表
  const sheet = e && e.range
    ? e.range.getSheet()
    : SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form_Responses");

  if (!sheet) {
    throw new Error("找不到 Form_Responses 工作表。");
  }

  // 表單提交:使用實際提交列
  // 手動執行:使用最後一列
  const row = e && e.range
    ? e.range.getRow()
    : sheet.getLastRow();

  if (row <= 1) {
    throw new Error("目前沒有可處理的報名資料。");
  }

  // 讀取 C 欄報名選項
  const selectedValue = sheet.getRange(row, 3).getDisplayValue();

  // 解析報名選項
  // 例如 A + C (08:00 - 13:00) → ["A", "C"]
  const selectedGroups = selectedValue
    .split("(")[0]
    .split("+")
    .map(group => group.trim());

  // 基本時段
  const groups = ["A", "B", "C"];

  // 產生 CheckBox 勾選狀態
  const checkboxValues = groups.map(group =>
    selectedGroups.includes(group)
  );

  // D、E、F 欄
  const range = sheet.getRange(row, 4, 1, 3);

  // 建立 CheckBox
  range.insertCheckboxes();

  // 寫入勾選狀態
  range.setValues([checkboxValues]);
}
設定觸發條件

活動類型:提取表單時,在 以事件為準的觸發條件 內說明
An installable form submit trigger runs when a user responds to a form,There are two versions of the form-submit trigger
  • one for Google Forms itself
  • one for Sheets if the form submits to a spreadsheet
該筆記是屬於後者,意思是當 Google Sheets 接收到從 Google Forms 送來資料時會觸發,而該 Blog 筆記 - [GAS] 自行定義回覆 Email,則是屬於前者

因為 function 名稱都慣性取名為 onFormSubmit,所以誤會兩件事情
  • 直覺 GAS 是綁定在 Goole Forms 上,但就該筆記並不是
  • 以為跟簡單觸發條件 onOpen、doGet 一樣會自動觸發,不需要手動建立
統計公式設定

時段拆解開後,在 Google Sheets 內另外開一個 Sheet 來當成統計頁面,透過設定公式 CountIf() 來進行統計,小活動用最簡單方式來達成就好
=COUNTIF(Data!D2:D,TRUE)
=COUNTIF(Data!E2:E,TRUE)
=COUNTIF(Data!F2:F,TRUE)


實際執行

沒有留言:

張貼留言