因此,我正在使用this script(归功于Chicago Computer Classes)根据用户在其他单元格中输入的内容来填充Google表格单元格的动态数据验证。
例如,如果他们在一个单元格中输入运动“足球”,则下一个单元格具有“ CFB,CFL或NFL”的数据验证,但如果他们在第一个单元格中输入“篮球”,则第二个单元格的数据验证例如更改为“ ABL,CBB,NBA或WNBA”。
该脚本的运行效果非常好,欢迎您使用play with the sheet here
但是...这是我的问题:
我有一个具有9000行数据的现有电子表格。我想将此新的数据验证方案应用于此电子表格。该脚本由if(process.env.NODE_ENV === 'development') require("../tests/mock/api");
函数触发,当您一次输入一行内容时,该函数非常有用。但是,如果我尝试在第一列中复制并粘贴一整行,则仅第二列的第一行会触发onEdit并获得新的数据验证,而第二列的所有其他行均保持不变。我还尝试在第一列上“填充”或“填充范围”,当选定范围的第一行获得新数据验证时,它们具有相同的结果,但其余选择保持不变。
尽管如果我手动输入行也可以,但我真的不希望这样做9000次:)
如何修改脚本以使用复制/粘贴或填写的数据触发功能?
谢谢!
此处脚本:
onEdit()
答案 0 :(得分:0)
您应该使用event object,它将为您提供已编辑的范围。您现在所要做的只是看“活动单元”,它没有利用事件对象的好处,并且在您进行快速更改时也可能导致错误。
使用事件对象,一次(从复制/粘贴)一次对多个单元格进行编辑,然后可以遍历范围并设置验证。
function onEdit(e) {
var editedRange = e.range;
var ss = editedRange.getSheet();
var tabValidation = "2018";
if(editedRange.getColumn() == 6 && editedRange.getRow() > 1 && ss.getSheetName() == tabValidation) {
var tabLists = "Leagues";
var tabListsSheet = e.source.getSheetByName(tabLists);
var makes = tabListsSheet.getRange(1, 1, 1, tabListsSheet.getLastColumn()).getValues(); // This won't change during execution, so call only once
var activeCell = editedRange.getCell(1,1); // Start with the first cell
var remainingRows = editedRange.getHeight();
while(remainingRows > 0) {
var cellValue = activeCell.getValue();
activeCell.offset(0, 1).clearContent().clearDataValidations(); // Always clear content & validations
if (cellValue != "") { // Add validations if cell isn't blank
var makeIndex = makes[0].indexOf(cellValue) + 1;
if(makeIndex != 0) {
var validationRange = tabListsSheet.getRange(3, makeIndex, tabListsSheet.getLastRow()-2);
var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
activeCell.offset(0, 1).setDataValidation(validationRule);
}
}
activeCell = activeCell.offset(1, 0); // Get the next cell down
remainingRows--; // Decrement the counter
}
}
}