Google Apps Script中getRespondentEmail数组去重失败排查
问题根因
代码执行顺序错误。
你在getEmails还是空数组、还未执行循环推入任何邮箱数据的阶段,就提前运行了去重逻辑var uniqueResponses = [...new Set(getEmails)];,此时uniqueResponses已经被赋值为空数组。后续循环往getEmails追加数据的操作,不会反向修改已经完成赋值的uniqueResponses,因此最终日志输出永远为空。
额外注意:form.setCollectEmail(true)仅对设置生效后新提交的表单响应有效,开启设置前产生的历史响应,调用getRespondentEmail()会返回空字符串,直接去重会残留无效空值。
修正后代码
function test(){ var form = FormApp.openById('替换为你的实际表单ID'); form.setCollectEmail(true); var formResponses = form.getResponses(); var getEmails = []; // 先收集全量有效邮箱 for (var i = 0; i < formResponses.length; i++) { var formResponse = formResponses[i]; var oneEmail = formResponse.getRespondentEmail(); // 过滤历史响应产生的空邮箱 if (oneEmail) { getEmails.push(oneEmail); } } // 数据收集完成后再执行去重 var uniqueResponses = [...new Set(getEmails)]; Logger.log(uniqueResponses); }
排查提示
- 数据处理逻辑需遵循「先收集全量数据,再做去重、过滤、格式转换」的顺序,禁止在数据填充完成前提前计算最终结果
- 若修正后仍拿到空结果,优先检查表单ID是否正确、当前账号是否有表单访问权限、待处理的响应是否为开启邮箱收集功能后提交的新响应
- 历史提交的响应无法通过
getRespondentEmail()补取提交者邮箱,该接口不会回溯历史数据
内容的提问来源于stack exchange,提问作者Ada Eloka
相关产品推荐
相关产品推荐

