【发布时间】:2012-06-15 20:50:21
【问题描述】:
如果在该行中为“C”列输入的值为 0 或空白,我希望能够删除 Google 电子表格中的整行。有没有我可以编写的简单脚本来完成此操作? 谢谢!
【问题讨论】:
标签: google-apps-script google-sheets
如果在该行中为“C”列输入的值为 0 或空白,我希望能够删除 Google 电子表格中的整行。有没有我可以编写的简单脚本来完成此操作? 谢谢!
【问题讨论】:
标签: google-apps-script google-sheets
我可以在不使用脚本的情况下提出一个简单的解决方案!
假设您要删除 C 列中包含空文本的行。 在工作表 w.r.t 列 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);
}
}
现在只查看单个单元格编辑中的值,而不是整个工作表中的值。
【讨论】:
values ,我的大脑将其翻译为values.length...我想我有时一定是有点太累了 ;-) ;无论如何,谢谢你的回答,我也不知道最好的方法是什么......我想这或多或少是一个个人喜好问题!
onEdit() 更改为任意函数名称,因为我想在已经存在的数据上运行它,而不是在编辑时运行它,但它有一个奇怪的行为:当我选择它时从脚本管理器中运行它,它会删除 one 行并停止,然后我必须再次运行它。更改存在的行数时会取消循环吗?
for( var row = values.length -1; row >= 0; --row )
delete 变量。好吧,也许它在我的脑海中更简单:)
我编写此脚本是为了对我的一个 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);
};
【讨论】:
TypeError: Cannot call method "getDataRange" of null. (line 10, file "Code")。这可能是我对如何跑步的了解的问题;这是我尝试的第一个 Google 脚本。
我在使用脚本时遇到了一些问题,所以我的解决方法是使用“过滤器”工具。
这将留下包含您搜索的单词的行,并且可以通过在按住 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);
}
}
}
【讨论】:
很简单的请求。试试这个:
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 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
【讨论】:
有一个简短的方法可以解决这个问题,而不是脚本。 选择整个数据>转到菜单>单击数据选项卡>选择创建过滤器>单击列标题旁边的过滤器>将出现弹出窗口,然后检查要删除的值>单击确定并将过滤后的数据复制到不同的工作表>完成
【讨论】: