【发布时间】:2018-07-31 23:00:43
【问题描述】:
我有一个过滤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()将用户变量转换为字符串。没用。 - 为项目IDExclCriteria 手动插入
.setHiddenValues。像这样: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); })
这行得通!谢谢田池。下一个问题是这是否会影响非数字列。我已经测试过了,它也可以正常工作。
【问题讨论】:
-
我认为关于
a.indexOf(e.toString()),如果e是数字并且e包含在a中,则a.indexOf(e.toString())是-1bye.toString()。那么尝试修改为return (a.indexOf(e) == i && visibleValueArr.indexOf(e) == -1)怎么样?但我不确定细节值。所以如果这个getHiddenValueArray()还是不行,为了确认你的问题,你能提供一个“colValueArr”和“visibleValueArr”的样本值吗?如果setColumnFilterCriteria()有问题,您能否提供一个示例电子表格? -
或者如果你想使用
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();})怎么样? -
@Tanaike 您在第一条评论中的建议奏效了。我已经更新了我的问题以包含解决方案。您要提交答案以便我选择吗?
-
感谢您的回复。我将其发布为答案。你能确认一下吗?
标签: arrays multidimensional-array google-apps-script google-sheets