Вопрос по google-sheets, google-apps-script – Удалить строку в Google Spreadsheets, если значение ячейки в указанной строке равно 0 или пусто

19

Я хотел бы иметь возможность удалить всю строку в электронных таблицах Google, если введено значение, скажем, для столбца & quot; C & quot; в этой строке 0 или пусто. Есть ли простой сценарий, который я мог бы написать, чтобы выполнить это? Спасибо!

Ваш Ответ

9   ответов
16

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

/**
 * Deletes rows in the active spreadsheet that contain 0 or
 * a blank valuein column "C". 
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function readRows() {
  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[2] == 0 || row[2] == '') {
      sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
      rowsDeleted++;
    }
  }
};

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the readRows() function specified above.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Remove rows where column C is 0 or blank",
    functionName : "readRows"
  }];
  sheet.addMenu("Script Center Menu", entries);
};
Test spreadsheet before:

enter image description here

Running script from menu:

enter image description here

After running script:

enter image description here

Это сработало для меня, спасибо :)
Кажется, что меню Центра сценариев не добавлено в мою таблицу. Я не совсем понимаю, как это сделать /
Это не работает, если строка полностью пуста, потому что .getDataRange () не выбирает пустые строки.
0

function onOpen() {
  // get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // create menu
  var menu = [{name: "Evaluate Column C", functionName: "deleteRow"}];

  // add to menu
  ss.addMenu("Check", menu);
}

function deleteRow() {
  // get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // get active/selected row
  var activeRow = ss.getActiveRange().getRowIndex();

  // get content column C
  var columnC = ss.getRange("C"+activeRow).getValue();

  // evaluate whether content is blank or 0 (null)
  if (columnC == '' || columnC == 0) {
    ss.deleteRow(parseInt(activeRow));
  }
}

Этот скрипт создаст меню при загрузке файла и позволит вам удалить строку, основываясь на критериях, установленных в столбце C, илиnot.

Интересно, хотел ли Зак, чтобы его полный лист переупорядочивался автоматически, или хотел сам решать?
3

что мне удалось сделать работу. Вы можете видеть, что я перебрал лист назад, так что, поскольку строка была удалена, следующая строка не будет пропущена. Надеюсь, это кому-нибудь поможет.

  function UpdateLog() {

  var returnSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('RetLog');
  var rowCount = returnSheet.getLastRow();

  for (i = rowCount; i > 0; i--) {
    var rrCell = 'G' + i;
    var cell = returnSheet.getRange(rrCell).getValue();
    if (cell > 0 ){
      logSheet.
      returnSheet.deleteRow(i);
    }
  }
}
0

Use filtering to only show the rows which you want to delete. For example, my column based on which I want to delete rows had categories on them, A, B, C. Through the filtering interface I selected only A and B, which I wanted to delete. Select all rows and delete them. Doing this, in my example, effectively selected all A and B rows and deleted them; now my spreadsheet does not show any rows. Turn off the filter. This unhides my C rows. Done!
@ Серж, я был одурачен небольшим различием вопроса в названии и тексте. Предложит отредактировать.
Это должно быть сделаноby script
13

Допустим, вы хотите удалить строки с пустым текстом в столбце C. Сортируйте данные (Меню данных -> Сортировать лист по столбцу C, A-> Z) в листе с столбцом C.r.t, чтобы все пустые строки текста были доступны вместе.

Просто выберите все эти строки и щелкните правой кнопкой мыши - & gt; удалить строки. Затем вы можете пересортировать данные в соответствии с нужной вам колонкой. Готово.

Удивительно! Работает для меня
ЭтоKISS как ответ
Я не знаю, почему я об этом не подумал! :-) Спасибо.
5

поэтому мой обходной путь - использовать & quot; Фильтр & quot; инструмент.

Select all spreadsheet data Click filter tool icon (looks like wine glass) Click the newly available filter icon in the first cell of the column you wish to search. Select "Filter By Condition" > Set the conditions (I was using "Text Contains" > "word")

Это оставит строки, содержащие слово, которое вы ищете, и они могут быть удалены путем массового выбора их, удерживая клавишу Shift & gt; щелкните правой кнопкой мыши & gt; удалить строки.

1

 function try_It(){
 deleteRow(2); //// choose col = 2 for column C
 }

 function deleteRow(col){ // col is the index of the column to check for 0 or empty
 var sh = SpreadsheetApp.getActiveSheet();
 var data = sh.getDataRange().getValues();
 var targetData = new Array();
 for(n=0;n<data.length;++n){
 if(data[n][col]!='' && data[n][col]!=0){ targetData.push(data[n])};
 }
 Logger.log(targetData);
 sh.getDataRange().clear();
 sh.getRange(1,1,targetData.length,targetData[0].length).setValues(targetData);
 }

EDIT : re-reading the question I'm not sure if the question is asking for a 'live' on Edit function or a function (like this above) to apply after data has been entered... It's not very clear to me... so feel free to be more accurate if necessary ;)

Я думаю, что код этого ответа является наиболее эффективным с точки зрения времени выполнения. Это следует использовать, когда лист имеет только значения ячеек (нет примечаний, комментариев, проверок данных, пользовательского форматирования и т. Д.).
Просто для информации, другой ответ лучше, так как мой нет & apos; обрабатывать формулы (если вообще есть формулы в СС) и является более простым.
21
function onEdit(e) {
  //Logger.log(JSON.stringify(e)); 
  //{"source":{},"range":{"rowStart":1,"rowEnd":1,"columnEnd":1,"columnStart":1},"value":"1","user":{"email":"","nickname":""},"authMode":{}}
  try {
    var ss = e.source; // Just pull the spreadsheet object from the one already being passed to onEdit
    var s = ss.getActiveSheet();

    // Conditions are by sheet and a single cell in a certain column
    if (s.getName() == 'Sheet1' &&  // change to your own 
        e.range.columnStart == 3 && e.range.columnEnd == 3 &&  // only look at edits happening in col C which is 3
        e.range.rowStart == e.range.rowEnd ) {  // only look at single row edits which will equal a single cell
      checkCellValue(e); 
    }
  } catch (error) { Logger.log(error); }
};

function checkCellValue(e) {
  if ( !e.value || e.value == 0) {  // Delete if value is zero or empty
    e.source.getActiveSheet().deleteRow(e.range.rowStart);
  }
}

а не значения на всем листе.

Я взял это и изменилonEdit() к произвольному имени функции, потому что я хочу запустить его на данных, которые уже есть, а не во время редактирования, но у него странное поведение: когда я выбираю его из диспетчера сценариев и запускаю его, он удаляетone грести и останавливаться, тогда я должен запустить его снова. Заменяется ли цикл при изменении количества существующих строк?
Да, BrianP, вам не нужна дополнительная коррекцияdelete переменная, если вы повторяете в обратном направлении. Ну, может быть, это просто в моей голове :)
@BryanP, вы должны избегать циклов for-in в Javascript, потому что он перебирает все свойства, а не только те, которые вы ему присвоили. Вот статья, которая обсуждает это:yuiblog.com/blog/2006/09/26/for-in-intrigue
Я никогда не использую этот "ярлык" синтаксис, вот почему я спрашивал ... но мой вопрос был глупым, я на самом деле не видел, что вы используетеvalues мой мозг перевел это какvalues.length... Думаю, иногда я бываю слишком усталым ;-); Во всяком случае, спасибо за ответ, я не знаю, как лучше поступить ... Думаю, это более или менее важно. личных префов!
@BryanP, не проще ли повторить в обратном направлении?for( var row = values.length -1; row >= 0; --row )
0

    function myFunction() {

      var ss = SpreadsheetApp.getActiveSpreadsheet();  // get active spreadsheet

      var activeRow = ss.getActiveRange().getRowIndex();  // get active/selected row

var start=1;
var end=650;
var match='';
var match2=0;   //Edit this according to your choice.

     for (var i = start; i <= end; i++) {
      var columnC = ss.getRange("C"+i).getValue();
      if (columnC ==match  || columnC ==match2){ ss.deleteRow(i); }
     }
    }

Похожие вопросы