Google 表單自動化全攻略:用 Apps Script 提升表單管理效率

作者: Calpa Liu
字數:2551
出版:April 15, 2025
分類: 前端開發 Google Apps Script JavaScript

在現代數位工作流程中,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:表示選擇題的選項
  • 特定類型的項目,如 TextItemMultipleChoiceItemCheckboxItem

創建或編輯表單:代碼分析

基本操作

// 建立或編輯表單
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 Apps Script JavaScript
關於 Calpa

Calpa 擅長使用 TypeScriptReact.jsVue.js 建立 Responsive Website。

他積極參與開源社區,曾在 2019 年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在 GitHub 上公開分享個人博客程式碼,已獲得超過 300 顆星星和 60 個分支的支持。

他熱愛學習新技術,並樂意分享經驗。他相信,唯有不斷學習才能跟上快速演變的技術環境。