javascript - 慢得离谱的 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 开始,当我删除一行时,我没有正确考虑它?
解决方案
因为我从不使用公式,所以我会这样做:
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 所做的任何事情都很慢。
推荐阅读
- python - 在python中将字符串压缩为数字
- php - Firebird 的 blob 大小是否只有 32kb?
- python - 如何枚举标记python中列表的元素?
- c++ - 在 main() 函数中将函数的静态数组返回到另一个数组
- mongodb - 出于分析和调查目的,维护我的 MongoDB 的编辑副本的最佳方法是什么?
- javascript - 当我点击它时,按钮颜色不会改变?
- python - Python - 拆分制表符分隔文件并转换为数据框
- java - Flyway 配置 java.lang.ClassNotFoundException: org.flyway.core.Flyway
- go - 如何在 golang/echo 中结合自定义 HTTP 错误处理程序触发 BasicAuth 提示?
- mysql - Laravel Docker SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known