0

我有一个大致如下所示的数据数组:

   header row | header row | header row           | header row
   project    | date       | LastName, FName      | hours
   project    | date       | LastName, FName      | hours
   project    | date       | LastName, FName      | hours
   header row | header row | header row           | header row
   project    | date       | LastName, FName      | hours
   project    | date       | LastName, FName      | hours
   project    | date       | LastName, FName      | hours

我想从数组中删除标题行。我以为我ArrayLib.filterByDate会这样做,认为在我的时间范围内不包含有效日期的任何行都会被删除。

这是我尝试过的代码:

function removeHeaders(projectRange){
  var tmpProjectRange = [];
  tmpProjectRange = ArrayLib.filterByDate(projectRange, 1, new Date(2013-01-01), new Date(2015-01-01))
  return tmpProjectRange;
}

我收到一个错误:“所选列应仅包含日期”。所以这种方法似乎不是一种选择。

现在,我正在尝试ArrayLib.filterByText将第 2 列与一组有效数据进行比较:

function removeHeaders(projectRange){
  var tmpEmployeeRange = [];
  var tmpEmployeeList = [];
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var shtEmp = ss.getSheetByName("Employees");
  var empLastRow = shtEmp.getLastRow(); 
  var strRange = "A2:A" + empLastRow;
  //should contain a list of all the employees:
  tmpEmployeeList = shtEmp.getRange(strRange).getValues();
  tmpEmployeeRange = ArrayLib.filterByText(projectRange, 2, tmpEmployeeList);
  return tmpEmployeeRange;
}

但由于某种原因,这也不起作用。唯一返回的tmpEmployeeRange行是名称没有逗号的行(这些行有 TBD 而不是姓氏,名字。)所以我不太确定那里发生了什么,但我认为必须有一种更简单的方法来做到这一点。我想我可以遍历整个事情并去掉我不想要的行。还有其他想法吗?

4

1 回答 1

2

如果我们假设查找具有有效日期的行的逻辑是正确的,那么很容易遍历范围并删除标题。

在这里,我借用了Detecting an "invalid date" Date instance in JavaScript 中isValidDate()的函数。我还保留了第一个标题行-您可以通过删除对.row == 0

// Iterate over all rows, keeping the first header row and
// any row with a valid date in the second column.
function removeHeaders(projectRange){
  var tmpProjectRange = [];
  for (row in projectRange) {
    if (row == 0 || isValidDate(projectRange[row][1])) {
      tmpProjectRange.push(projectRange[row]);
    }
  }
  return tmpProjectRange;
}


// From https://stackoverflow.com/questions/1353684
// Returns 'true' if variable d is a date object.
function isValidDate(d) {
  if ( Object.prototype.toString.call(d) !== "[object Date]" )
    return false;
  return !isNaN(d.getTime());
}
于 2013-04-10T20:00:48.333 回答