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)
如果我的理解是正确的,这个答案怎么样?
不幸的是,无法使用 来从过滤后的工作表中检索这些值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)
在此模式中,使用 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)
如果我误解了你的问题并且这不是你想要的结果,我深表歉意。
| 归档时间: |
|
| 查看次数: |
3079 次 |
| 最近记录: |