【问题标题】:Apply Filter to Column with Numeric Values将过滤器应用于具有数值的列
【发布时间】: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())-1 by e.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


【解决方案1】:

这个修改怎么样?

发件人:

.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();})将数字转换为字符串,所以将数字作为字符串使用。

参考:

【讨论】:

  • 我可以确认这适用于数字和字符串数据。问题虽然。如果我想在包含诸如“我吃了一个苹果”之类的短语的列中搜索单词“apple”,则不会返回该行。我怎样才能让它以这种方式工作?
  • 另外,使用其中任何一个是否有负面影响?
  • @Danilo Cuellar 感谢您的回复。给您带来的不便,我真的很抱歉。虽然我再次阅读了您的问题,但从您的回复中我无法理解您的其他 2 个问题。因此,为了正确理解您的问题,您能否提供示例情况,包括您想要作为新问题的输入和输出值?这样,它将帮助包括我在内的许多用户思考解决方案。我想解决你的问题。但是我无法理解您的其他两个问题的原因是我的技能不佳。对于这种情况,我真的很抱歉。
  • 如何编辑它以处理区分大小写?我采用colValueArr.map(function(e){return e[0].toString();}) 方法,但如果它在“我吃了一个苹果”中寻找“苹果”,它不会捕获
  • @DanCue 感谢您的回复。我刚才看到了。已经发布了答案。我认为答案是一个很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 2021-05-29
  • 1970-01-01
  • 2019-09-08
  • 2016-04-10
  • 2021-03-01
  • 2018-10-20
相关资源
最近更新 更多