date - 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;
}
解决方案
我相信你的目标如下。
dates
除了使用基本过滤器之外,您想要隐藏值的行。- 您想使用 Google Apps 脚本实现此目的。
问题和解决方法:
在当前阶段,似乎需要 的长度array
为。我认为这是您的问题的原因。所以例如,当使用时,不会发生错误。这种情况与 Sheets API 的 setBasicFilter 请求相同。不幸的是,这似乎是当前的规范。但是,官方文件说哪个使用复数形式。参考所以我也认为这对于TheMaster 评论中提到的实际情况是不正确的。whenDateEqualToAny(array)
1
var 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();
- 从这个线程引用了从日期对象到序列号的转换。
参考:
推荐阅读
- node.js - 节点运行多个实例并仅关闭请求的实例
- ios - 在 WKWebView swift 中下载文档并加载图像(png、jpeg)、pdf、doc 等
- ios - 协议类型“Any”的值不能符合“Equatable”;只有结构/枚举/类类型可以符合协议
- angular - 从另一个组件角度导入功能
- c++ - 在二叉非 STL 树中打印具有 2 个孩子的父母的问题
- google-sheets - 如何用另一个单词替换单词之间的空格?
- micronaut - 在 build.gradle 中编码以导入包 'Package io.micronaut.test.annotation' 有什么依赖关系?
- java - 如何仅将 @JsonView 应用于具有 Spring RestController 的对象的子级 - 序列化?
- php - 嵌套关系 MongoDb
- wordpress - 如何屏蔽高级 WordPress 主题或插件的许可证密钥