it-swarm.com.ru

Удаление строк в листах Google с помощью скрипта Google Apps

Я столкнулся с самой странной ошибкой при попытке удалить строки, которые соответствуют определенному значению, с помощью скрипта Google.

Вот мой код:

function myFunction() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = doc.getSheetByName("file.csv");

  var values = sheet.getRange("N2:N").getValues();

  var row_del = new Array();

  for(var i=0;i<values.length;i++)
  {
    if(values[i] == 'del'){
      row_del.Push(i+2); // This line was added for debugging purposes.
     // sheet.deleteRow(i+2) was the line that was in this condition
     // (i+2) is used because row 1 has headers and the range starts from 0.
    }
  }

//  Logger.log(row_del);
//  GmailApp.sendEmail("my_email_address", "subject", row_del)

  for (var i = 0; i < row_del.length; i++)
  {
    sheet.deleteRow(row_del[i]);
  }

}

Код, который я написал, выбирает номера строк, которые должны быть удалены, но не все эти строки удаляются с первой попытки. Я должен выполнить свой сценарий несколько раз, чтобы эти строки были удалены. 

Если в моем коде есть ошибка, он должен появиться, и если логика неверна, неправильные строки должны быть удалены. Я не сталкиваюсь ни с одним из этих сценариев, и я должен просто выполнить эту функцию несколько раз.

Есть что-то, что я здесь скучаю? 

4
Bharath Sankar

Когда строка удаляется с листа, строки под ней перенумеровываются, даже если сценарий продолжает выполняться. Если впоследствии сценарий также попытается удалить эти строки, результат будет непредсказуемым. По этой причине при удалении строк следует идти снизу вверх. В твоем случае вот так:

for (var i = row_del.length - 1; i>=0; i--) {
  sheet.deleteRow(row_del[i]); 
}
8
user3717023

увеличивать я, только если вы не удалили строку

function del_F_rows(){
 var i=1;
 while(!sht_balanceHistory.getRange(i,1).isBlank()){
  if(sht_balanceHistory.getRange(i,3).getValue()=="F")
     sht_balanceHistory.deleteRow(i);
  else
     i=i+1;
    }
}
0
amr osama

Скопируйте вставку из: https://Gist.github.com/dDondero/285f8fd557c07e07af0e

Вместо того, чтобы повторять циклы по строкам дважды, вы можете сосчитать, сколько строк было удалено, чтобы вычислить правильный индекс для строки, которую вы удалите следующей. 

function deleteRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  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[0] == 'delete' || row[0] == '') { // This searches all cells in columns A (change to row[1] for columns B and so on) and deletes row if cell is empty or has value 'delete'.
      sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
      rowsDeleted++;
    }
  }
};
0
tomstar

Так вот как это должно выглядеть? 

function myFunction() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = doc.getSheetByName("Sheet1");

  var values = sheet.getRange("A:A").getValues();

  var row_del = new Array();

  for(var i=0;i<values.length;i++)
  {
    if(values[i] == 'N'){
      row_del.Push(i+2); // This line was added for debugging purposes.
     // sheet.deleteRow(i+2) was the line that was in this condition
     // (i+2) is used because row 1 has headers and the range starts from 0.
    }
  }

//  Logger.log(row_del);
//  GmailApp.sendEmail("my_email_address", "subject", row_del)

  for (var i = row_del.length - 1; i>=0; i--) { sheet.deleteRow(row_del[i]); }

}

0
DavidJ101

Вы можете просто удалить строки, изменив последнюю строку, используя функцию deleteRows, например:

var maxRows = newsheet.getMaxRows(); 
var lastRow = newsheet.getLastRow();
if (maxRows-lastRow != 0)
{
  newsheet.deleteRows(lastRow+1, maxRows-lastRow);
}
0
Diana Shivakumar