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

Google工作表中具有重复列下拉列表的多个相关动态下拉列表

赫连俊雄
2023-03-14

我的谷歌表单使用了用户马克斯·马克洛夫(Max Makhrov)编写的代码,这里的代码,在D-F列(用于位置)和H-L列(用于目标)中创建多个相关的动态下拉列表

我想帮助修改脚本以完成两件事:

  1. 无论从第一列的下拉菜单中选择了什么活动,我都希望J-L列可以使用相同的下拉菜单选项(重复)。正如您所看到的,我找到了一种方法,但对我来说,它似乎笨重且不理想,并且为错误留下了太多的空间。用户不应该选择活动两次,但我已经在其中添加了条件格式来标记是否选择了。但是:
  2. 理想情况下,但不太重要的是,如果下拉菜单项仍然可以对J-L列重复,但一旦在以前的单元格中选择了某个活动,则该选项将从以下每个重复的下拉菜单的附加列(包括L列)中删除。这将有助于避免意外重复某个活动

注:参考问题“如何在谷歌工作表中进行动态/相关下拉?”

谢谢你!

共有1个答案

强才捷
2023-03-14

编辑其中一个下拉单元格时,您可以使用onEdit触发器[1]迭代4列(I-L),并更新每个单元格中的下拉列表,删除编辑单元格中选择的选项。您还需要将旧的选定值(以前从其他选项中删除)添加到其他下拉列表中。为此,您可以使用链接到Range对象的getDataVal事实上[2]和getCriteriaValue[3]函数来检索该范围上的当前下拉值数组,并删除与所选选项匹配的选项。

使用newDataValidation()[4]函数使用更新的下拉值数组创建新规则,并使用setDataValidation[5]函数将规则设置为范围。

function onEdit(event) {
  var range = event.range;
  var sheetName = range.getSheet().getSheetName();
  var col = range.getColumn();
  var newValue = event.value;
  var oldValue = event.oldValue;

  //If the edited range is in sheet '3W' and beetween columns I-L
  if(sheetName == '3W') {
    if(col>=9 && col<=12) {

      for(var i=9; i<13; i++) {
        //Don't change anything for edited cell
        if(col == i) { continue; }
        else {
          //Get range to update and current dropdown values for that range
          var rangeToUpdate = range.getSheet().getRange(range.getRow(), i, 1, 1);
          var dropdownValues = rangeToUpdate.getDataValidation().getCriteriaValues()[0];

          //Find new edited value and delete it from options array
          var index = dropdownValues.indexOf(newValue);
          if (index > -1) {
            dropdownValues.splice(index, 1);
          }

          //If previous selected value is not beetween the options, add it
          if(oldValue && dropdownValues.indexOf(oldValue) == -1) {
            Logger.log(oldValue)
            dropdownValues.push(oldValue);
          }

          //Set new dropdown values to range 
          var updatedRule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownValues, true).setAllowInvalid(false);
          rangeToUpdate.setDataValidation(updatedRule);
        }
      }    
    }
  }
}

仅在第一次运行时设置I-L列中的所有下拉列表,这些下拉列表从范围E1:E10:

function setDropdownsInitially() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  //Range with the dropdown values 
  var sheet = ss.getSheetByName("indicators");
  var dropdownValues = sheet.getRange("E1:E10").getValues();

  //Data validation rule
  var rule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownValues, true).setAllowInvalid(false);

  //Range where the dropdowns will be created
  var targetSheet = ss.getSheetByName("3W");
  var cells = targetSheet.getRange("I2:L"); 

  //Set data validation rule
  cells.setDataValidation(rule);
}

[1]https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

[2]https://developers.google.com/apps-script/reference/spreadsheet/range#getdatavalidation

[3] https://developers.google.com/apps-script/reference/spreadsheet/data-validation-builder.html#getcriteriavalues

[4] https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#newdatavalidation

[5] https://developers.google.com/apps-script/reference/spreadsheet/range#setdatavalidationrule

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

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

  • 我有一张有两个标签的工作表。一个选项卡我有一个值的主列表。在第二张表中,A、B和C列具有固定的下拉验证。如何设置第二张工作表,使D列中的数据验证基于A、B和C列是动态的? 我曾尝试编写一个应用程序脚本,查看列A、B和C的值,创建一个适当值的数组,然后动态创建验证,但未能找到一种逐行运行的方法。 以前有没有人做过这项工作,或者有没有人能想出一种方法来做?

  • 增加下拉列表在到按钮上,确保 data-activates 属性匹配 <ul> 标签的 id,你可以增加分隔线通过 <li class="divider"></li> 标签。 <!-- Dropdown Trigger --> <a class='dropdown-button btn' href='#' data-activates='dropdown1'>单击我</a> <!-- D

  • 问题内容: 我需要使用JavaScript根据下拉菜单A中的选择更改下拉菜单B的内容。没有涉及到数据库查询- 我事先知道应该在A中选择B的内容。我已经找到了一些使用AJAX的示例,但是由于没有涉及到数据库查询,所以没有必要。谁能为我指出一些示例代码以实现此目的? 问题答案: function configureDropDownLists(ddl1, ddl2) {

  • 我正在rails中使用引导下拉列表,它突然停止工作。如果我像它工作正常,但如果我真的单击它,什么也不会发生。 如果我使用jQuery附加了一个单击处理程序,如,然后当我单击链接时触发。 这是不是因为事件被什么东西吞没了?有没有办法弄清楚这是什么? 我不能在jsFiddle类型的环境中重现错误,但这里是相关的html: 更新:我发现如果我调用页面加载几秒钟后,它就可以工作了,但如果我在页面加载时正确