【问题标题】:Google Sheets - Dependent drop-down listsGoogle 表格 - 相关下拉列表
【发布时间】:2017-03-14 22:02:12
【问题描述】:

我正在重新创建和扩展我之前制作的文档。我已经引入了我最初使用的脚本,并在我认为合适的地方对其进行了调整以使其在这张表中工作,但我一定错过了一些东西。可以在here 找到所涉及的 3 个电子表格文件的可编辑示例。这些文件是样本“价目表”、“目录”(它汇总了所有价目表中的制造商名称,并且还有一个“目录”选项卡用于显示我的主要供应商之一未出售的杂项)和“附录 B”是我需要帮助的文件。

本文件是我的合同的附录,其中列出了作为该合同一部分出售的所有设备。它有 2 张工作表(“附录 B”和“XREF”),“附录 B”有几个相关列:供应商、制造商、型号、描述和价格。它们的依赖关系如下:

目前正在工作

  • 供应商:从 XREF!A2:A 提取基本数据验证。

不工作,文件中的脚本

  • 制造商:根据选择的供应商,应该是一个下拉列表 从标题为该供应商名称的列生成的列表 “外部参照”。

现在它变得比我以前做的更棘手了。

  • 型号:我希望此列是一个下拉列表,列出所有型号 与该制造商相关联,价格完全不同 我的供应商提供给我的清单。 (我已经分享了一个示例价目表,它反映了列在所有此类文件中出现的位置。

  • 描述:显示所选模型的相应描述,从供应商列中选择的价目表中。

  • 价格:显示所选型号的相应加价,从供应商列中选择的价目表中。

这大概总结了我的目标和我正在努力解决的问题。

【问题讨论】:

  • 最后注意,如果您包含您的代码并限制自己提出多个问题,您将获得更好的响应。包含代码表明您为问题付出了努力,并且只提出一个/相关的问题可以使问题易于处理。此外,还可以防止问题因太板而被关闭。

标签: drop-down-menu google-apps-script


【解决方案1】:

所以我在附录 B 中查看了您的脚本文件。 我做了一些编辑,它现在应该可以工作了,修改后的代码:

    function onEdit() 
{
  var ss = SpreadsheetApp.getActiveSpreadsheet(),
      sheet = ss.getActiveSheet(),
      name = sheet.getName();
  if (name != 'Addendum B') return;
  var range = sheet.getActiveRange(),
      col = range.getColumn();
  if (col != 6) return;  //You col was set to 5 changed it to 6!
  var val = range.getValue(),
      dv = ss.getSheetByName('XREF'),
      data = dv.getDataRange().getValues(),
      catCol = data[0].indexOf(val),
      list = [];
  Logger.log(catCol)
  for (var i = 1, len = 100; i < len; i++) // Problem is here, you have too many items in list! Cannot have more 500 items for validation
      list.push(data[i][catCol]);
  var listRange = dv.getRange(2,catCol +1,dv.getLastRow() - 1, 1)
  Logger.log(list)
  var cell = sheet.getRange(range.getRow(), col-1)
  var rule = SpreadsheetApp.newDataValidation()
  .requireValueInRange(listRange)   // Use requireValueIn Range instead to fix the problem
  .build();
  cell.setDataValidation(rule);
  Logger.log(cell.getRow())
}

您的验证无效的原因是您的数据验证列表中有超过 500 项。我只是将其修改为从范围中获取相同的值。希望对您有所帮助!

现在对于剩下的 3 个问题,以下是我的 cmets 和想法:

1)我没有找到与您在问题中提到的问题相关的任何代码。所以,我假设您正在询问有关如何实现这一目标的一般想法?

2) 你基本上用上面的代码来解决这个问题!选择制造商后,脚本会在工作表中查找该制造商并更新相应模型列中的数据验证。 您将像这样修改代码

var ss = SpreadsheetApp.openById("1nbCJOkpIQxnn71sJPj6X4KaahROP5cMg1SI9xIeJdvY")
//The above code with select the catalog sheet.
dv = ss.getSheetByName('Misc_Catalog')
//The above code will open the Misc_Catalog tab. 

3) 更好的方法是使用边栏/对话框来验证您的输入,然后将其添加到最后的工作表中。 (看起来更干净,还可以防止工作表中不必要的编辑触发器,这可能需要一段时间才能更新。) 您可以在此处找到更多详细信息:https://developers.google.com/apps-script/guides/dialogs

【讨论】:

  • 这很有趣。我不熟悉创建其中任何一个。您是在建议一个包含三个下拉菜单的对话框,然后在“确定”时填充该行?
  • 是的,完全正确。当您填写所需的详细信息时,下拉菜单将得到更新。
  • 所以,我只是在测试您的修复,它似乎并没有完全工作。制造商下拉菜单仅显示前 48 个结果。至于对话框/侧边栏,你能给我一个如何堆叠所有代码的例子吗?我查看了您在答案末尾提供的链接,并了解了工作中的一般原则,但这超出了我的熟悉范围。
  • 是的,是使用错误的表格来获取最后一行。修改了它,现在应该可以使用了。
  • 再次感谢您的宝贵帮助。我仍然不确定如何编写第二个查找。在单元格公式中,我会使用'=arrayformula(vlookup(...))',但我不知道如何将其转换为这种情况。第一个下拉菜单是从列中检索定义的列表,但模型下拉菜单需要找到 colA=MFR 的 colB 的所有值。
猜你喜欢
  • 2019-03-05
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 2014-09-13
相关资源
最近更新 更多