Javascript 谷歌工作表:";如果项目为;“缺货”;,然后从数据验证列表中删除该项

Javascript 谷歌工作表:";如果项目为;“缺货”;,然后从数据验证列表中删除该项,javascript,excel,google-apps-script,google-sheets,Javascript,Excel,Google Apps Script,Google Sheets,我一直在试图找到一个解决我的谷歌工作表问题的办法,并尝试了相当多的变通办法,到目前为止,没有任何效果。我想我可能需要使用javascript来完成操作,但是,我是javascript的初学者 这是我想要的工作表 检查“表2”,查看指定范围内的项目是否设置为“缺货” 第2页 如果范围内的项目设置为“缺货”,则从“表1”上的数据验证列表中删除该项目,如果该项目为“库存”,则在数据验证列表中显示该项目 第1页 以下是我迄今为止尝试过的一些方法(如果有帮助的话): 在第#2页上,当项目设置为缺货时

我一直在试图找到一个解决我的谷歌工作表问题的办法,并尝试了相当多的变通办法,到目前为止,没有任何效果。我想我可能需要使用javascript来完成操作,但是,我是javascript的初学者

这是我想要的工作表

  • 检查“表2”,查看指定范围内的项目是否设置为“缺货”
  • 第2页

  • 如果范围内的项目设置为“缺货”,则从“表1”上的数据验证列表中删除该项目,如果该项目为“库存”,则在数据验证列表中显示该项目
  • 第1页


    以下是我迄今为止尝试过的一些方法(如果有帮助的话):

  • 在第#2页上,当项目设置为缺货时,对其进行条件格式化,使单元格文本变为白色(不可见)。这适用于特定的图纸。但是,数据验证列表并不完全按照其显示的方式显示它提取的数据(因此文本仍显示在下拉列表上)

  • IF语句。我试过很多如果和如果的说法。这不起作用,因为您不能在与数据验证单元相同的单元中使用if语句,并且b/c将来可能需要不断更改单元名称。(但是,我确实找到了一个解决另一个问题的办法,我现在正试图解决一天的问题,呵呵!)

  • 哦,我还尝试了有条件地格式化单元格,以便在缺货时将单元格变白。。。但是,我得到一个错误,即条件格式不能跨两张工作表工作


  • 。。。所以,是的,如果有人知道一个解决方案,让这个工作,我将永远感谢它!同时,我将继续搜索谷歌的解决方案。

    为了简单起见,我创建了一个包含两张表的示例电子表格:表1和“库存”

    第1页

    股票

    解决方案 我已经创建了一个应用程序脚本函数,用于按照您的指定设置数据验证

    我使用Javascript和函数简化了数据获取,但基本上:

  • 我从库存表中获取所有行,并将它们加载到“内存”中
  • 然后,我从“内存”中丢弃第二列(
    行[1]
    )不等于“库存”的行
  • 然后,我获取其余的行,并仅获取它们的第一列(
    行[0]
  • 然后,我创建一个新对象(使用它的),它使用上面的列表,并将其指定给我想要验证的范围

    //VARIABLES
      var rangeToValidate = "B2:B";
      var validateSheet = "Sheet1";
      var optionSheet = "Stock";
    
    function refreshDataValidation() {
      
      var inStockOptions = SpreadsheetApp.getActive().getSheetByName(optionSheet).getDataRange().getValues()
      .filter(function (row) { return (row[1]=="In Stock")})
      .map(function(row) {return row[0]});
      
      SpreadsheetApp.getActive().getSheetByName(validateSheet).getRange(rangeToValidate)
      .setDataValidation(
        SpreadsheetApp.newDataValidation().requireValueInList(inStockOptions).build()
      );
      
    }
    
    此外,通过使用应用程序脚本添加一些代码,工作表将确保您的下拉列表始终是最新的

    每次打开工作表以及每次对B列上的库存工作表进行编辑时,我都会刷新下拉列表

    //When the sheet is opened, refresh the data validation
    function onOpen(e) {
      refreshDataValidation();
    }
    
    //When a change is made to the Stock sheet, also refresh validation
    function onEdit(e) {
      var range = e.range;
      if (range.getSheet() == SpreadsheetApp.getActive().getSheetByName(optionSheet) && range.getColumn() == 2) {
        refreshDataValidation();
      }
    }
    
    

    希望这有帮助

    好了,伙计们,我找到了一个解决方案,将来有人访问这个帖子,就在这里

    因此,可以使用上面提供的脚本。但是,如果您已经有了其他脚本、数据验证和其他格式,那么,像我一样,您实际上可能会遇到许多错误和冲突问题


    作为一个解决办法,我做了些什么,让一切正常工作。您总共需要3张图纸:一张主图纸、一张带有您的选项的第二张图纸,以及一张用于存放拉取数据的第三张图纸

  • 在第二张纸上,一定要有一个列,显示项目是“库存”还是“缺货”(我是作为下拉菜单做的)
  • 在第三页上,选择要显示数据的单元格。并使用过滤函数公式仅从第2页中提取等于“库存”的行。
  • 公式语法:=(筛选器(范围,条件1,[条件2,…)

    我的公式:=过滤器(sheet2!G3:R5,sheet2!I3:I5“缺货”)

    • sheet2!G3:R5=我希望从中提取的行/列的范围
    • sheet2!I3:I5=我希望它在该栏中查找“库存中”或“缺货”字样
    • “缺货”=如果第I3列中的单元格不等于“缺货”,则显示数据(表示仅显示在股票期权中)

    如您所见,公式将拉/显示所有=“库存中”的行,您设置为“缺货”的任何内容都不会显示在第三页上

    最后一部分,

  • 在主工作表上,选择要在下拉列表中显示的列。添加数据验证,确保从第三张工作表的范围中列出(而不是第2张)
  • 现在,您可以隐藏第三张工作表,因为您不再需要它,除非进行调试
  • 最后,正如您现在看到的,我的主工作表将只显示下拉列表中设置为“库存”的项目,库存外期权将从下拉列表中删除,除非设置为库存(请参见pic3如何在下拉列表中仅显示2个选项,尽管pic1显示有3个可用选项)

    所以现在基本上,如果我在第二张纸上将一个项目更改为“缺货”,该项目将从主表的下拉列表中删除,如果我将一个项目更改为“库存”该项目将添加/显示在下拉列表中。不再需要第三页。如果您有多个用户,并且只希望他们能够选择“库存”的选项,则此解决方案是完美的


    希望这对某人有所帮助!!!感谢上面的人,他们给出了其他可能的解决方案!!

    您可以加入您尝试过的if语句吗?听起来您需要重新考虑表单。您不需要Javascript来完成这项工作,并祝贺您在此过程中解决了另一个问题:)嗯,我已经试了几个小时了,所以很多都因为没工作而被我移除了。但是我知道我有三个