在現代數位工作流程中,Google Forms 已成為收集和組織資料的強大工具。透過 Google Apps Script,我們可以程式化地創建、修改和管理 Google Forms,讓整個過程更加自動化和高效。本文將深入探討如何使用 Google Apps Script 創建功能豐富的 Google Form,並連接到 Google Sheets 收集回應。
Google Apps Script 是一套基於 JavaScript 的雲端自動化平台,讓使用者能針對 Google Workspace 應用程式進行高度自訂的自動化操作。針對 Google Forms,FormApp 服務提供了完整的 API,讓開發者能夠以程式方式建立新表單、編輯現有表單,並新增各種題型(如文字、多選、核取方塊等)。你可以靈活設定每個問題的屬性,例如是否必填、選項內容等,同時也能建立分頁或章節,讓表單結構更有條理。此外,FormApp 允許將回應自動串接到 Google Sheets,實現資料即時整合與後續分析,大幅提升工作效率與數位化流程的自動化程度。
基本概念與類別
FormApp 服務包含許多重要的類別,例如:
Form
:代表整個表單的主要對象Item
:表示表單中的項目(問題或版面元素)Choice
:表示選擇題的選項- 特定類型的項目,如
TextItem
、MultipleChoiceItem
、CheckboxItem
等
創建或編輯表單:代碼分析
基本操作
// 建立或編輯表單
const form = FormApp.create(formTitle);
// 檢查表單是否存在
const forms = DriveApp.getFilesByName(formTitle);
if (forms.hasNext()) {
const file = forms.next();
form = FormApp.openById(file.getId());
}
以上代碼展示了如何使用 Google Apps Script 建立或編輯表單。首先,我們使用 FormApp.create()
方法創建一個新表單,然後檢查是否已存在同名表單。如果表單存在,則使用 FormApp.openById()
方法打開現有表單進行編輯。
設定表單描述
form.setDescription(
"感謝你有興趣參加本次免費線上講座!\n" +
"我將介紹 AI 寫程式工具 bolt.new,並示範如何從 0 寫出完整 Web App,幫助你提升開發效率。\n\n" +
"📅 活動時間:2025 年 4 月 26 日(星期六)下午 2:00 – 4:00\n" +
"📍 活動地點:Jitsi Meet 線上會議\n" +
"💡 活動完全免費,歡迎自由參加!\n\n" +
"🎤 講者介紹 — Calpa Liu\n\n" +
"- 全端工程師,曾獲 ETHGlobal Taipei 黑客松 1inch 賺道第二名\n" +
"- 使用 AI 工具開發 Web3 儀表板 OrbitGO\n" +
"- 專精 AI 寫程式工具,如 bolt.new、ChatGPT 等\n" +
"- 擅長把開發知識用簡單語言分享給新手與工程師"
);
使用 setDescription()
方法設定表單的說明文字。這部分包含了活動的詳細信息,包括時間、地點、講者介紹等。注意使用 \n
換行符來格式化文字,以及使用表情符號增加可讀性。
清除舊問題並添加新問題
// 清除舊題目
const items = form.getItems();
for (let i = 0; i < items.length; i++) {
form.deleteItem(items[i]);
}
使用 getItems()
方法獲取表單中的所有項目,然後使用 deleteItem()
方法逐一刪除每個項目。
新增題目
姓名(必填文本題)
// 新增題目
form.addTextItem().setTitle("你的姓名是?").setRequired(true);
使用 addTextItem()
方法添加一個文本題目,並使用 setTitle()
方法設定題目標題,使用 setRequired(true)
方法設定為必填題目。
程式經驗(必填單選題)
// 新增題目
form
.addMultipleChoiceItem()
.setTitle("你目前的程式經驗?")
.setChoiceValues([
"完全新手",
"有寫過簡單網頁",
"熟悉前端開發",
"熟悉後端或全端開發",
])
.setRequired(true);
使用 addMultipleChoiceItem()
方法添加一個多選題目,並使用 setTitle()
方法設定題目標題,使用 setChoiceValues()
方法設定選項,使用 setRequired(true)
方法設定為必填題目。
興趣點(必填複選題,可自定義其他選項)
// 新增題目
form
.addCheckboxItem()
.setTitle("你對這場講座最感興趣的是?")
.setChoiceValues([
"想了解 bolt.new 是什麼",
"想看實際 AI 寫程式的操作示範",
"想知道如何用 AI 加速 Side Project",
"想學會如何下指令給 AI 工具",
"對 AI 工具與開發整合的未來趨勢有興趣",
])
.showOtherOption(true)
.setRequired(true);
使用 addCheckboxItem()
方法添加一個複選題目,並使用 setTitle()
方法設定題目標題,使用 setChoiceValues()
方法設定選項,使用 showOtherOption(true)
方法允許自定義選項,使用 setRequired(true)
方法設定為必填題目。
Email(必填,帶驗證的文本題)
// 新增題目
form
.addTextItem()
.setTitle("請留下你的 Email")
.setValidation(FormApp.createTextValidation().requireTextIsEmail().build())
.setRequired(true);
使用 addTextItem()
方法添加一個文本題目,並使用 setTitle()
方法設定題目標題,使用 setValidation()
方法設定驗證規則,使用 FormApp.createTextValidation().requireTextIsEmail().build()
指定驗證方式為 Email 格式,使用 setRequired(true)
方法設定為必填題目。
Telegram(必填文本題)
// 新增題目
form.addTextItem().setTitle("Telegram").setRequired(true);
使用 addTextItem()
方法添加一個文本題目,並使用 setTitle()
方法設定題目標題,使用 setRequired(true)
方法設定為必填題目。
偏好語言(必填單選題)
// 新增題目
form
.addMultipleChoiceItem()
.setTitle("你偏好的講座語言是?")
.setChoiceValues(["粵語", "國語", "都可以"])
.setRequired(true);
使用 addMultipleChoiceItem()
方法添加一個單選題目,並使用 setTitle()
方法設定題目標題,使用 setChoiceValues()
方法設定選項,使用 setRequired(true)
方法設定為必填題目。
訂閱意願(必填單選題)
// 新增題目
form
.addMultipleChoiceItem()
.setTitle("你是否願意日後收到更多關於 AI 寫程式的相關資訊、教學或文章?")
.setChoiceValues(["願意,我對 AI 寫程式的內容很有興趣", "暫時不需要,謝謝"])
.setRequired(true);
使用 addMultipleChoiceItem()
方法添加一個單選題目,並使用 setTitle()
方法設定題目標題,使用 setChoiceValues()
方法設定選項,使用 setRequired(true)
方法設定為必填題目。
檢查試算表
// 檢查是否已有同名試算表,如果沒有則創建新的
const spreadsheets = DriveApp.getFilesByName(sheetTitle);
let sheet;
if (spreadsheets.hasNext()) {
const file = spreadsheets.next();
sheet = SpreadsheetApp.openById(file.getId());
Logger.log("已有試算表,使用現有的:" + sheet.getUrl());
} else {
sheet = SpreadsheetApp.create(sheetTitle);
Logger.log("新建試算表完成:" + sheet.getUrl());
}
使用 DriveApp.getFilesByName()
方法檢查是否已有同名試算表,使用 SpreadsheetApp.create()
方法創建新的試算表,使用 Logger.log("新建試算表完成:" + sheet.getUrl());
方法記錄試算表的 URL。
設定表單回應目的地
// 設定表單回應目的地為試算表
form.setDestination(FormApp.DestinationType.SPREADSHEET, sheet.getId());
使用 setDestination()
方法設定表單的回應目的地,使用 FormApp.DestinationType.SPREADSHEET
指定目的地類型為試算表,並使用 sheet.getId()
指定試算表 ID。
完整範例代碼
你可以使用以下完整範例代碼來創建或編輯表單:
function createOrEditBoltNewForm() {
// 定義表單標題和對應的試算表標題
const formTitle =
"26/04/25 - AI 寫程式神器 bolt.new — 讓你開發效率提升 100 倍!";
const sheetTitle = `${formTitle} 回應`;
// 嘗試查找是否已存在同名表單
const forms = DriveApp.getFilesByName(formTitle);
let form;
// 如果表單已存在,則打開它;否則創建新表單
if (forms.hasNext()) {
const file = forms.next();
form = FormApp.openById(file.getId());
Logger.log("已有表單,進行編輯:" + form.getEditUrl());
} else {
form = FormApp.create(formTitle);
Logger.log("新建表單完成:" + form.getEditUrl());
}
// 設置表單描述,包括活動詳情和講者介紹
form.setDescription(
"感謝你有興趣參加本次免費線上講座!\n" +
"我將介紹 AI 寫程式工具 bolt.new,並示範如何從 0 寫出完整 Web App,幫助你提升開發效率。\n\n" +
"📅 活動時間:2025 年 4 月 26 日(星期六)下午 2:00 – 4:00\n" +
"📍 活動地點:Jitsi Meet 線上會議\n" +
"💡 活動完全免費,歡迎自由參加!\n\n" +
"🎤 講者介紹 — Calpa Liu\n\n" +
"- 全端工程師,曾獲 ETHGlobal Taipei 黑客松 1inch 賽道第二名\n" +
"- 使用 AI 工具開發 Web3 儀表板 OrbitGO\n" +
"- 專精 AI 寫程式工具,如 bolt.new、ChatGPT 等\n" +
"- 擅長把開發知識用簡單語言分享給新手與工程師"
);
// 清除表單中的所有舊題目
const items = form.getItems();
for (let i = 0; i < items.length; i++) {
form.deleteItem(items[i]);
}
// 添加新的表單題目
// 姓名(必填文本題)
form.addTextItem().setTitle("你的姓名是?").setRequired(true);
// 程式經驗(必填單選題)
form
.addMultipleChoiceItem()
.setTitle("你目前的程式經驗?")
.setChoiceValues([
"完全新手",
"有寫過簡單網頁",
"熟悉前端開發",
"熟悉後端或全端開發",
])
.setRequired(true);
// 興趣點(必填複選題,可自定義其他選項)
form
.addCheckboxItem()
.setTitle("你對這場講座最感興趣的是?")
.setChoiceValues([
"想了解 bolt.new 是什麼",
"想看實際 AI 寫程式的操作示範",
"想知道如何用 AI 加速 Side Project",
"想學會如何下指令給 AI 工具",
"對 AI 工具與開發整合的未來趨勢有興趣",
])
.showOtherOption(true)
.setRequired(true);
// Email(必填,帶驗證的文本題)
form
.addTextItem()
.setTitle("請留下你的 Email")
.setValidation(FormApp.createTextValidation().requireTextIsEmail().build())
.setRequired(true);
// Telegram(必填文本題)
form.addTextItem().setTitle("Telegram").setRequired(true);
// 偏好語言(必填單選題)
form
.addMultipleChoiceItem()
.setTitle("你偏好的講座語言是?")
.setChoiceValues(["粵語", "國語", "都可以"])
.setRequired(true);
// 訂閱意願(必填單選題)
form
.addMultipleChoiceItem()
.setTitle("你是否願意日後收到更多關於 AI 寫程式的相關資訊、教學或文章?")
.setChoiceValues(["願意,我對 AI 寫程式的內容很有興趣", "暫時不需要,謝謝"])
.setRequired(true);
// 檢查是否已有同名試算表,如果沒有則創建新的
const spreadsheets = DriveApp.getFilesByName(sheetTitle);
let sheet;
if (spreadsheets.hasNext()) {
const file = spreadsheets.next();
sheet = SpreadsheetApp.openById(file.getId());
Logger.log("已有試算表,使用現有的:" + sheet.getUrl());
} else {
sheet = SpreadsheetApp.create(sheetTitle);
Logger.log("新建試算表完成:" + sheet.getUrl());
}
// 設定表單回應的目的地為試算表
form.setDestination(FormApp.DestinationType.SPREADSHEET, sheet.getId());
}
結論
Google Apps Script 為創建和管理 Google Forms 提供了強大而靈活的工具。透過程式化地創建表單、設定問題和連接到 Google Sheets,我們可以大大提高工作效率,減少重複工作。
範例代碼展示了一個實際應用場景:創建一個技術講座的註冊表單,並自動將回應存儲到 Google Sheets。這種方法不僅節省了手動創建表單的時間,還確保了表單的一致性和數據的有組織性。
隨著 AI 和自動化工具的不斷發展,像 bolt.new 這樣的工具與 Google Apps Script 的結合,將進一步提升開發效率。掌握這些技術,將使我們在數位化工作流程中更加得心應手。
參考資源
- Google Forms Service 官方文件
- Google Apps Script 官方指南
- Google Apps Script 教學與範例(官方文件)
- Google Apps Script 網上教學(YouTube)