GSheet 脚本:如何优化我的行和 Sheet 迭代器
GSheet Script: How to Optimize my Row and Sheet Iterator
长话短说,我有一段 Google 脚本可以自动清除 GSheet 中的内容。它被设置在一个触发器上并且可以正常工作......代码完成了它应该做的事情。问题是它 运行 很慢。迭代器到 运行 需要 2 到 3 分钟。为了帮助您确定任务的大小:8 个 sheet 中的每个都有 150 行。
代码的objective是根据一行第一列单元格的值,在每个sheet上清空若干行。
所以我想知道是否有人有任何见解或建议来改进 运行ning 时间。我理解我使用 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()
}}}}
通常您希望尽可能少地写入传播sheet。目前,您的代码遍历每一行并在必要时进行编辑。而是将您将要使用的整个数据范围放入一个变量中(假设 dRange
并使用 .getValues()
将所有值的二维数组放入第二个变量中(假设 dValues
)。然后简单地遍历 dValues
,在每个要清除的值中设置一个空白 ""
。完成所有值的遍历后,只需执行 dRange.setValues(dValues)
(这就是我说的原因将范围保存在一个单独的变量中。例如,如果列 A
具有 0
,则以下内容将清除列 B
到 F
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 行的单个 sheet,这需要几秒钟。需要注意的一件事是,我是根据你的脚本编写的,你在 C2
中设置了一个日期值,但是在你的脚本中(因此在我根据你的脚本编写的脚本中)落在你要检查的范围内被清除,所以仔细检查你的范围
长话短说,我有一段 Google 脚本可以自动清除 GSheet 中的内容。它被设置在一个触发器上并且可以正常工作......代码完成了它应该做的事情。问题是它 运行 很慢。迭代器到 运行 需要 2 到 3 分钟。为了帮助您确定任务的大小:8 个 sheet 中的每个都有 150 行。
代码的objective是根据一行第一列单元格的值,在每个sheet上清空若干行。
所以我想知道是否有人有任何见解或建议来改进 运行ning 时间。我理解我使用 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()
}}}}
通常您希望尽可能少地写入传播sheet。目前,您的代码遍历每一行并在必要时进行编辑。而是将您将要使用的整个数据范围放入一个变量中(假设 dRange
并使用 .getValues()
将所有值的二维数组放入第二个变量中(假设 dValues
)。然后简单地遍历 dValues
,在每个要清除的值中设置一个空白 ""
。完成所有值的遍历后,只需执行 dRange.setValues(dValues)
(这就是我说的原因将范围保存在一个单独的变量中。例如,如果列 A
具有 0
B
到 F
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 行的单个 sheet,这需要几秒钟。需要注意的一件事是,我是根据你的脚本编写的,你在 C2
中设置了一个日期值,但是在你的脚本中(因此在我根据你的脚本编写的脚本中)落在你要检查的范围内被清除,所以仔细检查你的范围