У меня была эта проблема, и я использовал эту технику .
Это лучшее решение, которое я нашел очень гибким.
Также, пожалуйста, проголосуйте здесь , чтобы добавить поддержку декларации кумулятивного раздела
У меня было несколько проблем со сценариями, поэтому моим обходным путем было использование инструмента «Фильтр».
Это оставит строки, содержащие слово, которое вы ищете, и их можно удалить, выбрав их массой, удерживая клавишу shift> щелкните правой кнопкой мыши> удалить строки.
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);
}
}
Это только просмотр значения из одного изменения ячейки теперь, а не значений всего листа.
values
, мой мозг перевел его как values.length
... Думаю, я, должно быть, слишком устал иногда ;-); В любом случае, спасибо за ответ, я не знаю ни того, что лучше всего подходит ... Думаю, это более или менее вопрос личных предпочтений!
– Serge insas
16 November 2012 в 18:59
onEdit()
на произвольное имя функции, потому что я хочу запустить его на данных, которые уже есть, а не во время редактирования, но имеет странное поведение: когда я выбираю его из диспетчера скриптов и запускаю его, он удаляет строку one i> и останавливается, тогда я должен запустить ее снова. Отключается ли цикл при изменении количества существующих строк?
– hsribei
18 November 2012 в 23:28
for( var row = values.length -1; row >= 0; --row )
– Henrique G. Abreu
20 November 2012 в 02:01
delete
, если вы повторяете назад. Ну, может быть, это проще в моей голове :)
– Henrique G. Abreu
20 November 2012 в 17:22
Существует более простой способ:
внимательно прочитав ваш вопрос, я придумал это решение:
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, или нет.
Я написал этот скрипт, чтобы сделать то же самое для одной из моих электронных таблиц 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);
};
[/g3]
[/g4]
[/g5]
Это то, что мне удалось сделать. Вы можете видеть, что я зацикливаюсь назад через лист, так что, когда строка была удалена, следующая строка не будет пропущена. Надеюсь, это поможет кому-то.
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);
}
}
}
Я могу предложить простое решение без использования скрипта!
Предположим, вы хотите удалить строки с пустым текстом в столбце C. Сортировка данных (меню данных -> Сортировка листа по столбцу C, A-> Z) в листе по столбцу C, поэтому все ваши пустые текстовые строки будут доступны вместе.
Просто выберите эти строки и щелкните правой кнопкой мыши -> удалить строки. Затем вы можете повторно сортировать свои данные в соответствии с нужным столбцом. Готово.
довольно простой запрос. Попробуйте следующее:
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: повторное чтение вопроса. Я не уверен, что вопрос требует «жить» на функции редактирования или функции (например, выше) применять после ввода данных ... Мне это не очень понятно ... поэтому не стесняйтесь быть более точными, если это необходимо;)
Этот простой код выполнил эту работу для меня!
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); }
}
}