Delete rows based on values within cell, optimising

天涯浪子 提交于 2020-06-17 11:05:33

问题


I have script running on a weekly bases deleting rows from a document and then pasting these values to another sheet for data analysis, however as the document grows (+20,0000 rows) my script times out. Anyway on how to optimise the script to perhaps use less processing/memory and run faster?

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++;
}
}

回答1:


In your situation, I understand as follows.

  • There are a lot of rows which are deleted.
  • The rows are not continued. So the rows have to be deleted row by row using deleteRow().

If my understanding is correct, how about this modification?

Modification points :

  • Use batchUpdate of Sheets API.
    • By using Sheets API, the discrete rows can be deleted by one API call.
  • Create the list of rows which are deleted as the request body for Sheets API.
  • Delete the rows by batchUpdate of Sheets API with the request body.

In order to use Sheets API, please enable Sheets API at Advanced Google Services and API console. About the how to enable them, please check here.

Modified script :

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);

Note :

  • In this modified script, it supposes that the retrieved values from Spreadsheet is in values.
  • Before you run this, please input spreadsheet ID and sheet ID having the rows you want to delete.

If this was not result what you want, I'm sorry.




回答2:


try

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


来源:https://stackoverflow.com/questions/50638014/delete-rows-based-on-values-within-cell-optimising

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!