You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

谷歌表单提交后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:27:04