如果单元格包含“ DEL”,则删除行的脚本效率更高

时间:2019-02-12 04:56:58

标签: google-apps-script google-sheets

我有超过50,000行的Google表格,我每天都会用新数据进行更新。在一天结束时,我运行一个“ IF”函数,该函数可以帮助我确定是否要删除该行。

然后,我编写了一个脚本,该脚本可浏览工作表并删除特定列中具有“ DEL”的任何行。问题在于,由于我有很多行,因此脚本需要很长时间才能运行。是否有人想出一种更有效的方式来删除/清除行(如果单元格中包含字母“ DEL”)?

    function deleteRows() {
      var sheet = SpreadsheetApp.getActive().getSheetByName('DEL_test');
      var rows = sheet.getDataRange();
      var numRows = rows.getNumRows();
      var values = rows.getValues();

      var rowsDeleted = 0;
      for (var i = 0; i <= numRows - 1; i++) {
        var row = values[i];
        if (row[9] == 'DEL') { // Search cells in Column "J" and delete row if cell is equal to "DEL"
          sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
          rowsDeleted++;
        }
      }
      Browser.msgBox('COMPLETE');
    };

2 个答案:

答案 0 :(得分:1)

  • 您想有效地删除“ J”列中带有DEL的行。

如何使用Sheets API?使用Sheets API时,一个API调用可以删除几行。这样,将能够降低处理成本。我认为针对您的情况有几种解决方法。因此,请仅考虑其中之一。

使用表格API时,请在高级Google服务和API控制台上启用表格API。您可以在here 上查看有关如何启用Sheets API的信息。

修改后的脚本:

function deleteRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('DEL_test');
  var rows = sheet.getDataRange();
  var values = rows.getValues();
  var spreadsheetId = ss.getId();
  var sheetId = sheet.getSheetId();
  var reqs = values.reduceRight(function(ar, e, i) {
    if (e[9] == 'DEL') {
      ar.push({"deleteDimension":{"range":{
        "sheetId": sheetId,
        "dimension": "ROWS",
        "startIndex": values.length - i - 1,
        "endIndex": values.length - i,
      }}});
    }
    return ar;
  }, []);
  Sheets.Spreadsheets.batchUpdate({"requests": reqs}, spreadsheetId);  
  Browser.msgBox('COMPLETE');
}

参考文献:

如果我误解了您的问题,请告诉我。我想修改它。

编辑:

如果您不想使用Sheets API,而想使用clearContent(),那么该示例脚本如何?该示例脚本的流程如下。

  1. 检索所有值。
  2. 仅检索“ J”列中没有“ DEL”的行。
  3. 输入值。

示例脚本:

function deleteRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('DEL_test');
  var rows = sheet.getDataRange();
  var values = rows.getValues();
  sheet.clearContents();
  var val = values.filter(function(e) {return e[9] != 'DEL'});
  sheet.getRange(1, 1, val.length, val[0].length).setValues(val);
  Browser.msgBox('COMPLETE');
}

注意:

  • 我不确定您的实际电子表格。因此,如果这不是您想要的结果,可以提供示例电子表格吗?这样,我想修改脚本。

答案 1 :(得分:0)

目前,我已经不再希望使用“ deleteRow”,因为它似乎是一个操作缓慢的功能。这导致我暂时使用此脚本。谢谢大家给我的时间。

  var spreadsheet = SpreadsheetApp.getActive().getSheetByName('DEL_test');
  var rows = spreadsheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues(); 
  var lr = spreadsheet.getLastRow();

  for (var i = 0; i < numRows; i++) {
    if (values[i][9] == 'DEL') {
      spreadsheet.getRange(i+1, 1, 1, 10).clearContent();
    }
  }