根据一系列字符串条件删除行

Delete rows based on a range of string conditionals

本文关键字:条件 删除行 字符串 一系列      更新时间:2023-09-26

我有几十个数千行长的电子表格,我想通过删除不满足条件的行来子集它们。

让我举一个简化的例子。 假设 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);
}