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:繼續下一頁。