【问题标题】:How to get filtered values from Filter after using setColumnFilterCriteria?使用 setColumnFilterCriteria 后如何从 Filter 中获取过滤值?
【发布时间】:2020-01-01 23:28:26
【问题描述】:

我在 appscript 中使用某些过滤器时遇到了麻烦。 我可以看到电子表格正在过滤,但在编程上我没有看到任何变化。

你能帮忙吗?

谢谢

    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("xxxx");
    var values = sheet.getDataRange().getValues();
    Logger.log("VALUES "+values.length);

    var newCriteria = SpreadsheetApp.newFilterCriteria().whenTextEqualTo('51').build();
    var range = sheet.getFilter().setColumnFilterCriteria(22, newCriteria).getRange(); //The 1-indexed position of the column.  
    values = range.getValues();

    Logger.log("VALUES "+values.length);

记录结果:

19-08-28 19:27:33:272 CEST] VALUES 1379
[19-08-28 19:27:39:748 CEST] VALUES 1379

【问题讨论】:

  • 您不能仅在过滤范围内获取值()。我可以知道您将如何处理这些值吗?您可以copyTo 过滤范围或使用纯 JavaScript 以编程方式过滤范围(没有电子表格过滤器)
  • 因为我试图做的 getDataRange().getValues 需要 4 或 5 秒太长,因为行太多。 (1379) 我想通过缩小范围来减少这个时间。
  • 使用上面@TheMaster 提到的copyTo 方法查看此答案stackoverflow.com/a/52227279/459863

标签: google-apps-script google-sheets


【解决方案1】:
  • 您想从电子表格中的过滤表中检索值。
  • 您希望使用 Google Apps 脚本实现此目的。

如果我的理解是正确的,那么这个答案呢?

问题和解决方法:

很遗憾,无法使用getValues() 从过滤表中检索这些值。 TheMaster`s comment 已经提到了这一点。作为解决方法,我想提出以下两种模式。

模式一:

发布电子表格时,可以看到过滤后的工作表。在此模式中,使用 this,并使用查询语言检索值。但别担心。在此脚本中,使用了访问令牌。因此可以直接检索过滤后的工作表,而无需发布电子表格。我认为这是简单的方法。

修改脚本:

var ss = SpreadsheetApp.getActiveSpreadsheet(); // Added
var sheet = ss.getSheetByName("xxxx"); // Modified
var values = sheet.getDataRange().getValues();
Logger.log("VALUES "+values.length);

var newCriteria = SpreadsheetApp.newFilterCriteria().whenTextEqualTo('51').build();
var range = sheet.getFilter().setColumnFilterCriteria(22, newCriteria).getRange(); //The 1-indexed position of the column.  
// values = range.getValues();

// I added below script.
var url = "https://docs.google.com/spreadsheets/d/" + ss.getId() + "/gviz/tq?tqx=out:csv&gid=" + sheet.getSheetId() + "&access_token=" + ScriptApp.getOAuthToken();
var res = UrlFetchApp.fetch(url);
var values = Utilities.parseCsv(res.getContentText());

Logger.log("VALUES "+values.length);

模式 2:

在此模式中,使用了 Sheets API。在你使用这个脚本之前,please enable Sheets API at Advanced Google services

修改脚本:

var ss = SpreadsheetApp.getActiveSpreadsheet(); // Added
var sheet = ss.getSheetByName("xxxx"); // Modified
var values = sheet.getDataRange().getValues();
Logger.log("VALUES "+values.length);

var newCriteria = SpreadsheetApp.newFilterCriteria().whenTextEqualTo('51').build();
var range = sheet.getFilter().setColumnFilterCriteria(22, newCriteria).getRange(); //The 1-indexed position of the column.  
// values = range.getValues();

// I added below script.
var res = Sheets.Spreadsheets.get(ss.getId(), {
  ranges: ["xxxx"], // <--- Please set the sheet name.
  fields: "sheets/data"
});
var values = res.sheets[0].data[0].rowMetadata.reduce(function(ar, e, i) {
  if (!e.hiddenByFilter && res.sheets[0].data[0].rowData[i]) {
    ar.push(
      res.sheets[0].data[0].rowData[i].values.map(function(col) {
        return col.userEnteredValue[Object.keys(col.userEnteredValue)[0]];
      })
    );
  }
  return ar;
}, []);

Logger.log("VALUES "+values.length);

参考资料:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

【讨论】:

  • 我尝试了第一个模式!似乎可以满足我的需求。谢谢 Tanaike :-) 我会尝试模式 2。我不明白为什么我们不能以简单的方式使用过滤数据的范围或以简单的方式仅获取可见线。
  • @Sylvain ASSEMAT 感谢您的回复。我可以理解模式 1 适用于您的情况。不幸的是,从您的回复中,我无法理解模式 2 不起作用。如果您想使用模式 2,您能否提供示例电子表格来复制模式 2 的问题?借此,我想确认这个问题。当然,请删除您的个人信息。
  • @Sylvain ASSEMAT 有什么可以解决您的问题的吗?如果我的回答对您的情况没有用。我必须道歉并修改它。如果您能合作解决您的问题,我很高兴。我想考虑一下解决方案。
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 2018-12-09
  • 2020-05-23
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多