代码之家  ›  专栏  ›  技术社区  ›  DanCue

将筛选器应用于具有数值的列

  •  0
  • DanCue  · 技术社区  · 6 年前

    我有一个过滤的解决方案 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 回复  |  直到 6 年前
        1
  •  2
  •   Tanaike    6 年前

    这次修改怎么样?

    来自:

    .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(函数(e)返回e[0].ToString();) 将数字转换为字符串,以便将数字用作字符串。

    参考文献: