首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AppScript过滤器函数不适用于某些值

AppScript过滤器函数不适用于某些值
EN

Stack Overflow用户
提问于 2022-10-10 07:20:47
回答 1查看 82关注 0票数 4

更新:我有一个包含3列的电子表格,我关注的是:

集团(铁/有色金属/等)RI No.(唯一标识符)供应商(选定RI编号的卖方)数据流发生在这样的情况:我选择组(比如说,铁)->在国际扶轮编号。列中,创建一个自动下拉列表,显示铁类别下所有项目的RI编号-->我选择了一个特定的RI编号。从这一下降->所有销售该商品的销售商的下降出现。现在,我编写了一个代码,它可以很好地完成这项工作,但是当我选择一个RI No时,它无法列出供应商列表。里面有"-“字样。例如,来自国际扶轮编号。列表中,如果我选择一个像"6181-1“、”Cu-18毫米“、"CU-25x3”、"25_E.Cont“、”自由度“这样的值,那么供应商下拉列表中的鞋子就没有任何选项可供选择,即使它将显示2个选项。其他值,如"6310-1“,甚至"TTK1 & TTK2”,在RI编号中都不会出现此问题。列表。

示例电子表格https://docs.google.com/spreadsheets/d/1Xvz1NWiUqMWXik5k653slQhAXduwuQmq3_n0aJEhbRY/edit#gid=1605627126

剧本:

代码语言:javascript
复制
var ws = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var wsopt = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sorted items");
var opts = wsopt.getRange(2,1,wsopt.getLastRow()-1,13).getValues();
var firstlevelcolumn = 2;
var secondlevelcolumn = 5;
var thirdlevelcolumn= 6;
var wsopt2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("supplier details");
var opts2 = wsopt2.getRange(3,1,wsopt2.getLastRow()-1,12).getValues();


function onEdit(e)
{ var activecell= e.range;
  var val = activecell.getDisplayValue();
  var r= activecell.getRow();
  var c= activecell.getColumn();
  var wsName= activecell.getSheet().getName();
  if (wsName == "JPS")
  {
    if (wsName == "JPS" && c == firstlevelcolumn && r > 2)
    { applyFirstLevelValidation(val,r);}
    if (wsName == "JPS" && c == secondlevelcolumn && r > 2)
    { applySecondLevelValidation(val,r);}
  }//JPS
  else if (wsName == "DDNI")
  {
    if (wsName == "DDNI" && c == firstlevelcolumn && r > 2)
    {applyFirstLevelValidation(val,r);}
    if (wsName == "DDNI" && c == secondlevelcolumn && r > 2)
    { applySecondLevelValidation(val,r);}
  }//DDNI
}//close onEdiT

function applyFirstLevelValidation(val,r)
{
  if(val=== "")
    {
      ws.getRange(r,secondlevelcolumn).clearContent();
      ws.getRange(r,secondlevelcolumn).clearDataValidations();
      ws.getRange(r,thirdlevelcolumn).clearContent();
      ws.getRange(r,thirdlevelcolumn).clearDataValidations();
    } else
    {
      ws.getRange(r,secondlevelcolumn).clearContent();
      ws.getRange(r,secondlevelcolumn).clearDataValidations();
      ws.getRange(r,thirdlevelcolumn).clearContent();
      ws.getRange(r,thirdlevelcolumn).clearDataValidations();
      var filteredopts = opts.filter(function(o){return o[0]===val});
      var listToApply = filteredopts.map(function(o){return o[1]});
      var cell=ws.getRange(r,secondlevelcolumn);
      applyValidationToCell(listToApply,cell);
    }//close else
}//close applyFirstLevelValidation

function applySecondLevelValidation(val,r)
{
  if(val=== "")
    {
      ws.getRange(r,thirdlevelcolumn).clearContent();
      ws.getRange(r,thirdlevelcolumn).clearDataValidations();
    } else
    {
      ws.getRange(r,thirdlevelcolumn).clearContent();
      ws.getRange(r,thirdlevelcolumn).clearDataValidations();
      var firstlevelcolvalue = ws.getRange(r,firstlevelcolumn).getDisplayValue();
      var filteredopts2 = opts2.filter(function(o){return o[6]===firstlevelcolvalue && o[4]===val});
      var listToApply2 = filteredopts2.map(function(o){return o[0]});
      var cell2=ws.getRange(r,thirdlevelcolumn);
      applyValidationToCell(listToApply2,cell2);
    }//close else
}

function applyValidationToCell(list,cell)
{
  var rule = SpreadsheetApp.newDataValidation().requireValueInList(list).build();
  cell.setDataValidation(rule);
} ```
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-10 15:45:30

欢迎!

我检查了代码,但没有发现任何问题。但是,我制作了两个副本进行测试,在其中一个副本中,我删除了“供应商详细信息”中的所有空格:

对此:

这似乎解决了这个问题:

我猜,当行之间有多个空格时,脚本无法正确地读取信息。

更新:

我修改了代码以查看过滤器传递的值:

代码语言:javascript
复制
var filteredopts2 = opts2.filter(function(o){return o[6]===firstlevelcolvalue && o[4]===val});

我注意到过滤器正在比较来自JPS选项卡的JPSsupplier details选项卡中的Non- Ferrouse

在将supplier details中的所有值从以下位置更改之后:

至:

问题解决了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74011386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档