Google Form AppsScript:未上传文件时的空值报错与邮件内容替换问题
解决Google Apps Script处理表单文件上传空值报错问题
问题根源
- 原代码直接通过
allQuestions[2]索引获取文件上传问题的响应,但可选问题未回答时不会生成对应的ItemResponse,导致Question2为undefined,后续调用Question2.getItem()触发TypeError: Cannot read properties of undefined (reading 'length')。 - 未针对空值场景设置对应的文本提示和HTML显示内容。
修改后的代码
function EmailForm() { // 获取表单实例与所有响应 const form = FormApp.getActiveForm(); const responses = form.getResponses(); // 无响应时直接退出,避免后续报错 if (responses.length === 0) return; // 取最新的一条响应 const latestResponse = responses.pop(); const allItemResponses = latestResponse.getItemResponses(); // 处理问题1(必填文本字段,索引为0) let question1Answer = ""; const question1Resp = allItemResponses.find(resp => resp.getItem().getIndex() === 0); if (question1Resp) { question1Answer = question1Resp.getResponse().toString(); Logger.log("问题1答案:" + question1Answer); } // 处理问题2(可选文件上传字段,索引为2) let question2Text = "未上传文件"; let question2Html = "<em>No answer</em>"; const question2Resp = allItemResponses.find(resp => resp.getItem().getIndex() === 2); if (question2Resp) { const fileIds = question2Resp.getResponse(); // 文件上传返回的是ID数组 if (fileIds.length > 0) { // 生成每个文件的Drive可访问链接 const fileLinks = fileIds.map((id, index) => `<a href="https://drive.google.com/file/d/${id}" target="_blank">文件${index + 1}</a>` ).join("<br>"); question2Text = `已上传${fileIds.length}个文件`; question2Html = fileLinks; } } // 满足条件时发送邮件 if (question1Answer === 'Yes') { const htmlMsg = ` <p>问题1答案:${question1Answer}</p> <p>问题2状态:${question2Html}</p> `; GmailApp.sendEmail('abc@gmail.com', "Incident Reported", "", { htmlBody: htmlMsg }); } }
关键修改说明
- 安全获取响应:用
find()根据问题索引查找对应响应,替代直接索引取值,避免未回答场景下的undefined报错。 - 空值默认处理:提前设置未上传时的文本和HTML内容,确保无论是否上传文件都有合法内容输出。
- 多文件兼容:文件上传的
getResponse()返回ID数组,通过map()批量生成链接,支持多文件上传场景。 - 边界防护:增加无响应时的退出逻辑,避免无数据时触发错误。
内容的提问来源于stack exchange,提问作者Shrisiva
相关产品推荐
相关产品推荐

