当前位置: 首页 > 知识库问答 >
问题:

谷歌工作表相关下拉列表

桑博远
2023-03-14

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

这份文件是我合同的增编,列出了作为合同一部分出售的所有设备。它有2页(附录B和XREF),附录B有几个独立的列:供应商、制造商、型号、描述和价格。它们的依赖关系如下:

目前工作

  • 供应商:从外部参照提取基本数据验证!A2:A

不工作,脚本存档

  • 制造商:基于所选的供应商,应该是一个下拉列表,该列表来自XREF上以该供应商名称为首的列。

现在,这里有一个问题,它变得比我以前做的更棘手。

>

  • 型号:我希望这一栏是一个下拉列表,列出与该制造商相关的所有型号,来自供应商提供给我的完全独立的价格表。(我分享了一份样本价格表,反映了列位置,因为它们出现在所有这些文件中。

    说明:从“供应商”列中选择的价目表中显示所选型号的相应说明。

    Price:显示从供应商列中选定的价格列表中选定型号的相应加价价格。

    这就是我的目标和我正在奋斗的目标。

  • 共有1个答案

    秦飞航
    2023-03-14

    因此,我在工作表附录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个问题,以下是我的评论和想法:

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

     类似资料:
    • 我试图在我的工作表中创建一个依赖的下拉列表,在Col A中,它将允许您选择区域列表(例如。美洲、非洲、亚洲)等,然后在Col B中显示在Col A中选择的该地区国家的列表。 我尝试使用=间接和=索引/匹配公式,但它们对我超过1000行的工作表不起作用。 我的工作簿中有11个选项卡,但是我只想将数据从“国家”选项卡拉到“主呼叫表”选项卡进行验证。所有其他选项卡都是从主工作表中删除的。 在countr

    • 如何让子类别列根据在google sheets的主类别下拉列表中选择的值填充下拉列表? 我谷歌了一下,找不到任何好的解决方案,所以我想分享我自己的。请看下面我的回答。

    • 我的谷歌表单使用了用户马克斯·马克洛夫(Max Makhrov)编写的代码,这里的代码,在D-F列(用于位置)和H-L列(用于目标)中创建多个相关的动态下拉列表 我想帮助修改脚本以完成两件事: 无论从第一列的下拉菜单中选择了什么活动,我都希望J-L列可以使用相同的下拉菜单选项(重复)。正如您所看到的,我找到了一种方法,但对我来说,它似乎笨重且不理想,并且为错误留下了太多的空间。用户不应该选择活动两

    • 我有一张用谷歌表单制作的订单跟踪表。我有一个列,其中有一个从Items列表中填充的下拉列表,我用这个答案设置了多选功能,效果非常好。 这是我的实际代码 我遇到的唯一问题是单元格中的项由分隔,但是换行符不是按项分隔的,只是基于行的总长度,变化太大,无法调整列的宽度。我希望每个项目都在一个单元格中的自己的行上,基本上在选择每个项目后都有一个换行符。 目前我得到了这个: 我想: 我在代码中找到了一个部分

    • 我尝试使用“读取多个范围”示例: https://sheets.googleapis.com/v4/spreadsheets/{SpreadsheetID}/values:batchGet?范围=表1!B:B 来自:Google Sheets API v4示例我用我的电子表格ID替换了"spreadsheetId"。但当我发送GET请求(通过邮递员)我收到: 比我以前https://develop

    • 我试图在这里创建一个描述和回答(用脚本)的依赖列表。 我想实现的是,如果从第1列的单元格中选择某个值(例如“First”),那么同一行下一个单元格中的下拉选项应提供不同表格中列的一系列值,这些列的标题与第一个左单元格中的值相同(即,第一个表格称为“Selector”)-其中有下拉列表,在第二张名为“KAT”的表格中,我有这些下拉列表的选项)。然后,根据行的每个第一个单元格的值,每一行都可以这样做。