为什么执行UrlFetchApp.fetchAll()后调用处理函数会报forEach不存在错误?
问题原因分析
- 直接传参报错的核心原因:
UrlFetchApp.fetchAll(req)方法的返回值是HTTPResponse对象组成的一维数组,每个元素都是Google Apps Script内置的HTTP响应实例,并不是你在日志里看到的嵌套数组结构。你在stringform函数里遍历第一层数组后拿到的A是HTTPResponse对象,没有forEach方法,自然就抛出TypeError: A.forEach is not a function报错。 - 手动复制赋值可以正常运行的原因:
Logger.log()打印响应对象时,会自动调用HTTPResponse的getContentText()方法输出响应的文本内容,你复制的是已经序列化为JSON格式的嵌套数组字符串,手动赋值给asdf的时候变量结构和stringform预期的入参结构完全匹配,所以可以正常执行。
修复方案
你只需要在拿到fetchAll返回结果后,先批量把每个响应对象转换为实际的JSON数据即可,修改后的代码参考如下:
// 使用UrlFetchApp.fetchAll()的修改后版本 function useFetchAll(req) { // fetchAll返回的是HTTPResponse对象数组 var responseList = UrlFetchApp.fetchAll(req); // 逐个转换响应对象为实际业务数据 var formatData = responseList.map(respItem => JSON.parse(respItem.getContentText())); // 传入转换后的数据即可正常运行 Logger.log(stringform(formatData)); } function stringform(asdf) { let formad = ''; asdf.forEach(A => { A.forEach(r => { formad += r.join(',') + '%0A'; }); }); return formad; }
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

