如果所述行中的单元格值为0或为空,则删除Google Spreadsheets中的行

时间:2012-06-15 20:50:21

标签: google-apps-script google-sheets

如果在该行中为“C”列输入的值为0或空白,我希望能够删除Google Spreadsheets中的整行。有没有一个简单的脚本我可以编写来完成这个? 谢谢!

10 个答案:

答案 0 :(得分: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);
  }
}

这仅查看现在单个单元格编辑的值,而不是整个工作表中的值。

答案 1 :(得分: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);
};

之前测试电子表格:

enter image description here

从菜单运行脚本:

enter image description here

运行脚本后:

enter image description here

答案 2 :(得分:13)

我可以在不使用脚本的情况下建议一个简单的解决方案!

假设您要删除C列中带有空文本的行。 在工作表w.r.t列C中对数据进行排序(数据菜单 - &gt;按列C,A-> Z排序),以便所有空文本行可以一起使用。

只需选择所有这些行并右键单击 - &gt;删除行。 然后,您可以根据所需的列重新排序数据。 完成。

答案 3 :(得分:5)

我遇到了一些脚本问题,所以我的解决方法是使用“过滤器”工具。

  1. 选择所有电子表格数据
  2. 点击过滤器工具图标(看起来像酒杯)
  3. 单击要搜索的列的第一个单元格中的新可用过滤器图标。
  4. 选择“按条件过滤”&gt;设置条件(我使用的是“文本包含”&gt;“单词”)
  5. 这将保留包含您搜索的字词的行,并且可以通过批量选择它们来删除它们,同时按住Shift键&gt;右键单击&gt;删除行。

答案 4 :(得分: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);
    }
  }
}

答案 5 :(得分: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);
 }

编辑重新阅读问题我不确定问题是否要求“直播”。在编辑功能或功能(如上所述)之后,在输入数据后应用......对我来说不是很清楚...如果有必要,请随意更准确;) < / p>

答案 6 :(得分: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列中设置的条件或删除行。

答案 7 :(得分:0)

有一种更简单的方法:

  1. 使用filtering仅显示要删除的行。例如,我想根据其删除行的列上有类别,A,B,C。通过过滤界面,我只选择了A和B,我想删除它。
  2. 选择所有行并删除它们。在我的例子中,这样做有效地选择了所有A和B行并删除了它们;现在我的电子表格没有显示任何行。
  3. 关闭过滤器。这取消了我的C行。完成!

答案 8 :(得分: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); }
     }
    }

答案 9 :(得分:0)

以下代码能够删除特定列G中包含日期早于50天的行,将这些行值移动到备份工作表并从源工作表中删除行。

该代码更好,因为它可以一次性删除行,而不是一一删除。运行快得多。

它不会像建议的某些解决方案那样复制回值(通过推入数组并复制回工作表)。如果我遵循这种逻辑,那么我将失去这些单元格中包含的公式。

我每天晚上(预定)在没有人使用工作表的情况下运行该功能。

function delete_old(){
  //delete > 50 day old records and copy to backup
  //run daily from owner login
  var ss = SpreadsheetApp.getActiveSpreadsheet();  
  var bill = ss.getSheetByName("Allotted");
  var backss = SpreadsheetApp.openById("..."); //backup spreadsheet
  var bill2 = backss.getSheetByName("Allotted");
  var today=new Date();
  //process allotted sheet (bills)
  bill.getRange(1, 1, bill.getMaxRows(), bill.getMaxColumns()).activate();
  ss.getActiveRange().offset(1, 0, ss.getActiveRange().getNumRows() - 1).sort({column: 7, ascending: true});
  var data = bill.getDataRange().getValues();
  var delData = new Array();
  for(n=data.length-1; n>1; n--){
    if(data[n][6] !=="" &&  data[n][6]  < today.getTime()-(50*24*3600*1000) ){  //change the condition as per your situation
      delData.push(data[n]);
    }//if
   }//for
   //get first and last row no to be deleted
   for(n=1;n<data.length; n++){
    if(data[n][6] !=="" &&  data[n][6]  < today.getTime()-(50*24*3600*1000) ){ 
      var strow=n+1 ; //first row
      break
    }//if
   }//for
   for(n=data.length-1; n>1; n--){
    if(data[n][6] !=="" &&  data[n][6]  < today.getTime()-(50*24*3600*1000) ){ 
      var ltrow=n+1 ; //last row
      break
    }//if
   }//for
   var bill2lr=bill2.getLastRow();
   bill2.getRange((bill2lr+1),1,delData.length,delData[0].length).setValues(delData);
   bill.deleteRows(strow, 1+ltrow-strow);
   bill.getRange(1, 1, bill.getMaxRows(), bill.getMaxColumns()).activate();
   ss.getActiveRange().offset(1, 0, ss.getActiveRange().getNumRows() - 1).sort({column: 6, ascending: true}); //get back ordinal sorting order as per column F
}//function
相关问题