首页 > 解决方案 > 慢得离谱的 Apps-Script 循环

问题描述

我刚刚从 excel 切换到 Google 表格,我不得不经历一些学习曲线,继续使用现在称为“宏”或脚本。

无论如何,不​​久之后,我编写了一个循环来遍历 B 列中的所有内容,如果它小于 50,则删除该行。

它有效,我很高兴,但它太慢了。我有大约 16,000 行,我可能会以更多行结束。我让它运行了大约 4 分钟,它甚至没有摆脱 1,000 行。我拒绝相信流行的编程语言是如此缓慢,因为它被删除了 20 行,所以我仍然可以阅读内容。

function grabData(){  
  let sheet = SpreadsheetApp.getActive().getSheetByName("Keywords");
  var rangeData = sheet.getDataRange();
  var lastColumn = rangeData.getLastColumn();
  var lastRow = rangeData.getLastRow();
  let range = sheet.getRange("B2:B16000");
  let values=range.getValues();

  for (var i = 0, len = values.length; i<len;  i++){
    if(values[i] <= 50 ){
      sheet.deleteRow(i);
      i--
      len--
    };
  };
}

我一直在某处看到某些东西没有被重置,但我不知道这意味着什么。

是因为数组长度从 16,000 开始,当我删除一行时,我没有正确考虑它?

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


因为我从不使用公式,所以我会这样做:

function grabData() {
  let ss = SpreadsheetApp.getActive();
  let sh = ss.getSheetByName("Keywords");
  let rg = s.getRange(2, 2, sh.getLastRow() - 1, sh.getLastColumn());
  let values = rg.getValues();
  let oA = [];
  values.forEach((r, i) => {
    if (r[0] > 50) {
      oA.push(r);
    }
  });
  rg.clearContent();
  sh.getRange(2,1,oA.length,oA[0].length).setValues(oA);
}

它要快得多,但它可能会弄乱你的公式。这是我从不使用公式的原因之一。删除行很慢。几乎你对 UI 所做的任何事情都很慢。


推荐阅读