使用setColumnFilterCriteria后如何从Filter中获取过滤后的值?

Syl*_*MAT 5 google-sheets google-apps-script

我在 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);
Run Code Online (Sandbox Code Playgroud)

记录结果:

19-08-28 19:27:33:272 CEST] VALUES 1379
[19-08-28 19:27:39:748 CEST] VALUES 1379
Run Code Online (Sandbox Code Playgroud)

Tan*_*ike 6

  • 您想要从电子表格中的筛选工作表中检索值。
  • 您希望使用 Google Apps 脚本来实现此目的。

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

问题和解决方法:

不幸的是,无法使用 来从过滤后的工作表中检索这些值getValues()这一点在大师的评论中已经提到过。作为解决方法,我想提出以下两种模式。

模式一:

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

修改后的脚本:

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);
Run Code Online (Sandbox Code Playgroud)

模式2:

在此模式中,使用 Sheets API。在使用此脚本之前,请在高级 Google 服务中启用 Sheets API

修改后的脚本:

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);
Run Code Online (Sandbox Code Playgroud)

参考:

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