javascript - 为什么我的循环在带有 Google Apps 脚本的 Google 表格中仅运行一次?

标签 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 = '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);
}

最佳答案

序言

由于对该问题的评论涉及到该问题,因此我添加了几个需要考虑的优化点,从长远来看,关注它们将使您受益。

建议

  1. 迁移到新的 V8 运行时以利用最新的 ES6 功能和语法:
  2. 利用内置的Array方法,如mapreducefilter等 -它提高了可读性,减少了错误潜入的可能性(因为您忘记将 i 更改为 j - 正是您的情况)。
  3. 使用解构赋值 - 同样,它可以提高可读性,尤其是与 TypeScript(或 JSDoc)结合使用时会很有趣(+改进的类型安全性)。
  4. 尽可能多地使用 const(除非您确实需要重新分配 - 然后使用 let,而不是 var),最肯定永远不要使用未声明的变量(我假设dataRange是在代码示例之前的某个地方定义的,但以防万一......)。
  5. [编辑]这可能听起来违反直觉,但变量并不意味着重写,这个名称指的是它们可以容纳任何值。因此,请避免重置(例如 let data = 'some_val'; data; data = 'new_val') - 它会导致困惑和/或有错误的代码。相反,贴一张新的或尽量避免使用它(见下文)。

优化代码

这不是目前最好的版本,但绝对是一个开始(例如,您可以将 getRange() 移出循环,以大幅提高大型集合的执行速度,发出并发问题使用 Promise.all() 向 API 发出请求 - 感谢 V8 - 等)

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);
}

注释

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

引用文献

  1. 变量声明 guide
  2. Array 内置方法 reference在 MDN 上
  3. 迁移到 V8 运行时 guide
  4. 解构赋值 guide在 MDN 上

关于javascript - 为什么我的循环在带有 Google Apps 脚本的 Google 表格中仅运行一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60705901/

相关文章:

javascript - 我可以在 Google 脚本编辑器(Google Apps 脚本)中调试 JavaScript 代码吗

javascript - 从网站上抓取表格,使用 javascript :subOpen href link

google-apps-script - 使用 Google Apps 脚本删除 Google 表格中的行

javascript - 在html页面中从sqlite收取数据(addon firefox)

javascript - 将鼠标悬停在父元素上会显示子元素的 href

google-apps-script - 在 Google Apps 脚本中列出 YouTube channel 的所有视频

google-apps-script - 将新工作表添加到 Google 工作簿时发送电子邮件

mysql - 从应用程序脚本到本地 MySQL 的 JDBC 连接

javascript - 使用 contenteditable div 时隐藏移动设备上的软键盘

javascript - AngularJS http.jsonp 回调未定义