【问题标题】:Improve function delete rows by contain value通过包含值改进函数删除行
【发布时间】:2017-04-11 06:39:24
【问题描述】:

我有工作代码,如果列符合条件之一,则从工作表中删除行。它基于数组,因此比标准 google sheet deleteRow 函数运行得更快。我这样称呼它:

deleteRowsBV('SIZ',4,'0','')

在哪里

deleteRowsBV(listName,ColNum,FirstSearch,SecondSearch) 

我想要的是一个带有或多或少等号的调用函数,像这样:

deleteRowsBV('SIZ',4,<='0',=='')

但是对于我的 main 函数,当我指定一个变量而不是符号和值时,它不起作用。 这是主要功能:

function deleteRowsBV(listName,ColNum,FirstSearch,SecondSearch) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(listName);
  var DataLengBefore = sheet.getLastRow();
  var DataColLeng = sheet.getLastColumn();
  var data = sheet.getRange(1,1,DataLengBefore,DataColLeng).getValues();
  for (var i = data.length-1; i >= 0; i--) {
    if (data[i][ColNum] <= FirstSearch||data[i][ColNum] == SecondSearch) {
      data.splice(i, 1);
    }
  }
  sheet.getRange(10, 1, DataLengBefore,DataColLeng).clearContent();
  sheet.getRange(10, 1,data.length,5).setValues(data);
}

【问题讨论】:

    标签: arrays if-statement google-apps-script google-sheets


    【解决方案1】:

    基于此related post,电子表格的行和列从 1 开始编号,对于 SpreadsheetApp 中的所有方法,而 javascript 数组从 0 开始编号。在使用两者时,您需要在这些数字基数之间进行调整。删除行时,电子表格 dataRange 的大小会变小;您确实考虑到了这一点,但是由于您要循环到最大大小,因此该要求使代码变得复杂。您可以通过从最大值向下循环来简化事情。

    您可以参考此thread。但是,这现在只查看单个单元格编辑中的值,而不是整个工作表中的值。

    function onEdit(e) {
      //Logger.log(JSON.stringify(e)); 
      //{"source":{},"range":{"rowStart":1,"rowEnd":1,"columnEnd":1,"columnStart":1},"value":"1","user":{"email":"","nickname":""},"authMode":{}}
      try {
        var ss = e.source; // Just pull the spreadsheet object from the one already being passed to onEdit
        var s = ss.getActiveSheet();
    
        // Conditions are by sheet and a single cell in a certain column
        if (s.getName() == 'Sheet1' &&  // change to your own 
            e.range.columnStart == 3 && e.range.columnEnd == 3 &&  // only look at edits happening in col C which is 3
            e.range.rowStart == e.range.rowEnd ) {  // only look at single row edits which will equal a single cell
          checkCellValue(e); 
        }
      } catch (error) { Logger.log(error); }
    };
    
    function checkCellValue(e) {
      if ( !e.value || e.value == 0) {  // Delete if value is zero or empty
        e.source.getActiveSheet().deleteRow(e.range.rowStart);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-17
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 2014-03-18
      • 2012-11-07
      • 1970-01-01
      相关资源
      最近更新 更多