我希望将过滤后的数据从一个电子表格复制到另一个电子表格。
我有一个电子表格,其中有A列和B栏中的一些数据:
我有一个过滤数据的脚本:
function get_data(value){
value = 1
var sheet = SpreadsheetApp.getActiveSheet()
var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn())
var filter = range.getFilter() || range.createFilter();
var foo_index = 1; // column A
var filterValue = SpreadsheetApp.newFilterCriteria().whenTextEqualTo(value).build()
filter.setColumnFilterCriteria(foo_index, filterValue)
var data = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues()
Logger.log(data)
return data
}
生成此筛选器视图:
然而,Logger.log(data)
给了我这个结果:
[foo,bar,1.0,A,1.0,B,1.0,C,3.0,D,5.0,D,7.0,E,7.0,A]
我想得到的结果是:
[foo,bar,1.0,A,1.0,B,1.0,C]
我想要这个结果,这样我就可以将这个过滤过的数据写到一个新的电子表格中。
发布于 2019-09-21 17:51:07
我通过遍历每一行并为isRowHiddenByFilter
添加一个检查来完成这一任务,但这似乎非常不雅观。其他想法欢迎。
function get_data(value){
value = 1
var sheet = SpreadsheetApp.getActiveSheet()
var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn())
var filter = range.getFilter() || range.createFilter();
var foo_index = 1; // column A
var filterValue = SpreadsheetApp.newFilterCriteria().whenTextEqualTo(value).build()
filter.setColumnFilterCriteria(foo_index, filterValue)
// new code
var data = []
for (var i = 1; i < sheet.getLastRow(); i++) {
if(!sheet.isRowHiddenByFilter(i)) {
var row_data = sheet.getRange(i, 1, 1, sheet.getLastColumn()).getValues()
data.push(row_data[0])
}
}
// end new code
Logger.log(data)
return data
}
发布于 2019-12-19 12:32:29
我最近也在研究这个问题--从技术上讲,有一种更好、更快的方法来做到这一点,但我相信它目前在Apps脚本中被窃听了。使用这个类https://developers.google.com/apps-script/reference/spreadsheet/filter-criteria.html,我们应该能够检索选择在每一列中显示的值,然后在使用getValues()
获取数据之后简单地对工作表进行filter()
。在工作表中这样做是非常缓慢的,如果可能的话,最好不要使用getValue()
/ setValue()
,而是使用getValues()
/ setValues()
,然后对内存中的数组执行任何操作。
现在,在这个特定的例子中,问题是,不管我筛选了多少值或哪个值,我只看到我对列隐藏的值,criteriaValues
和visibleValues
数组总是空的,而hiddenValues
总是正确地显示被过滤掉的值。我不确定,也许我在这里做了些傻事,这可以用这样的东西来测试:
var filter = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheetName").getFilter();
var criteriaValues = filter.getColumnFilterCriteria(columnPosition).getCriteriaValues();
Logger.log("criteria Values length " + criteriaValues.length);
Logger.log(criteriaValues);
var visibleValues = filter.getColumnFilterCriteria(columnPosition).getVisibleValues();
Logger.log("visible Values length " + visibleValues.length);
Logger.log(visibleValues);
var hiddenValues = filter.getColumnFilterCriteria(columnPosition).getHiddenValues();
Logger.log("hidden Values length " + hiddenValues.length);
Logger.log(hiddenValues);
所以我要做的是在columnPosition
上迭代,得到一个hiddenValues
数组,这个数组也可以用来查找我们感兴趣的行,但是要找到我们感兴趣的行要复杂得多,因为在sheets中使用的每个后续筛选器都没有显示前一个过滤器中已经隐藏的行的值的hiddenValues
。
甚至比没有在数组上这样做更快,直到一个点,我猜这取决于行和过滤器的数量-我认为如果使用getVisibleValues()
(如果它有效的话),情况就不会是这样了。
发布于 2020-07-28 20:26:36
var data = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).copyTo(NewSht.getRange(1,1))
https://stackoverflow.com/questions/58042502
复制相似问题