GAS Forms 自動化處理表單

Google Forms (Google 表單) 與 Apps Script 的結合能大幅提升自動化流程的效率。常見的應用方向包含:自動處理回覆、根據資料動態產生題目,或是對表單輸入內容進行更嚴格的驗證。

處理表單回覆 (Form Trigger)

當使用者提交表單時,GAS 可以自動捕捉這些資料並執行動作(如發送通知、寫入資料庫)。

/**
 * 處理表單提交事件
 * @param {Object} e 表單提交事件物件
 */
function onFormSubmit(e) {
  const formResponse = e.response;
  const itemResponses = formResponse.getItemResponses();
  
  let result = '收到新的表單報名:\n';
  
  itemResponses.forEach(itemResponse => {
    const title = itemResponse.getItem().getTitle();
    const answer = itemResponse.getResponse();
    result += `- ${title}: ${answer}\n`;
  });
  
  // 取得提交者的 Email (需在表單設定中開啟收集 Email)
  const userEmail = formResponse.getRespondentEmail();
  
  console.log(result);
  
  // 寄信通知管理員
  MailApp.sendEmail("admin@example.com", "新報名通知", result);
}

回覆處理相關函數語法說明

  • e.response:取得 FormResponse 物件,代表本次提交的內容。
  • getItemResponses():回傳一個陣列,包含表中「所有有回答」的題目物件 (ItemResponse)。
  • itemResponse.getItem().getTitle():取得該題目的標題文字。
  • itemResponse.getResponse():取得該題目的回答內容(字串、陣列或二維陣列,視題型而定)。
  • getRespondentEmail():取得填寫者的電子郵件帳號。

動態產生表單題目

如果你的選項經常變動(例如:每週的課程清單來自試算表),你可以透過腳本自動更新表單,而不需要手動輸入。

/**
 * 從試算表讀取清單並動態建立表單選項
 */
function updateFormChoices() {
  const form = FormApp.openById('YOUR_FORM_ID');
  
  // 假設選項存在某張試算表的 A 欄
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const options = ss.getSheetByName('選項清單').getRange("A2:A10").getValues().flat();
  
  // 找到表單中特定的「下拉選單」題目
  const items = form.getItems(FormApp.ItemType.LIST);
  const targetItem = items[0].asListItem(); // 假設是第一個下拉選單
  
  // 更新選項
  targetItem.setChoiceValues(options);
  
  console.log('表單選項已更新完成');
}

表單建置相關函數語法說明

  • FormApp.create(title):建立一個全新的表單檔案。
  • form.addMultipleChoiceItem():新增一個單選題。
  • form.addListItem():新增一個下拉選單。
  • form.addPageBreakItem():新增分頁符號。
  • setChoiceValues(values):傳入字串陣列,一次性設定該題目的所有選項。
  • setRequired(enabled):設定是否為必填。

表單驗證設定 (Validation)

雖然表單介面可以設定基本的驗證,但透過 GAS 你可以設定更為複雜的規則。

/**
 * 為表單的文字題設定正規表達式驗證
 */
function setTextValidation() {
  const form = FormApp.openById('YOUR_FORM_ID');
  const items = form.getItems(FormApp.ItemType.TEXT);
  const textItem = items[0].asTextItem();
  
  // 設定驗證:必須符合手機號碼格式 (台灣格式示範)
  const validation = FormApp.createTextValidation()
    .requireTextMatchesPattern('^09[0-9]{8}$')
    .setHelpText('請輸入正確的台灣手機號碼 (例如: 0912345678)')
    .build();
    
  textItem.setValidation(validation);
}

驗證相關函數語法說明

  • FormApp.createTextValidation():開始建立文字題的驗證建構器。
  • requireTextMatchesPattern(regex):設定必須符合的正規表達式 (Regex)。
  • requireNumberBetween(start, end):設定數值區間驗證。
  • requireTextLengthGreaterThanOrEqualTo(number):設定字數限制。
  • build():封裝規則並返回驗證物件。

多頁表單與跳題邏輯 (Page Breaks)

你可以根據使用者的回答,引導他們跳轉到不同的分頁。

/**
 * 建立包含跳題邏輯的表單
 */
function createLogicalForm() {
  const form = FormApp.create('意見調查');
  
  // 建立兩張分頁
  const page2 = form.addPageBreakItem().setTitle('滿意度詳細調查');
  const page3 = form.addPageBreakItem().setTitle('不滿意改進建議');
  
  // 建立第一頁的題目與跳轉規則
  const choiceItem = form.addMultipleChoiceItem();
  choiceItem.setTitle('您對本次服務滿意嗎?')
    .setChoices([
      choiceItem.createChoice('滿意', FormApp.PageNavigationType.RESTART), // 結束或重新開始
      choiceItem.createChoice('普通', page2), // 跳到分頁 2
      choiceItem.createChoice('不滿意', page3) // 跳到分頁 3
    ])
    .setRequired(true);
}

邏輯跳轉相關函數語法說明

  • createChoice(value, navigationType):建立選項並指定點選後的行為。
  • FormApp.PageNavigationType.SUBMIT:提交表單。
  • FormApp.PageNavigationType.RESTART:回到表單開頭。
  • FormApp.PageNavigationType.CONTINUE:繼續下一頁。