【问题标题】:Applying Google Apps Script for Dynamic Data Validation to Existing Sheet将用于动态数据验证的 Google Apps 脚本应用于现有工作表
【发布时间】:2019-01-14 02:26:27
【问题描述】:

所以我使用this script(归功于 Chicago Computer Classes)根据用户在不同单元格中输入的内容填充 Google 表格单元格的动态数据验证。

例如,如果他们在一个单元格中输入运动“足球”,则下一个单元格对“CFB、CFL 或 NFL”进行数据验证,但如果他们在第一个单元格中输入“篮球”,则在第二个单元格中输入数据验证例如,更改为“ABL、CBB、NBA 或 WNBA”。

脚本运行良好,欢迎您play with the sheet here

但是……这是我的问题:

我有一个包含 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);

     }  

  }

}

【问题讨论】:

    标签: validation google-apps-script google-sheets


    【解决方案1】:

    您应该使用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
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多