Google Apps 脚本 - 电子表格 - 根据不是来自电子表格的值在单元格中创建 onEdit 下拉列表
Google Apps Script - Spreadsheet - Create onEdit Dropdown list in a cell based on values not coming from a spreadsheet
我看过有关如何根据来自其他电子表格的范围值的值创建下拉列表的示例,下拉列表取决于单元格值。在我见过的所有示例中,值都来自其他电子表格的范围值。
我想要实现的是:
- 在包含 headers 列的电子表格中,我没有行。
- 当我编辑第一个单元格时,它会显示一个包含值的下拉列表。只有当我编辑单元格时。如果可能的话,我不想 pre-populate 固定行数的 st 列的单元格,因为我认为这可能会消耗时间,而且我不知道文件中会有多少个单元格一个月后。
- 下拉列表中的值是从另一个 Google 工作区服务中检索的。
我此刻的经历:
- 我能够检索要在下拉列表中显示的值
- 如果我是对的,构建下拉列表,就是使用SpreadsheetApp.newDataValidation()方法构建下拉列表
- 我的值存储在一个二维数组中,因为这似乎是将值传递到一系列单元格的方式,这些单元格传递到前一个方法的参数中,最后是 Build 方法
- 我能够设置一系列单元格的值(例如:A1:A10)并在每个单元格上显示一个下拉列表图标,但编辑单元格时显示的值类似于 val1;val2; val3...
我的问题:
- 如何在编辑单元格时在第 1 列的单元格上动态创建动态下拉列表?如果必须预填充第一列的单元格,那么至少为什么不
不知道我说的够不够清楚。这是脚本的想法:
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
触发器安装它不是一个好主意,因为这将在每次打开电子表格时安装一个新触发器,并且您最终会得到许多重复的触发器。
我看过有关如何根据来自其他电子表格的范围值的值创建下拉列表的示例,下拉列表取决于单元格值。在我见过的所有示例中,值都来自其他电子表格的范围值。
我想要实现的是:
- 在包含 headers 列的电子表格中,我没有行。
- 当我编辑第一个单元格时,它会显示一个包含值的下拉列表。只有当我编辑单元格时。如果可能的话,我不想 pre-populate 固定行数的 st 列的单元格,因为我认为这可能会消耗时间,而且我不知道文件中会有多少个单元格一个月后。
- 下拉列表中的值是从另一个 Google 工作区服务中检索的。
我此刻的经历:
- 我能够检索要在下拉列表中显示的值
- 如果我是对的,构建下拉列表,就是使用SpreadsheetApp.newDataValidation()方法构建下拉列表
- 我的值存储在一个二维数组中,因为这似乎是将值传递到一系列单元格的方式,这些单元格传递到前一个方法的参数中,最后是 Build 方法
- 我能够设置一系列单元格的值(例如:A1:A10)并在每个单元格上显示一个下拉列表图标,但编辑单元格时显示的值类似于 val1;val2; val3...
我的问题:
- 如何在编辑单元格时在第 1 列的单元格上动态创建动态下拉列表?如果必须预填充第一列的单元格,那么至少为什么不
不知道我说的够不够清楚。这是脚本的想法:
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
触发器安装它不是一个好主意,因为这将在每次打开电子表格时安装一个新触发器,并且您最终会得到许多重复的触发器。