Более эффективный скрипт для удаления строки, если ячейка содержит «DEL» - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть более 50 000 строк Google Sheet, которые я обновляю каждый день новыми данными.В конце дня я запускаю функцию «ЕСЛИ», которая помогает мне определить, хочу ли я удалить эту строку.

Затем я написал сценарий, который просматривает лист и удаляет любую строку, имеющую «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 голосов
/ 13 февраля 2019

В настоящее время я удалил надежду на использование «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();
    }
  }
0 голосов
/ 12 февраля 2019
  • Вы хотите эффективно удалить строки с DEL в столбце "J".

Как насчет использования Sheets API?Когда используется Sheets API, несколько строк могут быть удалены одним вызовом API.Благодаря этому стоимость процесса будет уменьшена.Я думаю, что есть несколько обходных путей для вашей ситуации.Поэтому, пожалуйста, подумайте об этом, как об одном из них.

Когда вы используете Sheets API, пожалуйста, включите Sheets API в Advanced Google Services и консоли API.О том, как включить 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. Извлечение только тех строк, которые не имеют "DEL" в столбце "J".
  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');
}

Примечание:

  • Я не уверен в вашей фактической электронной таблице.Так что, если это не тот результат, который вы хотите, можете ли вы предоставить образец таблицы?По этому я хотел бы изменить скрипт.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...