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

时间:2019-09-21 17:19:54

标签: google-apps-script google-sheets filter

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

我在A列和B列中都有一个包含一些数据的电子表格: enter image description here

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

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
}

哪个生成此过滤器视图: enter image description here

但是,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]]

我想要这个结果,所以我可以将过滤后的数据版本写入新的电子表格。

3 个答案:

答案 0 :(得分:1)

我通过遍历每一行并添加对adb devices的检查来使其工作,但这似乎很不雅致。欢迎其他想法。

isRowHiddenByFilter

答案 1 :(得分:0)

我最近也一直在研究这个问题-从技术上讲,有一种更好,更快的方法来执行此操作,但是我认为它目前在Apps Script中存在错误。使用此类https://developers.google.com/apps-script/reference/spreadsheet/filter-criteria.html,我们应该能够检索选择显示在每一列中的值,然后在用filter()提取数据后,只需getValues()即可工作表。在工作表本身中执行此操作的过程非常缓慢,如果可能的话,最好不要使用getValue() / setValue(),而要使用getValues() / setValues()然后执行我们曾经做过的任何操作将要在内存中的阵列上执行。

在这种情况下,问题是无论我过滤多少个值或哪个值,我都只会看到从列criteriaValues和{{1}中隐藏的值}数组始终为空,而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

比不对数组进行处理要快得多,直到一个点为止,我猜这取决于行和过滤器的数量-我认为如果使用hiddenValues(如果使用{{1}工作)。

答案 2 :(得分:0)

var data = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).copyTo(NewSht.getRange(1,1))