Apps Script表单提交无法创建含数据Google Docs,仅生成空白PDF求助
问题排查与修复方案
核心问题分析
- 文件夹ID参数错误:
DriveApp.getFolderById("Spa Job Log Repository")传入的是文件夹名称而非实际Drive文件夹ID(ID是一串类似1abcXYZ...的字符),直接导致获取文件夹失败。 - 文档复制时机错误:先将空白文档复制到目标文件夹,之后才写入表单数据,导致目标文件夹内是空白副本,写入内容的文档留在Drive根目录。
- 文件夹存在性判断逻辑无效:直接调用
getFoldersByName(folderName).next(),找不到文件夹会抛出异常,无法进入else分支。 - 响应获取方式不可靠:读取表格最后一行获取响应,短时间多提交易出现数据错乱;表单触发函数可通过事件对象直接获取当前提交的响应,更准确。
修复后的完整代码
function onFormSubmitTrigger(e) { // 直接通过事件对象获取当前提交的响应,无需读取表格最后一行 var formResponse = e.response.getItemResponses(); createDocFromFormResponse(formResponse); } function createDocFromFormResponse(formResponse) { var folderId = "替换成你的目标文件夹ID"; // 此处填写实际的Drive文件夹ID var targetFolder; try { targetFolder = DriveApp.getFolderById(folderId); } catch (err) { Logger.log("目标文件夹不存在,错误信息:" + err); return; } // 生成唯一文档名称,避免重名覆盖 var timestamp = new Date().toISOString().replace(/[:.]/g, "-"); var docName = "表单响应_" + timestamp; // 创建文档并写入表单内容 var newDoc = DocumentApp.create(docName); var body = newDoc.getBody(); // 按问题+答案的格式遍历写入 formResponse.forEach(function(itemResp, index) { var question = itemResp.getItem().getTitle(); var answer = itemResp.getResponse(); body.appendParagraph("Q" + (index + 1) + ": " + question); body.appendParagraph("A" + (index + 1) + ": " + answer); body.appendParagraph("---"); // 添加分隔线增强可读性 }); newDoc.saveAndClose(); // 将文档移动到目标文件夹(而非复制) var docFile = DriveApp.getFileById(newDoc.getId()); docFile.moveTo(targetFolder); } function createTrigger() { var formId = '1jGAWZXcOHOfbM1uk88QMBg-yl4VdSHxynRM-NHawASQ'; var form = FormApp.openById(formId); // 删除已存在的同名触发器,避免重复执行 var existingTriggers = ScriptApp.getProjectTriggers(); existingTriggers.forEach(function(trigger) { if (trigger.getHandlerFunction() === 'onFormSubmitTrigger') { ScriptApp.deleteTrigger(trigger); } }); // 创建新的表单提交触发器 ScriptApp.newTrigger('onFormSubmitTrigger') .forForm(form) .onFormSubmit() .create(); }
关键修复点说明
- 事件对象获取响应:表单触发时函数自动接收
e参数,通过e.response直接获取当前提交的问题与答案,避免并发提交导致的数据错乱。 - 修正文件夹ID:将
folderId替换为目标文件夹的实际ID(可在Drive文件夹URL中获取)。 - 先写内容再移动文档:创建文档后立即写入数据,保存后再移动到目标文件夹,确保目标文件夹内的文档有内容。
- 唯一文档名:添加时间戳,避免多提交时文档重名覆盖。
- 异常处理:用try-catch捕获文件夹不存在的情况,避免脚本崩溃。
- 清理重复触发器:创建新触发器前删除旧的同名触发器,防止重复执行。
内容的提问来源于stack exchange,提问作者Jones
相关产品推荐
相关产品推荐

