【问题标题】:Delete rows based on values within cell, optimising根据单元格内的值删除行,优化
【发布时间】:2018-11-11 06:37:59
【问题描述】:

我有一个脚本每周运行一次,从文档中删除行,然后将这些值粘贴到另一个工作表以进行数据分析,但是随着文档的增长(+20,0000 行)我的脚本超时。无论如何如何优化脚本以使用更少的处理/内存并运行得更快?

var rowsDeleted = 0;
for (var i = 0; i <= numRows - 1; i++) {
var row = values[i];
if (row[0] == 'delete' || row[0] == '') {
data.deleteRow((parseInt(i)+1) - rowsDeleted);
rowsDeleted++;
}
}

【问题讨论】:

  • 抱歉回复晚了。我无法访问互联网,我尝试了您的解决方案并且它有效。非常感谢您的详尽回答,我也将其标记为正确。干杯!
  • 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。

标签: javascript for-loop google-apps-script google-sheets reverse-iterator


【解决方案1】:

在你的情况下,我的理解如下。

  • 有很多行被删除。
  • 行未继续。所以必须使用deleteRow()逐行删除行。

如果我的理解是正确的,那么这个修改呢?

修改点:

  • 使用表格 API 的批量更新。
    • 通过使用 Sheets API,可以通过一次 API 调用删除离散行。
  • 创建被删除的行列表作为 Sheets API 的请求正文。
  • 使用请求正文通过 Sheets API 的 batchUpdate 删除行。

要使用 Sheets API,请在 Google 高级服务和 API 控制台中启用 Sheets API。具体开启方法请查看here

修改后的脚本:

var spreadsheetId = "#####"; // Please input spreadsheet ID.
var sheetId = "#####"; // Please input sheet ID.

var deleteRows = [];
for (var i = values.length - 1; i >= 0; i--) {
  if (values[i] == "delete" || values[i] == "") {
    deleteRows.push({
      "deleteRange": {
        "shiftDimension": "ROWS",
        "range": {
          "startRowIndex": i,
          "endRowIndex": i + 1,
          "sheetId": sheetId
        }
      }
    });
  }
}
Sheets.Spreadsheets.batchUpdate({"requests": deleteRows}, spreadsheetId);

注意:

  • 在这个修改后的脚本中,假设从电子表格中检索到的值位于values
  • 在运行此之前,请输入电子表格 ID 和具有要删除的行的工作表 ID。

如果这不是你想要的结果,我很抱歉。

【讨论】:

    【解决方案2】:

    试试

    var result = values.filter(row => row[0] !== 'delete' && row[0] !== '');
    var rowsDeleted = values.length - result.length;
    

    【讨论】:

    • 感谢您的意见!在“var 结果”行上给我一个语法错误。也不是专家因此无法找到问题。
    • @Look13 该错误发生在 2018 年,因为 Apps 脚本不支持箭头功能。新的运行时 (Chrome V8) 可以。
    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    相关资源
    最近更新 更多