google-apps-script - Google Apps 脚本 - 电子表格 - 根据不是来自电子表格的值在单元格中创建 onEdit 下拉列表
问题描述
我已经看到了有关如何根据来自其他电子表格的范围值的值创建下拉列表的示例,下拉列表取决于单元格值。在我看到的所有示例中,值都来自其他电子表格的范围值。
我想要实现的是:
- 在带有列标题的电子表格中,我没有行。
- 当我编辑第一个单元格时,它会显示一个带有值的下拉列表。只有当我编辑单元格时。如果可能的话,我不想为固定数量的行预先填充 st 列的单元格,因为我认为这可能会消耗时间,而且我不知道一个文件中会有多少个单元格月。
- 下拉列表中的值是从另一个 Google Workspace 服务中检索的。
我此刻所经历的:
- 我能够检索要在下拉列表中显示的值
- 如果我是对的,要构建一个下拉列表,可以使用 SpreadsheetApp.newDataValidation() 方法来构建下拉列表
- 我的值存储在二维数组中,因为这似乎是将值传递给传递给前一个方法的参数的单元格范围的方法,最后是 Build 方法
- 我能够为一系列单元格设置值(例如:A1:A10)并在每个单元格上显示一个下拉列表图标,但编辑单元格时显示的值类似于 val1;val2;val3...
我的问题:
- 当我编辑单元格时,如何在第一列的单元格上动态创建一个动态下拉列表?如果必须预先填充第一列的单元格,那么至少为什么不
我不知道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);
如您所见,我正在传递范围数据,这可能不是正确的方法
非常感谢任何帮助提前非常感谢
解决方案
好吧,既然您说您可以检索要在下拉列表中显示的正确数据。您可以使用此函数来填充它。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();
}