我有一个针对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();
成功了,所以我知道问题出在此。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。下一个问题是,这会影响非数字列吗?我已经对其进行了测试,并且效果很好。
答案 0 :(得分:2)
此修改如何?
.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); })
return (a.indexOf(e.toString())==i && visibleValueArr.indexOf(e.toString()) ==-1)
,可以通过将colValueArr.map(function(e){return e[0];})
修改为colValueArr.map(function(e){return e[0].toString();})
来实现。
colValueArr.map(function(e){return e[0].toString();})
将数字转换为字符串,因此该数字用作字符串。