Удалить строки на основе значений в ячейке, оптимизируя - PullRequest
0 голосов
/ 01 июня 2018

У меня еженедельно запускается скрипт, который удаляет строки из документа, а затем вставляет эти значения на другой лист для анализа данных, однако по мере роста документа (+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++;
}
}

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

В вашей ситуации я понимаю следующее.

  • Есть много строк, которые удаляются.
  • Строки не продолжаются.Таким образом, строки должны быть удалены строка за строкой, используя deleteRow().

Если мое понимание верно, как насчет этой модификации?

Точки модификации:

  • Использование API batchUpdate of Sheets.
    • Используя API Sheets, можно удалить отдельные строки одним вызовом API.
  • Создать список строк, которые будут удалены как тело запроса для API Sheets.
  • Удалите строки с помощью batchUpdate Sheets API вместе с телом запроса.

Чтобы использовать Sheets API, включите Sheets API в Advanced Google Services и консоли API.О том, как включить их, пожалуйста, проверьте здесь .

Модифицированный скрипт:

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.
  • . Перед тем, как запускать этот код, введите идентификатор таблицы и идентификатор листа, содержащие строки, которые вы хотите удалить.

Если это не было результатом, что вы хотите, извините.

0 голосов
/ 01 июня 2018

попробуй

var result = values.filter(row => row[0] !== 'delete' && row[0] !== '');
var rowsDeleted = values.length - result.length;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...