首页 > 解决方案 > apply FilterCriteria "whenDateEqualToAny(dates)" - 要解析的日期数组(日期)的正确形式是什么?

问题描述

我想使用谷歌表格的 ui 添加一些快速过滤器。目前我想让用户点击“显示上个月”只查看上个月的数据。日期写在第一列。现在我更喜欢在将值打印到工作表之前使用谷歌工作表的过滤器,以允许用户进一步修改该过滤器。因此,我正在尝试使用 SpreadsheetApp.newFilterCriteria().whenDateEqualToAny(dates) 构建 filterCriteria 并且我正在解析一组有效日期。在文档中它说我必须放一个“日期[]”——这不意味着日期数组吗?

在错误消息和我的代码下方:

错误消息(链接到“var filterCriteria...”行):

“例外:布尔条件不能有多个值用于非数据源对象的相等性检查”

我的代码:

function showLastMonth() {
  var ss = SpreadsheetApp.getActive()
  var sheet = ss.getSheetByName('evaluation')
  var now = new Date()
  var thisYear = now.getFullYear()
  var thisMonth = now.getMonth()
  
  if(thisMonth == 0){var startMonth = 11; var startYear = thisYear - 1}
  else{var startMonth = thisMonth - 1; var startYear = thisYear}
  var startDate = new Date(startYear, startMonth, 1)
  var endDate = new Date(thisYear, thisMonth, 0)
  var dates = getDateArray(startDate, endDate)
  var filter = sheet.getFilter()

  if(filter == null ){
    var range = sheet.getDataRange()
    var filter = range.createFilter()
  }
  var filterCriteria = SpreadsheetApp.newFilterCriteria().whenDateEqualToAny(dates)
  filter.setColumnFilterCriteria(1, filterCriteria)  
}

getDateArray = function(startDate, endDate){

  var startYear = startDate.getFullYear()
  var startMonth = startDate.getMonth()
  var dateArray = []; dateArray.push(startDate)
  var date = startDate; var day = date.getDay()-1
  while(date<endDate){
    day++
    date = new Date(startYear, startMonth, day)
    if(date<=endDate){dateArray.push(date)}
  }
  return dateArray;
}

标签: dategoogle-apps-scriptgoogle-sheetsfilter

解决方案


我相信你的目标如下。

  • dates除了使用基本过滤器之外,您想要隐藏值的行。
  • 您想使用 Google Apps 脚本实现此目的。

问题和解决方法:

在当前阶段,似乎需要 的长度array为。我认为这是您的问题的原因。所以例如,当使用时,不会发生错误。这种情况与 Sheets API 的 setBasicFilter 请求相同。不幸的是,这似乎是当前的规范。但是,官方文件说哪个使用复数形式。参考所以我也认为这对于TheMaster 评论中提到的实际情况是不正确的。whenDateEqualToAny(array)1var filterCriteria = SpreadsheetApp.newFilterCriteria().whenDateEqualToAny([dates[0]])The acceptable values.

为了实现您的目标,在这种情况下,我想提出以下 2 种模式。

模式一:

在此模式中,使用将脚本中setHiddenValues()除 的值之外的值dates设置为隐藏值。

修改后的脚本:

当您的脚本被修改时,请进行如下修改。

从:
var filterCriteria = SpreadsheetApp.newFilterCriteria().whenDateEqualToAny(dates)
到:
var obj = dates.reduce((o, e) => Object.assign(o, {[`${e.getFullYear()}\/${e.getMonth() + 1}\/${e.getDate()}`]: true}), {});
var range = sheet.getRange("A1:A");
var dispValues = range.getDisplayValues();
var hiddenValues = range.getValues().reduce((ar, [a], i) => {
  if (a instanceof Date && !obj[`${a.getFullYear()}\/${a.getMonth() + 1}\/${a.getDate()}`]) {
    ar.push(dispValues[i][0]);
  }
  return ar;
}, []);
var filterCriteria = SpreadsheetApp.newFilterCriteria().setHiddenValues(hiddenValues).build();

模式二:

在此模式中,使用显示脚本中whenNumberBetween()的值。dates在这种情况下,需要将日期对象转换为序列号。

修改后的脚本:

当您的脚本被修改时,请进行如下修改。

从:
var filterCriteria = SpreadsheetApp.newFilterCriteria().whenDateEqualToAny(dates)
到:
var filterCriteria = SpreadsheetApp.newFilterCriteria().whenNumberBetween(
  (dates[0].getTime() / 1000 / 86400) + 25569,
  (dates.pop().getTime() / 1000 / 86400) + 25569
).build();

参考:


推荐阅读