根据一系列字符串条件删除行
Delete rows based on a range of string conditionals
我有几十个数千行长的电子表格,我想通过删除不满足条件的行来子集它们。
让我举一个简化的例子。 假设 C 行具有大学系名的字符串值(例如"ANTHRO"是人类学,"ART-HIST"是艺术史,等等)。 这所大学有很多系,电子表格中每个系都有很多条目,但我只想要人类学和艺术史的数据。 因此,我的任务是编写一个脚本,删除不满足条件 RowC = "ANTHRO" 或 "ART-HIST" 的每一行。
问题是,我不知道如何在javascript/google-apps-script中定义一个接受一系列(字符串)值的变量。一次尝试让我将"cull"变量定义为一个数组,其中包含脚本将判断数据的条件:
var rowsDeleted = 0;
var keep = ["ANTHRO", "ART-HIST"];
for (var i = 0; i <= numRows - 1; i++) {
var row = values[i];
if (row[2] != keep) {
sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
rowsDeleted++;
}
}
};
然而,它没有奏效。 我知道我可以简单地写if(row[2] != "ANTHRO" || != "ART")
,但实际上有两个以上的条件。 定义所谓的"剔除"变量似乎更有效。
关于为什么阵列方法不起作用的任何见解? 谢谢。
你可以尝试使用indexOf。如果行值不在数组内,它将返回值 -1,否则将返回索引。
var rowsDeleted = 0;
var keep = ["ANTHRO",
"ART-HIST"];
for (var i = 0; i <= numRows - 1; i++) {
var row = values[i];
if (keep.indexOf(row[2]) === -1) {
sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
rowsDeleted++;
}
}
};
对我来说,您真正要做的是根据特定条件过滤数据集合。首先,您可以将数千行数据存储到一个数组中,数组的每个元素都可以是一个对象来表示一行多列。然后,您可以按行是否包含字符串"ANTHRO"或"ART-HIST"的条件过滤数组。一个可能的代码实现是:
var data = [
{ DEPT_ID: 1, ABBR_NAME: "ANTHRO", FULL_NAME: "Anthropology", StudentsNO: 240 },
{ DEPT_ID: 2, ABBR_NAME: "ART-HIST", NAME: "Art History", StudentsNO: 200 },
{ DEPT_ID: 3, ABBR_NAME: "MATH", FULL_NAME: "Mathematics", StudentsNO: 50 },
{ DEPT_ID: 4, ABBR_NAME: "CS", NAME: "Computer Science", StudentsNO: 79 }
];
function isAnthroOrArtHist(element) {
return ["ANTHRO", "ART-HIST"].indexOf(element.ABBR_NAME) >= 0;
}
var newData = data.filter(isAnthroOrArtHist);
我做了同样的事情,将酒类库存列表与供应商名称一起拉到另一个选项卡,如果未列出供应商名称,则隐藏该行
这是我使用的。您也许可以将其调整到需要的位置。
function liquorOrderGuideWorking() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('LIQUOR ORDER');
// Rows start at "1" - this will delete the first two rows
//sheet.deleteRows(2, 567);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var liquorInventory = ss.getSheetByName('LIQUOR INVENTORY');
var liquorInventoryRange = liquorInventory.getRange('B6:C573'); //Holds Vendor & Item Name
var liquorInventoryTotalRange = liquorInventory.getRange('I6:I573'); //Holds QTY of each item
var liquorOrder = ss.getSheetByName('LIQUOR ORDER'); //Gets the new sheet
var liquorOrderRange = liquorOrder.getRange('A2:B569'); //Places Vendor & Item Name
var liquorOrderQTYRange = liquorOrder.getRange('C2:C569'); //Places QTY
liquorInventoryRange.copyTo(liquorOrderRange, {contentsOnly:true})
liquorInventoryTotalRange.copyTo(liquorOrderQTYRange, {contentsOnly:true})
var s = ss.getSheetByName('LIQUOR ORDER');
var lastCol = s.getLastColumn();
var lastRow = s.getLastRow();
// assumes headers in row 1
var r = s.getRange(2, 1, lastRow - 1, lastCol);
// Note the use of an array
r.sort([{ column: 1, ascending: true }, { column: 2, ascending: true}]);
var ssHide = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ssHide.getSheetByName('LIQUOR ORDER');
var maxRows = sheet.getMaxRows();
//show all the rows
sheet.showRows(1, maxRows);
//get data from column B
var data = sheet.getRange('A:A').getValues();
//iterate over all rows
for(var i=0; i< data.length; i++){
//compare first character, if blank, then hide row
if(data[i][0].charAt(0) == ''){
sheet.hideRows(i+1);
}
}
Browser.msgBox('Liquor Order Guide','The Liquor Order Guide has been refreshed successfully.', Browser.Buttons.OK);
}
相关文章:
- 手持:删除行后更新渲染器
- 在表中找到元素时删除行
- 无法使用jQuery从表中删除行
- 向具有唯一Id的表添加/删除行
- 当行增加时自动递增序列号,并在 jQuery 中删除行时自动重新调整编号顺序
- 使用 for 循环基于
id 从表中删除行 - 无法从表中删除行
- 使用 Javascript 动态删除行.我的代码有什么问题
- 删除行中多余元素的函数
- 使用php中的单选按钮从MS SQL SERVER中删除行
- 按类名从表中删除行
- 类型错误:无法读取属性'行'使用javascript删除行时为null
- 单击a href删除行(TR)
- 显示/隐藏具有特殊条件的行
- 使用ajax从数据库Mvc中的表中删除行
- 如何按条件删除对象中的对象
- 根据条件删除数据行
- 根据活动单元格删除行
- 使用jQuery删除行
- 根据一系列字符串条件删除行