微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GSheet 脚本:如何优化我的行和工作表迭代器

如何解决GSheet 脚本:如何优化我的行和工作表迭代器

长话短说,我有一个 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,5).clearContent()
  }}}}

解决方法

通常,您希望尽可能少地写入电子表格。目前,您的代码会遍历每一行并在必要时对其进行编辑。而是将您将要使用的整个数据范围放入一个变量中(假设为 dRange 并使用 .getValues() 将所有值的二维数组放入第二个变量中(假设为 dValues 。然后简单地迭代dValues,在每个你想要清除的地方设置一个空白""。一旦你完成了所有的值,就做一个dRange.setValues(dValues)(这就是我说的原因将范围保留在单独的变量中。因此,例如,如果列 B 具有 F

,以下将清除列 A0
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 中(因此在我根据您的脚本编写的那个)中,它属于您要检查的范围被清除,所以仔细检查你的范围

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。