将过滤器应用于具有数值的列 [英] Apply Filter to Column with Numeric Values

查看:77
本文介绍了将过滤器应用于具有数值的列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个用于过滤这个问题

这与具有字符串值的列完美配合。当我尝试用数字值过滤列时,它将不起作用。我认为这是因为 .setHiddenValues()将不接受数字值。我可能错了。

This works perfectly with a column that has string values. When I try to filter a column with numeric values it will not work. I'm assuming it is because .setHiddenValues() will not accept numeric values. I could be wrong.

让我解释一下我的情况:

Let me explain my scenario:

用户在HTML界面上输入了一个值,例如6634。
HTML在.gs上调用我的函数并传递用户输入的数值。

The user inputs a value on an HTML interface, let's say 6634. The HTML calls my function on .gs and passes the numeric value the user inputted.

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;

函数(在上面的链接问题上)将获取该值并将其与删除该值(如果找到)的列。我剩下的是一个我不想过滤的值数组。

The function (on the linked question above) will take that value and bump it up against the values in a column deleting the value if it is found. What I am left with is an array of values that I do not want filtered.

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()进行过滤。
但是没有过滤任何内容。这适用于所有包含字符串值的列,而不适用于具有数字值的列。在这一点上我迷路了。

That array is used in .setHiddenValues() to filter on the column. Nothing is filtered however. This works for all columns that contain string values, just not columns with numeric values. At this point I'm lost.

尝试的解决方案:


  • 使用<$ c $将用户变量转换为字符串c> input = input.toString()。无效。

  • 手动为projectIDExclCriteria插入 .setHiddenValues 。像这样: var projectIDFilter = SpreadsheetApp.newFilterCriteria()。setHiddenValues([1041,1070,1071,1072])。build(); 成功,所以我知道问题出在

  • 调用getHiddenValueArray之前的步骤。我是这样手动插入的: var projectIDExclCriteria = getHiddenValueArray(projectIDData,[6634]); 无法正常工作。 getHiddenValueArray函数的问题不能正确处理数字吗?

  • Convert user variable to string using input = input.toString(). Did not work.
  • manually inserted .setHiddenValues for projectIDExclCriteria. Like this: var projectIDFilter = SpreadsheetApp.newFilterCriteria().setHiddenValues([1041,1070,1071,1072]).build(); That succeeded so I know the issue is before that.
  • Step before was calling getHiddenValueArray. I manually inserted like so: var projectIDExclCriteria = getHiddenValueArray(projectIDData,[6634]); It is not working. Is the issue with that getHiddenValueArray function not handling the numbers properly?

这是一个解决方案。更改以下内容:

Here is a solution. Changing the following:

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

That works! Thank you Tanaike. The next question is will this impact columns that are not numeric. I have tested that and it works as well.

推荐答案

此修改如何?

.filter(function(e,i,a){return (a.indexOf(e.toString())==i && visibleValueArr.indexOf(e.toString()) ==-1); })



到:



To :

.filter(function(e,i,a){return (a.indexOf(e) == i && visibleValueArr.indexOf(e) == -1); }) 



注意:




  • 在此修改中,可以使用每个值比较数字和字符串。

  • 如果要使用返回(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();})将该数字转换为字符串,因此该数字将用作字符串。

    • Note :

      • In this modification, the number and string can compared using each value.
      • If you want to use return (a.indexOf(e.toString())==i && visibleValueArr.indexOf(e.toString()) ==-1), you can achieve it by modifying from colValueArr.map(function(e){return e[0];}) to colValueArr.map(function(e){return e[0].toString();}).
        • In this modification, colValueArr.map(function(e){return e[0].toString();}) converts the number to string, so the number is used as a string.
          • Array.prototype.indexOf()

          这篇关于将过滤器应用于具有数值的列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆