长话短说,我有一个 Google Script 可以自动清除 GSheet 中的内容。它设置在触发器上并且可以工作……代码完成了它应该做的事情。问题是它运行缓慢。迭代器运行需要 2 到 3 分钟。为了帮助您确定任务的大小:8 张纸中的每张纸上有 150 行。
该代码的目的是根据行第一列中单元格的值清除每张工作表上的许多行。
所以我想知道是否有人对改进运行时间有任何见解或建议。我了解我使用 for 循环逐行检查行的方法,这是一项耗时的任务。我想不出带有数组或其他东西的替代方法?
谢谢大家!
这是代码:
function Reset_Button() {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i = 1; i < sheets.length ; i++ ) {
var sheet = sheets[i];
sheet.getRange("C2").setValue(new Date());
var rangeData = sheet.getDataRange();
var lastRow = rangeData.getLastRow();
var searchRange = sheet.getRange(1,1, lastRow, 1);
for ( j = 1 ; j < lastRow ; j++){
var value = sheet.getRange(j,1).getValue()
if(value === 0){
sheet.getRange(j,2,1,5).clearContent()
}}}}
通常,您希望尽可能少地写入电子表格。目前,您的代码会遍历每一行并在必要时对其进行编辑。而是将您将使用的整个数据范围放入一个变量中(假设dRange
并使用.getValues()
将所有值的二维数组放入第二个变量中(假设dValues
)。然后简单地迭代dValues
,""
在每个您想要的地方设置一个空白清楚。一旦你完成去在所有的值,只是做了dRange.setValues(dValues)
(这就是为什么我说要保持在一个单独的变量范围内)。因此,作为一个例子,下面将清除列B
通过F
,如果列A
有一个0
function test(){
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i = 1; i <sheets.length; i++) {
sheets[i].getRange("C2").setValue(new Date());
var dRange = sheets[i].getDataRange();
var dValues = dRange.getValues();
for (var j = 1; j < dRange.getLastRow(); j++){
if (dValues[j][0] == 0) {
for (var c = 1; c < 6; c++) {
dValues[j][c] = ""
}
}
}
dRange.setValues(dValues);
}
}
对于约 170 行的单张纸,这需要几秒钟。需要注意的一件事是,我是根据您的脚本编写的,您C2
在您的 sript 中设置了一个日期值(因此在我根据您的脚本编写的那个)中,该值落在您检查要清除的范围内,所以加倍检查你的范围
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句