Google apps script 使用setColumnFilterCriteria后如何从筛选器中获取筛选值?

Google apps script 使用setColumnFilterCriteria后如何从筛选器中获取筛选值?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,在appscript中使用某些筛选器时遇到问题。 我可以看到spreasheet正在过滤,但从编程角度看,我看不到任何更改 你能帮忙吗 谢谢 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("xxxx"); var values = sheet.getDataRange().getValues(); Logger.log("VALUES "+values.length); var

在appscript中使用某些筛选器时遇到问题。 我可以看到spreasheet正在过滤,但从编程角度看,我看不到任何更改

你能帮忙吗

谢谢

    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
  • 您希望从电子表格中的筛选表中检索值
  • 您希望使用谷歌应用程序脚本实现这一点
如果我的理解是正确的,那么这个答案呢

问题和解决方法: 遗憾的是,无法使用
getValues()
从筛选后的工作表中检索值。这一点我已经提过了。作为解决办法,我想提出以下两种模式

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

修改脚本: 模式2: 在此模式中,使用了Sheets API。在使用此脚本之前

修改脚本:
var ss=SpreadsheetApp.getActiveSpreadsheet();//补充
var sheet=ss.getSheetByName(“xxxx”);//被改进的
var values=sheet.getDataRange().getValues();
Logger.log(“值”+值.length);
var newCriteria=SpreadsheetApp.newFilterCriteria().whentexterqualto('51').build();
var range=sheet.getFilter().setColumnFilterCriteria(22,newCriteria).getRange()//列的1索引位置。
//values=range.getValues();
//我添加了下面的脚本。
var res=Sheets.Spreadsheets.get(ss.getId(){

范围:[“xxxx”],//您不能仅对筛选范围获取值()。我可以知道您将如何处理这些值吗?您可以
copyTo
筛选范围,或者使用纯JavaScript编程筛选范围(不带电子表格过滤器),因为getDataRange().getValues我尝试过,因为行太多,花费了4秒或5秒太长。(1379)我想通过缩小范围来缩短这一时间。请使用上面@TheMaster提到的
copyTo
方法查看此答案。我尝试了第一种模式!似乎满足了我的需要。谢谢Tanaike:-)我将尝试模式2。我不明白为什么我们不能以简单的方式使用过滤数据的范围,或者不能以简单的方式仅获取可见行。@Sylvain ASSEMAT感谢您的回复。我可以理解模式1适用于您的情况。不幸的是,从您的回复中,我无法理解模式2不起作用。如果你想使用模式2,你能提供一个样本电子表格来复制你在模式2中的问题吗?通过这个,我想确认这个问题。当然,请删除你的个人信息。@Sylvain ASSEMAT我能为你的问题做些什么吗?如果我的回答对你的情况没有用。我必须道歉如果你能合作解决你的问题,我很高兴。我想考虑一下解决办法。
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);
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);