我正在努力通过 Google Apps 脚本设置过滤器。根据我的研究,我得出的结论是,虽然.setVisibleValues()列为可用,但尚不受支持。以编程方式过滤列的唯一方法是使用.setHiddenValues(). 这提出了一个挑战,因为可能有数百个值需要隐藏。
在下面的示例代码中,我选择排除第 12 (L) 列中的值一、二、三、五、六和七。如果该列中只有七个值,则应该返回一个过滤后的数据集,列 L 中只有“四个”。
function testFilter() {
var spreadsheet = SpreadsheetApp.getActive();
var criteria = SpreadsheetApp.newFilterCriteria()
.setHiddenValues(['One', 'Two', 'Three', 'Five', 'Six', 'Seven'])
.build();
spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(12, criteria);
};
Run Code Online (Sandbox Code Playgroud)
如果使用.setHiddenValues()是唯一的方法,我的想法是构建一个项目列表以排除不包含某个或多个特定值的项目。换句话说,如果 L 列中的值不等于“四”,则包含在.setHiddenValues(). 我想这将需要一个循环,但我想看看想法是什么。我对 GAS 相当陌生,所以我不确定如何构建一个有效的循环来实现这一点。有没有更好的方法来设置过滤器?
我一直试图弄清楚这一点。我希望我能在这方面得到一些指导。以下脚本的目的是获取包含子文件夹及其文件的文件夹和文件的完整列表。
这是我目前拥有的:
var counter = 0
var files = folder.getFiles();
var subfolders = folder.getFolders();
var folderPath = folder.getName();
while (subfolders.hasNext()){
subfolder = subfolders.next();
var row = [];
//row.push(subfolder.getName(),'',subfolder.getId(),subfolder.getUrl(),subfolder.getSize(),subfolder.getDateCreated(),subfolder.getLastUpdated());
//list.push(row);
if(counter > 0){
var files = subfolder.getFiles();
}
while (files.hasNext()){
file = files.next();
var vals = file.getUrl();
var row = [];
if(counter == 0){
row.push(folder.getName(),file.getName(),file.getId(),file.getUrl(),file.getSize(),file.getDateCreated(),file.getLastUpdated())
}else{
row.push(folderPath + '/' + subfolder.getName(),file.getName(),file.getId(),file.getUrl(),file.getSize(),file.getDateCreated(),file.getLastUpdated())
}
list.push(row);
}
counter = counter + 1
}
Run Code Online (Sandbox Code Playgroud)
它当前获取当前文件夹及其子文件夹的文件夹名称和文件名。没有比这更进一步的了。我一直在想办法让循环继续下去,直到没有更多的子文件夹。
这不是一个很大的驱动器。有不到 10 个级别,但如果需要,希望能够灵活地进一步发展。
这个问题是另一个问题的延伸。 将基本过滤器应用于电子表格列中的多个值
我遇到错误,特别Service error: Spreadsheets (line 8, file "Filter")是以下代码:
function testFilter() {
var ss = SpreadsheetApp.getActive();
var monthlyDetailSht = ss.getSheetByName("Monthly_Detail");
var filterRange = monthlyDetailSht.getRange(2,12,359,1).getValues(); //Get L column values
var hidden = getHiddenValueArray2(filterRange,["Apple"]); //get values except Apple
var filterCriteria = SpreadsheetApp.newFilterCriteria().setHiddenValues(hidden).build();
var rang = monthlyDetailSht.getDataRange();
var filter = rang.getFilter() || rang.createFilter();// getFilter already available or create a new one
//remove filter and flush
if(monthlyDetailSht.getFilter() != null){monthlyDetailSht.getFilter().remove();}
SpreadsheetApp.flush();
filter.setColumnFilterCriteria(12, filterCriteria);
};
//flattens and strips column L values of all the …Run Code Online (Sandbox Code Playgroud) 我正在尝试组合一个函数,该函数允许我根据关键列将列的信息从一张纸拉到另一张纸上。这与 excel/google 中的索引匹配或 vlookup 类似。
样本数据:
我尝试过的:
function vlookup(importFromSht, importToSht, importFromCompCol, importToCompCol,importFromCol, importToCol){
var lastImportFromRN = importFromSht.getLastRow();
var lastImportToRN = importToSht.getLastRow();
var importFromCompArr = importFromSht.getRange(2, importFromCompCol, lastImportFromRN, 1).getValues();
var importToCompArr = importToSht.getRange(2, importToCompCol, lastImportToRN, 1).getValues();
var importFromArr = importFromSht.getRange(2, importFromCol, lastImportFromRN, 1).getValues();
var importToArr = [];
for (var i in importToCompArr) {
for (var j in importFromCompArr){
if (importToCompArr[i].toString() == importFromCompArr[j].toString()) {
importToArr.push(importFromArr[j]);
}
}
}
//Paste to column
importToSht.getRange(2,importToCol,importToArr.length,1).setValues(importToArr);
}
Run Code Online (Sandbox Code Playgroud)
参数定义