首页 > 解决方案 > Google Apps 脚本 - 电子表格 - 根据不是来自电子表格的值在单元格中创建 onEdit 下拉列表

问题描述

我已经看到了有关如何根据来自其他电子表格的范围值的值创建下拉列表的示例,下拉列表取决于单元格值。在我看到的所有示例中,值都来自其他电子表格的范围值。

我想要实现的是:

我此刻所经历的:

我的问题:

我不知道iwa是否足够清楚。这是脚本的想法:

var v_spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var v_sheet = v_spreadsheet.getActiveSheet();
// I imagine i could specify A1:A1 to specify only the cell that is being edited ?
var range = v_sheet.getRange("A2:A5");
// my array below is 2 dimensions : v_array[0][0] = 'val1', v_array[0][1] = 'val2', etc
range.setValues(v_array_taskLists);
var dd_values = range.getValues();
var validationRule   = SpreadsheetApp.newDataValidation().requireValueInList(dd_values).build();
range.setDataValidation(validationRule);

如您所见,我正在传递范围数据,这可能不是正确的方法

非常感谢任何帮助提前非常感谢

标签: google-apps-scriptgoogle-sheetsdropdown

解决方案


好吧,既然您说您可以检索要在下拉列表中显示的正确数据。您可以使用此函数来填充它。Whererange是一系列单元格,并且list是您希望在下拉列表中显示的值列表。

function setRangeDataValidation(range, list) {
  var rangelValidation = SpreadsheetApp.newDataValidation()
    .requireValueInList(list)
    .setAllowInvalid(false)
    .build();
  range.setDataValidation(rangelValidation);
}

您可以使用触发器动态更改下拉列表中可用的值onChange(这是我在类似应用程序中使用的方法)。假设您希望A在另一列中进行某些更改时更改列中的数据验证,例如B在同一行中。

function onChange(e) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var ws = ss.getActiveSheet()

    if (e.changeType === 'EDIT') {
      var activeRange = ws.getActiveRange();
      var editCol = activeRange.getColumn();
      
      if (editCol === 1) {
        // in case more rows are changed at the same time (copy and paste)
        var numRows = activeRange.getNumRows();
        var startRow = activeRange.getRow();

        var yourList = //the list to be updated in the dropdown

        //You can loop through the list of values that were edited in column A in case you want a different dropdown in column B for each value passed in column A.
        for (var row = 0; row < numRows; row++) {
          // Here if you want different lists in the dropdown for different cells in columns A you can do the following
          //var cellColA = activeRange.getCell(startRow + row, 1).getValue();
          // yourList = updatedList;

          // Then et range of cell in column B
          var cellColB = ws.getRange(startRow + row, 2);
          setRangeDataValidation(cellColB, youList)
        }
      }
    }

请记住,onChange触发器是一个可安装的触发器,您可以通过这种方式安装:

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

  ScriptApp.newTrigger('onChange')
    .forSpreadsheet(ss)
    .onChange()
    .create();
}

笔记:

  • 如果您只需要跟踪电子表格内容的更改,而不是其结构,则可以说使用可安装的onEdit()触发器而不是onChange( ) 触发器更合适。
  • 通过onOpen触发器安装它不是一个好主意,因为这将在每次打开电子表格时安装一个新触发器,并且您最终会得到许多重复的触发器。

推荐阅读