Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的循环在使用谷歌应用程序脚本的谷歌工作表中只运行一次?_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 为什么我的循环在使用谷歌应用程序脚本的谷歌工作表中只运行一次?

Javascript 为什么我的循环在使用谷歌应用程序脚本的谷歌工作表中只运行一次?,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我无法理解为什么我的循环只运行一次。 我在这里坐了两个小时想弄明白,但运气不好。 请帮忙 var tempSheetValues1 = currentSheet.getRange("B2:B" + lastRow).getValues(); // considering length to be 5 for (var i = 0; i < 5; i++) { var id = tempSheetValues1.slice(i, i + 1).join(''); var url

我无法理解为什么我的循环只运行一次。 我在这里坐了两个小时想弄明白,但运气不好。 请帮忙

var tempSheetValues1 = currentSheet.getRange("B2:B" + lastRow).getValues();

// considering length to be 5
for (var i = 0; i < 5; i++) {
  var id = tempSheetValues1.slice(i, i + 1).join('');

  var url = 'https://api.demo.hitmebro/' + id + '?language=en';
  Logger.log(url);

  // Check if the test id exists
  var response = hitApi(url, "get", null, headers, "inputId");
  Logger.log(response);
  var json = response.getContentText();
  var data = JSON.parse(json);
  var Collection = data.data.inside;
  var rows = [];
  data;

  for (i = 0; i < Collection.length; i++) {
    data = Collection[i];
    var more = rows.push([data.xid]);
  }

  dataRange = currentSheet.getRange(2, 1, rows.length, 1);
  dataRange.setValues(rows);
}
序言

由于对问题的评论涉及到这个问题,我增加了几个优化点来考虑,从长远来看,关注它们会对你有益。 建议

移动到新的V8运行时以使用最新的ES6功能和语法: 利用内置的数组方法,如map、reduce、filter等,它提高了可读性,减少了由于忘记将i改为j而导致bug潜入的可能性,这正是您的情况。 使用DestructuringAssignment——同样,它提高了可读性,尤其是与TypeScript或JSDoc结合使用时,更是一种乐趣+提高了类型安全性。 尽可能多地使用const,除非您真的需要重新分配-并使用let-then,而不是var,最肯定的是永远不要使用未声明的变量我假设dataRange是在代码示例之前定义的,但以防万一。。。。 [编辑]这听起来可能有悖常理,但变量并不意味着要重写,它的名称指的是它们可以保存任何值的事实。因此,请避免像let data='some_val'这样重置;数据数据='new_val'-它会导致混乱和/或错误代码。取而代之的是,你可以换一个新的,或者尽量避免,见下文。 优化代码

这不是最理想的版本,但绝对是一个开始。例如,您可以将getRange从循环中移除,以大幅提高大型集合的执行速度,使用Promise.all-thank V8-等向API发出并发请求

const tempSheetValues1 = currentSheet.getRange("B2:B" + lastRow).getValues();

for (let i = 0; i < 5; i++) {
  const id = tempSheetValues1.slice(i, i + 1).join('');

  const url = `https://api.demo.hitmebro/${id}?language=en`;
  Logger.log(url);

  // Check if the test id exists
  const response = hitApi(url, "get", null, headers, "inputId");
  Logger.log(response);

  const json = response.getContentText();

  const parsed = JSON.parse(json);

  const { data } = parsed;

  const { inside } = data;

  const rows = inside.map(elem => [elem.xid]);

  const dataRange = currentSheet.getRange(2, 1, rows.length, 1);
  dataRange.setValues(rows);
}
注释

希望我在重写内部循环逻辑时没有遗漏任何内容,如果有问题,请随时纠正我。 参考资料

变量声明 MDN上的数组内置方法 迁移到V8运行时 MDN上的分解分配
不要在内部和外部循环中使用VARI。你的内循环改变i,它终止于外循环loop@Justinas我的错,我没有检查。非常感谢。