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

Google Apps Script报错及表单图片插入PDF问题求助

问题1:解决TypeError: Cannot read properties of undefined (reading 'namedValues')

这个错误的核心是表单提交事件对象e未被正确传入,常见原因和解决方法:

  • 禁止手动运行onFormSubmit函数:手动运行时没有表单提交的事件上下文,e为undefined,必然触发报错。必须通过实际提交表单触发,或在函数内添加模拟测试逻辑。
  • 检查触发器配置:
    1. 打开脚本编辑器 → 点击「编辑」→「当前项目的触发器」
    2. 确认触发器类型为「表单提交」,关联对象是你的目标表单/表格,触发函数选择onFormSubmit
    3. 若触发器绑定的是表格,确保表格已和表单正确关联,提交数据能正常同步到表格
  • 添加容错逻辑:在onFormSubmit开头增加判断,避免手动运行报错,同时支持测试:
    function onFormSubmit(e){
      // 容错处理:无事件对象时用测试数据
      if (!e || !e.namedValues) {
        console.log("请通过表单提交触发,或使用测试数据");
        const testInfo = {
          'Full Name': ['测试用户'],
          'Gender': ['男'],
          'Age': ['25'],
          'Mobile Number +91 -': ['1234567890'],
          'Email Id': ['test@example.com'],
          'Street / Landmark / Village Name': ['测试地址1'],
          'Block Name / Post Name / Town': ['测试地址2'],
          'District / City': ['测试城市'],
          'State / UT': ['测试省份'],
          'Pin Code': ['123456'],
          'Profession': ['工程师'],
          'Work Experience': ['3年'],
          'Upload your passport size photograph': ['https://drive.google.com/open?id=你的测试图片ID']
        };
        createPDF(testInfo);
        deleteTemp();
        return;
      }
      const info = e.namedValues;
      createPDF(info);
      deleteTemp();
    }
    
问题2:插入表单提交的图片到PDF

原代码仅替换图片URL文本,需修改为插入实际图片,步骤如下:

  1. 提取图片文件ID:表单上传的图片链接格式为https://drive.google.com/open?id=XXX,通过正则提取XXX部分作为文件ID
  2. 获取图片Blob并插入文档:找到文档中{photo}的位置,删除文本后插入图片

修改createPDF函数中的图片处理部分,替换原有的body.replaceText("{photo}", ...):

// 处理图片插入
const photoUrl = info['Upload your passport size photograph'][0];
// 提取图片ID
const photoFileId = photoUrl.match(/id=([^&]+)/)[1];
const photoBlob = DriveApp.getFileById(photoFileId).getBlob();

// 定位{photo}并替换为图片
const photoMarker = "{photo}";
const textRange = body.findText(photoMarker);
if (textRange) {
  const element = textRange.getElement();
  const start = textRange.getStartOffset();
  const end = start + photoMarker.length;
  // 删除标记文本
  element.deleteText(start, end);
  // 插入图片,可调整宽高
  body.insertImage(start, photoBlob).setWidth(100).setHeight(120);
}
修改后的完整代码
function onFormSubmit(e){
  // 容错处理:无事件对象时用测试数据
  if (!e || !e.namedValues) {
    console.log("请通过表单提交触发,或使用测试数据");
    const testInfo = {
      'Full Name': ['测试用户'],
      'Gender': ['男'],
      'Age': ['25'],
      'Mobile Number +91 -': ['1234567890'],
      'Email Id': ['test@example.com'],
      'Street / Landmark / Village Name': ['测试地址1'],
      'Block Name / Post Name / Town': ['测试地址2'],
      'District / City': ['测试城市'],
      'State / UT': ['测试省份'],
      'Pin Code': ['123456'],
      'Profession': ['工程师'],
      'Work Experience': ['3年'],
      'Upload your passport size photograph': ['https://drive.google.com/open?id=你的测试图片ID']
    };
    createPDF(testInfo);
    deleteTemp();
    return;
  }
  const info = e.namedValues;
  createPDF(info);
  deleteTemp();
}


function createPDF(info){
  const docFile = DriveApp.getFileById("1L7PT2BmT6BF5CHuOhwIYO2fMONxlX3-gPnVTH0HwO6Q");
  const tempFolder = DriveApp.getFolderById("183kQJO9hTKStqbLkjS0XE6Fo8P11AiwT");
  const pdfFolder = DriveApp.getFolderById("1pfQS679sYw5Pos6QxfXRXj_VtvN0aOeQ");

  const newTempFile = docFile.makeCopy(tempFolder);
  const openDoc = DocumentApp.openById(newTempFile.getId());
  const body = openDoc.getBody();
  
  // 替换文本字段
  body.replaceText("{date}", new Date());
  body.replaceText("{name}", info['Full Name'][0]);
  body.replaceText("{gender}", info['Gender'][0]);
  body.replaceText("{age}", info['Age'][0]);
  body.replaceText("{number}", info['Mobile Number +91 -'][0]);
  body.replaceText("{email}", info['Email Id'][0]);
  body.replaceText("{addr1}", info['Street / Landmark / Village Name'][0]);
  body.replaceText("{addr2}", info['Block Name / Post Name / Town'][0]);
  body.replaceText("{city}", info['District / City'][0]);
  body.replaceText("{state}", info['State / UT'][0]);
  body.replaceText("{pin}", info['Pin Code'][0]);
  body.replaceText("{profession}", info['Profession'][0]);
  body.replaceText("{experience}", info['Work Experience'][0]);

  // 处理图片插入
  const photoUrl = info['Upload your passport size photograph'][0];
  const photoFileId = photoUrl.match(/id=([^&]+)/)[1];
  const photoBlob = DriveApp.getFileById(photoFileId).getBlob();
  
  const photoMarker = "{photo}";
  const textRange = body.findText(photoMarker);
  if (textRange) {
    const element = textRange.getElement();
    const start = textRange.getStartOffset();
    const end = start + photoMarker.length;
    element.deleteText(start, end);
    body.insertImage(start, photoBlob).setWidth(100).setHeight(120);
  }

  openDoc.saveAndClose();
  
  const blobPDF = newTempFile.getAs(MimeType.PDF)
  const pdfFile = pdfFolder.createFile(blobPDF).setName(info['Full Name'][0]);
}

function deleteTemp() {
    var folder = DriveApp.getFolderById("183kQJO9hTKStqbLkjS0XE6Fo8P11AiwT")
    var files = folder.getFiles();
    while(files.hasNext()){
      files.next().setTrashed(true);
    }
}

内容的提问来源于stack exchange,提问作者Prashant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:44:53