32

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

4

11 回答 11

27

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

假设您要删除 C 列中带有空文本的行。对工作表中的 C 列中的数据进行排序(数据菜单 -> 按 C 列排序,A-> Z),因此所有空文本行将一起可用.

只需选择这些行并右键单击 -> 删除行。然后你可以根据你需要的列重新排序你的数据。完毕。

于 2015-05-29T08:41:42.053 回答
25
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);
  }
}

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

于 2012-11-16T04:35:36.183 回答
22

我编写了这个脚本来为我的一个 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);
};

之前测试电子表格:

在此处输入图像描述

从菜单运行脚本:

在此处输入图像描述

运行脚本后:

在此处输入图像描述

于 2013-03-11T20:31:55.660 回答
7

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

  1. 选择所有电子表格数据
  2. 单击过滤器工具图标(看起来像酒杯)
  3. 单击要搜索的列的第一个单元格中的新可用过滤器图标。
  4. 选择“按条件过滤”>设置条件(我使用的是“文本包含”>“单词”)

这将留下包含您搜索的单词的行,并且可以通过在按住 shift 键 > 右键单击​​ > 删除行的同时批量选择它们来删除它们。

于 2017-06-28T16:37:53.187 回答
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);
    }
  }
}
于 2016-12-30T15:45:11.513 回答
2

有一个更简单的方法:

  1. 使用过滤仅显示要删除的行。例如,我要删除行的列上有类别,A,B,C。通过过滤界面,我只选择了要删除的A和B。
  2. 选择所有行并删除它们。在我的示例中,这样做有效地选择了所有 A 行和 B 行并将它们删除;现在我的电子表格没有显示任何行。
  3. 关闭过滤器。这会取消隐藏我的 C 行。完毕!
于 2015-04-29T14:36:46.987 回答
2

很简单的要求。尝试这个 :

 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);
 }

编辑重新阅读问题我不确定问题是在编辑功能上要求“实时”还是在输入数据后应用功能(如上)......这对我来说不是很清楚。 ..因此,如有必要,请随时更准确;)

于 2012-11-15T21:52:27.907 回答
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 列中设置的标准删除一行,或者删除。

于 2012-11-16T19:49:57.407 回答
0

有一种简短的方法可以解决这个问题,而不是脚本。选择整个数据>转到菜单>单击数据选项卡>选择创建过滤器>单击列标题旁边的过滤器>将出现弹出窗口,然后检查要删除的值>单击确定并将过滤后的数据复制到不同的工作表>完成

于 2021-08-26T16:30:44.560 回答
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); }
     }
    }
于 2016-04-22T21:50:16.870 回答
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
于 2020-09-19T07:18:12.757 回答