使用Apps Script从电子表格批量创建带自定义表单项的Google Forms
问题解决说明
1 原forEach语法错误原因
你之前的代码报错是因为单行箭头函数的forEach只会执行紧跟其后的第一句代码,添加表单项的逻辑写在了循环作用域外,既拿不到item变量,还会重复创建表单。正确的forEach写法需要用花括号包裹所有循环内逻辑,示例如下:
range.forEach(item => { const form = FormApp.create(item); // 所有添加表单项的逻辑都要写在这个花括号内 form.addTextItem().setTitle('姓名'); })
2 表单存入指定文件夹的实现方案
你需要结合DriveApp接口,对每个生成的表单创建对应子文件夹并移动文件,修改后的完整代码如下:
function createForms() { // 邮箱格式校验规则 const emailValidation = FormApp.createTextValidation() .setHelpText('输入内容必须为邮箱地址') .requireTextIsEmail() .build(); // 替换引号内的内容为你指定的父文件夹ID,可从文件夹浏览器地址栏的URL中获取 const parentFolder = DriveApp.getFolderById('替换为你的父文件夹ID'); const ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('courses'); const values = ss.getDataRange().getValues(); for (let i = 0; i < values.length; i++) { // 如果你的表格每行有多列,需根据实际结构调整索引,[0]表示取当前行第一列的内容作为表单名 const formName = values[i][0]; // 1. 创建表单 const form = FormApp.create(formName); // 2. 添加固定表单项 form.addTextItem().setTitle("姓名").setHelpText('请输入你的全名').setRequired(true); form.addTextItem().setTitle("邮箱地址").setRequired(true).setValidation(emailValidation).setHelpText('请输入有效邮箱地址'); form.addParagraphTextItem().setTitle('具体说明').setHelpText('请描述你需要说明的相关细节').setRequired(true); form.addMultipleChoiceItem().setTitle("可选日期").setHelpText('选择你最合适的日期').setRequired(true) .setChoiceValues(['周一', '周二','周三','周四','周五']); // 3. 在父文件夹下创建和表单同名的独立子文件夹 const childFolder = parentFolder.createFolder(formName); // 4. 获取刚创建表单的Drive文件对象 const formFile = DriveApp.getFileById(form.getId()); // 5. 将表单移动到对应子文件夹 childFolder.addFile(formFile); // 6. 删除云端硬盘根目录下的默认表单副本 DriveApp.getRootFolder().removeFile(formFile); } }
注意事项
- 首次运行脚本如果触发权限申请,按引导完成授权即可
- 如果不需要中文的表单提示,可自行替换为对应的英文内容
内容的提问来源于stack exchange,提问作者Tim Welch
相关产品推荐
相关产品推荐

