Google Apps Script报错及表单图片插入PDF问题求助
问题1:解决TypeError: Cannot read properties of undefined (reading 'namedValues')
这个错误的核心是表单提交事件对象e未被正确传入,常见原因和解决方法:
- 禁止手动运行
onFormSubmit函数:手动运行时没有表单提交的事件上下文,e为undefined,必然触发报错。必须通过实际提交表单触发,或在函数内添加模拟测试逻辑。 - 检查触发器配置:
- 打开脚本编辑器 → 点击「编辑」→「当前项目的触发器」
- 确认触发器类型为「表单提交」,关联对象是你的目标表单/表格,触发函数选择
onFormSubmit - 若触发器绑定的是表格,确保表格已和表单正确关联,提交数据能正常同步到表格
- 添加容错逻辑:在
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文本,需修改为插入实际图片,步骤如下:
- 提取图片文件ID:表单上传的图片链接格式为
https://drive.google.com/open?id=XXX,通过正则提取XXX部分作为文件ID - 获取图片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
相关产品推荐
相关产品推荐

