Google Apps脚本:如何从数组中删除散布的标题行?

时间:2013-04-10 18:13:36

标签: google-apps-script

我有一组看起来像这样的数据:

   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而不是姓氏,名字。)所以我不确定那里发生了什么,但我认为必须有一个更简单的方法来做到这一点。我想我可以迭代整个事情并删除我不想要的行。还有其他想法吗?

1 个答案:

答案 0 :(得分: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());
}