将过滤器应用于具有数值的列

时间:2018-07-31 23:00:43

标签: arrays multidimensional-array google-apps-script google-sheets

我有一个针对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。下一个问题是,这会影响非数字列吗?我已经对其进行了测试,并且效果很好。

1 个答案:

答案 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();})将数字转换为字符串,因此该数字用作字符串。

参考: