我有一个过滤的解决方案
this question
.
这与具有字符串值的列完美结合。当我试图用数值筛选列时,它将不起作用。我想是因为
.setHiddenValues()
不接受数值。我可能错了。
让我解释一下我的场景:
用户在HTML界面上输入一个值,比如6634。
HTML在.gs上调用我的函数并传递用户输入的数值。
google.script.run //Executes an Apps Script JS Function
.withSuccessHandler(updateStatus) //function to be called upon successfull completion of Apps Script function
.withFailureHandler(failStatus)
.withUserObject(button) //To pass the event element object
.projectSearch2(projectID); //Apps Script JS Function
return;
函数(在上面链接的问题上)将获取该值,并将其与列中的值进行比较,如果找到该值,则删除该值。剩下的是一个不需要过滤的值数组。
function projectSearch2(projectID){
var ss = SpreadsheetApp.getActive();
var monthlyDetailSht = ss.getSheetByName('Data Sheet');
var monLastCN = monthlyDetailSht.getLastColumn();
var monLastRN = monthlyDetailSht.getLastRow();
var data = monthlyDetailSht.getRange(1,1,1,monLastCN).getValues();//Get 2D array of all values in row one
var data = data[0];//Get the first and only inner array
var projectIDCN = data.indexOf('Project Id') + 1;
//Pull data from columns before filtering
var projectIDData = monthlyDetailSht.getRange(2,projectIDCN,monLastRN,1).getValues();
//Reset filters if filters exist
if(monthlyDetailSht.getFilter() != null){monthlyDetailSht.getFilter().remove();}
//Start Filtering
var projectIDExclCriteria = getHiddenValueArray(projectTypeData,projectID); //get values except for
var rang = monthlyDetailSht.getDataRange();
var projectIDFilter = SpreadsheetApp.newFilterCriteria().setHiddenValues(projectIDExclCriteria).build();//Create criteria with values you do not want included.
var filter = rang.getFilter() || rang.createFilter();// getFilter already available or create a new one
if(projectID != '' && projectID != null){
filter.setColumnFilterCriteria(projectIDCN, projectIDFilter);
}
};
function getHiddenValueArray(colValueArr,visibleValueArr){
var flatUniqArr = colValueArr.map(function(e){return e[0];})
.filter(function(e,i,a){return (a.indexOf(e.toString())==i && visibleValueArr.indexOf(e.toString()) ==-1); })
return flatUniqArr;
}
该数组用于
.setHiddenValues()。
对列进行筛选。
但是没有过滤。这适用于所有包含字符串值的列,而不是具有数值的列。在这一点上我迷路了。
尝试的解决方案:
-
使用将用户变量转换为字符串
input = input.toString()
. 不起作用。
-
手动插入
.setHiddenValues
对于ProjectIdExclCriteria。这样地:
var projectIDFilter = SpreadsheetApp.newFilterCriteria().setHiddenValues([1041,1070,1071,1072]).build();
成功了,所以我知道问题就在那之前。
-
调用GetHiddenValueArray之前的步骤。我是这样手动插入的:
var projectIDExclCriteria = getHiddenValueArray(projectIDData,[6634]);
它不工作。GetHiddenValueArray函数处理数字是否有问题?
这是一个解决方案。更改以下内容:
.filter(function(e,i,a){return (a.indexOf(e.toString())==i && visibleValueArr.indexOf(e.toString()) ==-1); })
到:
.filter(function(e,i,a){return (a.indexOf(e) == i && visibleValueArr.indexOf(e) == -1); })
真管用!谢谢Tanaike。下一个问题是,这是否会影响非数字列。我已经测试过了,它也能工作。