为何第二个循环仅执行一次?多ID API查询脚本故障排查
问题根源:全局变量
i导致循环冲突 你代码里的两个循环都使用了未声明的变量i,这会让i成为全局变量,导致两个循环的计数器互相干扰:
- 当
requestById的循环第一次调用submitById时,内部的循环会把全局的i修改为res.tasks[0].result[0].items.length的值 - 回到
requestById的循环时,这个全局的i已经大于等于ids.length,循环直接终止,后续的ID自然不会执行
修复方案:给每个循环的计数器声明局部变量
在两个循环里用let(推荐)或var声明i,将变量限定在当前函数的作用域内,避免全局污染:
// Makes the request by ID function requestById() { var ids = sheet.getRange(2,1,sheet.getLastRow() - 1).getValues() // 声明局部变量i,避免全局污染 for (let i = 0; i < ids.length; i++) { submitById(ids[i][0]) } } // Fetches the results from the API function submitById(x) { var url = "{api URL}" + x const options = { contentType: "application/json", headers: { Authorization: "Basic " + b64apiKey, 'Content-Type': 'application/json'}, } var res = JSON.parse(UrlFetchApp.fetch(url, options)) Logger.log(x) // 同样声明局部变量i for (let i = 0; i < res.tasks[0].result[0].items.length; i++) { Logger.log(res.tasks[0].result[0].items[i]) } }
这样修改后,每个循环的计数器都是独立的局部变量,submitById内部的循环不会影响requestById的循环进度,所有ID都会完整执行查询和遍历逻辑。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

