Validation 将用于动态数据验证的Google Apps脚本应用于现有工作表
所以我使用(芝加哥计算机课程的学分)来填充GoogleSheets单元格的动态数据验证,基于用户在不同单元格中输入的内容 例如,如果他们在一个单元格中输入运动“Football”,则下一个单元格将对“CFB、CFL或NFL”进行数据验证,但如果他们在第一个单元格中输入“Basketball”,则第二个单元格的数据验证将更改为“ABL、CBB、NBA或WNBA” 脚本运行得非常好,欢迎您访问 然而。。。我的问题是: 我有一个包含9000行数据的现有电子表格。我想将这个新的数据验证方案应用到这个电子表格中。脚本由Validation 将用于动态数据验证的Google Apps脚本应用于现有工作表,validation,google-apps-script,google-sheets,Validation,Google Apps Script,Google Sheets,所以我使用(芝加哥计算机课程的学分)来填充GoogleSheets单元格的动态数据验证,基于用户在不同单元格中输入的内容 例如,如果他们在一个单元格中输入运动“Football”,则下一个单元格将对“CFB、CFL或NFL”进行数据验证,但如果他们在第一个单元格中输入“Basketball”,则第二个单元格的数据验证将更改为“ABL、CBB、NBA或WNBA” 脚本运行得非常好,欢迎您访问 然而。。。我的问题是: 我有一个包含9000行数据的现有电子表格。我想将这个新的数据验证方案应用到这个电子
onEdit()
函数触发,当您一次输入一行内容时,该函数非常有效。但是,如果我尝试在第一列中复制并粘贴一整组行,则只有第二列的第一行触发onEdit并获得新的数据验证,而第二列的所有其他行保持不变。我还尝试在第一列上“填充”或“填充范围”,它们的结果相同,即所选范围中的第一行获得新数据验证,但所选内容的其余部分保持不变
虽然如果我手动输入行,效果会很好,但我真的不想这样做9000次:)
如何修改脚本以使用复制/粘贴或填充的数据触发函数
谢谢
此处的脚本:
function onEdit(){
var tabLists = "Leagues";
var tabValidation = "2018";
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(tabLists);
var activeCell = ss.getActiveCell();
if(activeCell.getColumn() == 6 && activeCell.getRow() > 1 && ss.getSheetName() == tabValidation){
activeCell.offset(0, 1).clearContent().clearDataValidations();
var makes = datass.getRange(1, 1, 1, datass.getLastColumn()).getValues();
var makeIndex = makes[0].indexOf(activeCell.getValue()) + 1;
if(makeIndex != 0){
var validationRange = datass.getRange(3, makeIndex, datass.getLastRow());
var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
activeCell.offset(0, 1).setDataValidation(validationRule);
}
}
}
您应该使用,它将为您提供已编辑的范围。您现在所做的只是查看“活动单元”,它没有利用事件对象的优点,并且在快速更改时也可能导致错误
使用事件对象,当您一次(从复制/粘贴)编辑多个单元格时,您可以在范围内循环并设置验证
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
}
}
}