谷歌表单提交后ArrayFormula计算值无法存入PDF问题求助
问题解决方法
根因说明
谷歌表单提交触发的事件对象e.namedValues仅收录用户在表单内主动提交的字段数据,你通过ArrayFormula在表格中自动计算得到的Total score、Results等值属于表格侧生成的衍生数据,不会被包含在e.namedValues中,因此读取时会返回空值,导致PDF对应位置无内容。
修复方案
不要从事件对象的namedValues读取计算字段,改为直接从谷歌表格的对应行读取计算完成的实际值,还可以新增短延时避免ArrayFormula计算延迟导致的取值为空问题。
修改后代码
function afterFormSubmit(e) { // 获取提交的行号和目标表格 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("students"); const entryRow = e.range.getRow(); // 加1秒延时,确保ArrayFormula计算完成,可根据实际情况调整时长 Utilities.sleep(1000); // 从表格对应行读取所有需要的字段,包括计算字段 // 注意:getRange的第二个参数是列号,需要根据你自己表格的实际列顺序调整,以下为示例 const timeStamp = sheet.getRange(entryRow, 1).getValue(); // 假设时间戳在第1列 const firstName = sheet.getRange(entryRow, 2).getValue(); // 假设First name在第2列 const lastName = sheet.getRange(entryRow, 3).getValue(); // 假设Last name在第3列 const totalScore = sheet.getRange(entryRow, 7).getValue(); // 替换为Total score对应的实际列号 const results = sheet.getRange(entryRow, 8).getValue(); // 替换为Results对应的实际列号 // 把读取到的值打包传给createPDF函数 const formData = { timeStamp, firstName, lastName, totalScore, results }; const pdfFile = createPDF(formData); // 存PDF链接到第9列,和原逻辑一致 sheet.getRange(entryRow, 9).setValue(pdfFile.getUrl()); } function createPDF(formData){ const pdfFolder = DriveApp.getFolderById("my pdf folder"); const tempFolder = DriveApp.getFolderById("my temp folder"); const templateDOC = DriveApp.getFileById("my template doc"); const newTempFile = templateDOC.makeCopy(tempFolder); const openDoc = DocumentApp.openById(newTempFile.getId()); const body = openDoc.getBody(); // 替换模板占位符 body.replaceText("{_}", formData.timeStamp); body.replaceText("{__}", formData.firstName); body.replaceText("{___}", formData.lastName); body.replaceText("{____}", formData.totalScore); body.replaceText("{_____}", formData.results); openDoc.saveAndClose(); const blobPDF = newTempFile.getAs(MimeType.PDF); const pdfFile = pdfFolder.createFile(blobPDF).setName(formData.firstName + " " + formData.lastName); return pdfFile; }
注意事项
- 替换代码中列号为你自己表格的实际列序号,列号从左到右从1开始计数
- 如果计算逻辑复杂延时较高,可以适当调大
Utilities.sleep的参数值,单位为毫秒 - 确保
students表的ArrayFormula作用范围覆盖到所有新提交的行
内容的提问来源于stack exchange,提问作者George Maidaniuc
相关产品推荐
相关产品推荐

