应用过滤条件 "whenDateEqualToAny(dates)" - 要分析的日期数组(日期)的正确形式是什么?



我想使用谷歌表单的ui添加一些快速过滤器。目前我想允许用户点击";上个月的演出;只查看上个月的数据。日期写在第一列。现在,我更喜欢在将值打印到工作表之前使用谷歌工作表的过滤器,以允许用户进一步修改该过滤器。因此,我试图使用SpreadsheetApp.newFilterCriteria((.wwhenDateEqualToAny(日期(来构建filterCredential,并且我正在分析一个有效日期数组。在文件中,它说我必须在;日期[]"-这不意味着一系列日期吗?

下面的错误消息和我的代码:

错误消息(链接到"var filterCerties…"行(:

"异常:对于非数据源对象的相等性检查,布尔条件不能有多个值;

我的代码:

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;
}

我相信你的目标如下。

  • 您希望使用基本筛选器隐藏除dates之外的值行
  • 你想使用谷歌应用程序脚本来实现这一点

问题和解决方法:

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

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

模式1:

在这种模式中,使用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();

模式2:

在此模式中,使用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();
  • 从日期对象到序列号的转换是从这个线程中引用的

参考文献:

  • 设置HiddenValue(值(
  • whenNumberBetween(开始、结束(

最新更新