用途
Google No-Code Forms Automation 用于指导用户在不编写自定义集成、不离开浏览器的前提下,构建 Google 表单并将其连接到 Google Apps Script 触发器。它覆盖表单设计、Apps Script 编辑器、onFormSubmit 触发器,以及表单提交后自动运行的小型响应处理脚本。
何时使用
- 用户想要构建 Google 表单并自动化提交后发生的事情。
- 用户需要邮件提醒、电子表格记录或对表单回复进行条件处理。
- 用户想要可粘贴到表单绑定脚本项目中的 Apps Script 代码片段。
如果用户需要自定义 UI、付费 API 或完整的独立 Apps Script 应用,则不应使用本技能。
主要能力与使用方式
第 1 步:在表单界面中定义表单
在 Google 表单中创建表单,设置清晰的问题、答案类型(简答、多选、复选框)和必填字段。让问题 ID 与脚本后续需要的内容相匹配。为表单添加说明,让填写者知道预期内容。
第 2 步:打开绑定的 Apps Script 编辑器
在表单中依次进入“扩展程序”>“Apps Script”。这会打开一个绑定到该表单的项目。脚本可以通过 e.response 事件对象读取每次提交。
第 3 步:编写响应处理函数
添加一个接收 onFormSubmit 事件的函数,使用 getItemResponses() 读取 e.response,然后执行所需操作:发送邮件、写入电子表格或根据答案分支。
第 4 步:安装触发器
在 Apps Script 中打开时钟/触发器菜单,选择 onFormSubmit 函数,事件来源选择“来自表单”,事件类型选择“表单提交”,然后保存并授权。此后每次新提交都会自动运行该函数。
第 5 步:用真实提交进行测试
从隐私/无痕窗口提交一条测试回复,确认邮件、表格行或日志只到达一次。在 Apps Script 执行页面(编辑器中的“执行记录”)检查错误,若失败则阅读堆栈跟踪。
示例
示例 1:每次回复发送邮件通知
function onFormSubmit(e) {
const response = e.response;
const email = getEmail(response);
MailApp.sendEmail({
to: email,
subject: "Form submission received",
body: "Thank you. We have recorded your response."
});
}
function getEmail(response) {
// Requires Forms' VERIFIED email collection, not an email question or responder input.
const form = FormApp.getActiveForm();
if (!form.collectsEmail()) throw new Error("Verified email collection is required");
// Configure the form to Verified in the UI; Apps Script's boolean alone does not prove it.
if (PropertiesService.getScriptProperties().getProperty("VERIFIED_EMAIL_COLLECTION_APPROVED") !== "yes") {
throw new Error("Owner must verify and approve the form's email-collection mode");
}
const email = response.getRespondentEmail();
if (!email || !/^[^\s,@]+@[^\s,@]+\.[^\s,@]+$/.test(email)) throw new Error("Missing verified recipient");
// Limit one receipt per verified address per six hours under an atomic script lock.
const lock = LockService.getScriptLock();
lock.waitLock(5000);
try {
const cache = CacheService.getScriptCache();
if (cache.get(email)) throw new Error("Receipt already sent");
if (MailApp.getRemainingDailyQuota() < 20) throw new Error("Mail quota reserve reached");
cache.put(email, "sent", 21600);
} finally { lock.releaseLock(); }
return email;
}
示例 2:将每条回复记录到 Google 表格
function onFormSubmit(e) {
const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName("Responses");
const itemResponses = e.response.getItemResponses();
const asText = value => {
const text = Array.isArray(value) ? value.join(", ") : String(value ?? "");
return /^[\s\u0000-\u001f]*[=+@-]/.test(text) ? "'" + text : text;
};
const row = [new Date()].concat(itemResponses.map(r => asText(r.getResponse())));
sheet.appendRow(row);
}
示例 3:根据多选题答案分支
function onFormSubmit(e) {
const items = e.response.getItemResponses();
for (const item of items) {
if (item.getItem().getTitle().toLowerCase() === "priority") {
const priority = item.getResponse();
const subject = priority === "High" ? "[URGENT] " : "";
MailApp.sendEmail({ to: MANAGER_EMAIL, subject: subject + "New submission", body: itemResponsesText(e) });
}
}
}
最佳实践
- ✅ 在告诉用户可用之前,用真实提交测试每个触发器。
- ✅ 使用清晰、稳定的问题标题,让脚本按标题匹配项目,而不是依赖脆弱的索引。
- ✅ 将密钥和 API 密钥保存在脚本属性中,绝不硬编码在文件里。
- ✅ 在处理逻辑周围添加 try/catch,并用 Logger.log 记录错误,使失败在执行页面中显现。
- ❌ 不要授予宽泛的权限范围;以表单操作所需的最小权限运行。
- ❌ 不要向表单未合法收集的地址发送邮件。
限制
- 适用 Apps Script 配额(邮件速率限制、每日触发器、执行时间);高流量需要评估。
- 只有表单提交会触发事件;用户对回复的编辑默认不会触发 onFormSubmit。
- 该技能生成的是用户必须自行粘贴、授权和部署的脚本;它本身无法创建 Google 表单项目。
- 表格集成需要表格的 ID 和权限,必须与用户确认。
安全与安全说明
- 脚本在用户的 Google 账户内以其声明的权限范围运行。请审查授权提示,只授予最小请求范围。
- 不要在表单脚本或共享文件中记录、打印或嵌入密码、OAuth 令牌或 API 密钥。
- 表单回复可能来自任何被分享该表单的人;在采取行动前验证输入。
- 先在受控环境中测试;触发器一旦上线,每次提交都会发送邮件或追加行。
常见陷阱
- 问题:处理函数对每次提交都运行并重复工作。 解决:优先使用单一事件对象 e.response;不要在 onFormSubmit 内单独查询表单已存储的回复。
- 问题:item.getResponse() 对可选问题返回 undefined。 解决:用真值检查进行防护,或将问题设为必填。
- 问题:邮件发到了错误地址。 解决:按包含“email”的问题标题进行匹配,并在发送前验证收集到的值属于填写者。
相关技能
- @google-sheets-automation - 当回复记录目标是需要自身自动化的表格时使用。
- @google-docs-automation - 当表单输出应创建或更新 Google 文档时使用。