Google Apps 脚本 - 电子表格 - 根据不是来自电子表格的值在单元格中创建 onEdit 下拉列表

Google Apps Script - Spreadsheet - Create onEdit Dropdown list in a cell based on values not coming from a spreadsheet

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

我想要实现的是:

我此刻的经历:

我的问题:

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

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);

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

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

好吧,既然你说过你能够检索到你想要在下拉列表中显示的正确数据。您可以使用此函数来填充它。其中 range 是一个单元格区域,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 触发器是一个 installable 触发器,您可以通过以下方式安装它:

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

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

备注:

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