【问题标题】:More Efficient Script for Delete Row If Cell Contains "DEL"如果单元格包含“DEL”,则删除行的更有效脚本
【发布时间】:2019-02-14 00:02:03
【问题描述】:

我有一个超过 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');
    };

【问题讨论】:

  • 暂时我已经消除了使用“deleteRow”的希望,因为它看起来是一个操作缓慢的功能。这导致我使用这个暂时有效的脚本。谢谢大家给我时间。
  • 使用“erase-remove”模式:将所有要删除的内容移动到一个位置(例如工作表的末尾),找到该位置的边界,然后批量删除。跨度>
  • @Kevin Hall 很抱歉我的回答对您的情况没有用处。我想学习更多。

标签: google-apps-script google-sheets


【解决方案1】:
  • 您希望有效地删除“J”列中带有DEL 的行。

使用 Sheets API 怎么样?使用 Sheets API 时,一次 API 调用可以删除多行。这样,将能够降低处理成本。我认为您的情况有几种解决方法。所以请认为这只是其中之一。

当您使用 Sheets API 时,请在 Google 高级服务和 API 控制台中启用 Sheets 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');
}

注意:

  • 我不确定您的实际电子表格。因此,如果这不是您想要的结果,您能否提供一个示例电子表格?通过这个,我想修改脚本。

【讨论】:

  • 非常感谢您的快速响应!在我最初对 Sheets API 的研究中,我被“免费试用”这个词吓到了,这让我认为它最终会花钱。理想情况下,我正在寻找一个免费的选择。现在我的解决方法是使用“clearContent()”而不是 deleteRow,这似乎是一个更快的功能。如果有人对如何改进脚本有想法,尽管我仍然很感兴趣。谢谢!
  • @Kevin Hall 感谢您的回复。虽然I'm not sure about your situation,关于我理想情况下正在寻找一个免费的选项。不用担心,您可以免费使用Sheets API。例如,您可以在此处查看文档。但是,如果您不想使用 Sheets API,那么添加的示例脚本怎么样?添加的示例脚本使用clearContents()。如果两个示例脚本都不是您想要的,我深表歉意。
【解决方案2】:

目前我已经消除了使用“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();
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2023-01-27
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多