首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Apps脚本复制筛选过的电子表格数据

如何使用Apps脚本复制筛选过的电子表格数据
EN

Stack Overflow用户
提问于 2019-09-21 17:19:54
回答 3查看 4.9K关注 0票数 3

我希望将过滤后的数据从一个电子表格复制到另一个电子表格。

我有一个电子表格,其中有A列和B栏中的一些数据:

我有一个过滤数据的脚本:

代码语言:javascript
运行
复制
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]

我想要这个结果,这样我就可以将这个过滤过的数据写到一个新的电子表格中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-21 17:51:07

我通过遍历每一行并为isRowHiddenByFilter添加一个检查来完成这一任务,但这似乎非常不雅观。其他想法欢迎。

代码语言:javascript
运行
复制
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
}
票数 3
EN

Stack Overflow用户

发布于 2019-12-19 12:32:29

我最近也在研究这个问题--从技术上讲,有一种更好、更快的方法来做到这一点,但我相信它目前在Apps脚本中被窃听了。使用这个类https://developers.google.com/apps-script/reference/spreadsheet/filter-criteria.html,我们应该能够检索选择在每一列中显示的值,然后在使用getValues()获取数据之后简单地对工作表进行filter()。在工作表中这样做是非常缓慢的,如果可能的话,最好不要使用getValue() / setValue(),而是使用getValues() / setValues(),然后对内存中的数组执行任何操作。

现在,在这个特定的例子中,问题是,不管我筛选了多少值或哪个值,我只看到我对列隐藏的值,criteriaValuesvisibleValues数组总是空的,而hiddenValues总是正确地显示被过滤掉的值。我不确定,也许我在这里做了些傻事,这可以用这样的东西来测试:

代码语言:javascript
运行
复制
    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() (如果它有效的话),情况就不会是这样了。

票数 0
EN

Stack Overflow用户

发布于 2020-07-28 20:26:36

代码语言:javascript
运行
复制
var data = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).copyTo(NewSht.getRange(1,1))
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58042502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档