如果在该行中为“C”列输入的值为 0 或空白,我希望能够删除 Google 电子表格中的整行。有没有我可以编写的简单脚本来完成此操作?谢谢!
11 回答
我可以在不使用脚本的情况下提出一个简单的解决方案!
假设您要删除 C 列中带有空文本的行。对工作表中的 C 列中的数据进行排序(数据菜单 -> 按 C 列排序,A-> Z),因此所有空文本行将一起可用.
只需选择这些行并右键单击 -> 删除行。然后你可以根据你需要的列重新排序你的数据。完毕。
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);
}
}
这现在只查看单个单元格编辑中的值,而不是整个工作表中的值。
我编写了这个脚本来为我的一个 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);
};
之前测试电子表格:
从菜单运行脚本:
运行脚本后:
我在使用脚本时遇到了一些问题,所以我的解决方法是使用“过滤器”工具。
- 选择所有电子表格数据
- 单击过滤器工具图标(看起来像酒杯)
- 单击要搜索的列的第一个单元格中的新可用过滤器图标。
- 选择“按条件过滤”>设置条件(我使用的是“文本包含”>“单词”)
这将留下包含您搜索的单词的行,并且可以通过在按住 shift 键 > 右键单击 > 删除行的同时批量选择它们来删除它们。
这就是我设法完成的工作。您可以看到我在工作表中向后循环,以便在删除一行时不会跳过下一行。我希望这对某人有所帮助。
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);
}
}
}
有一个更简单的方法:
- 使用过滤仅显示要删除的行。例如,我要删除行的列上有类别,A,B,C。通过过滤界面,我只选择了要删除的A和B。
- 选择所有行并删除它们。在我的示例中,这样做有效地选择了所有 A 行和 B 行并将它们删除;现在我的电子表格没有显示任何行。
- 关闭过滤器。这会取消隐藏我的 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);
}
编辑:重新阅读问题我不确定问题是在编辑功能上要求“实时”还是在输入数据后应用功能(如上)......这对我来说不是很清楚。 ..因此,如有必要,请随时更准确;)
仔细阅读你的问题,我想出了这个解决方案:
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 列中设置的标准删除一行,或者不删除。
有一种简短的方法可以解决这个问题,而不是脚本。选择整个数据>转到菜单>单击数据选项卡>选择创建过滤器>单击列标题旁边的过滤器>将出现弹出窗口,然后检查要删除的值>单击确定并将过滤后的数据复制到不同的工作表>完成
这个简单的代码为我完成了这项工作!
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); }
}
}
下面的代码能够在特定列 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