【问题标题】:Data Validation with possible loops带有可能循环的数据验证
【发布时间】:2022-01-18 07:17:13
【问题描述】:

这是一个基于一些旧 youtube 视频的动态数据验证集的功能脚本

速度很慢,我不确定哪里有可以删除的循环

直到 4 小时前才使用过脚本;谁能让这个运行得更快

任何建议表示赞赏!

function onEdit() {

  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Reference Sheet");

  if(ss.getName() == "Test Sheet" && ss.getActiveCell().getColumn() == 10 && ss.getActiveCell().getRow() > 7){

    ss.getActiveCell().offset(0, 1).clearContent().clearDataValidations();

    var materials = datass.getRange(1, 1, 1, datass.getLastColumn()).getValues();
    var materialIndex = materials[0].indexOf(ss.getActiveCell().getValue()) + 1;

    if(materialIndex != 0){

      var validationRangeMU = datass.getRange(2, materialIndex, datass.getLastRow());
      var validationRuleMU = SpreadsheetApp.newDataValidation().requireValueInRange(validationRangeMU).build();
      ss.getActiveCell().offset(0, 1).setDataValidation(validationRuleMU);

    }

  }

  if(ss.getName() == "Test Sheet" && ss.getActiveCell().getColumn() == 15 && ss.getActiveCell().getRow() > 7){

    ss.getActiveCell().offset(0, 1).clearContent().clearDataValidations();

    var materials = datass.getRange(1, 1, 1, datass.getLastColumn()).getValues();
    var materialIndex = materials[0].indexOf(ss.getActiveCell().getValue()) + 1;

    if(materialIndex != 0){

      var validationRangeMU = datass.getRange(2, materialIndex, datass.getLastRow());
      var validationRuleMU = SpreadsheetApp.newDataValidation().requireValueInRange(validationRangeMU).build();
      ss.getActiveCell().offset(0, 1).setDataValidation(validationRuleMU);

    }

  }

  if(ss.getName() == "Test Sheet" && ss.getActiveCell().getColumn() == 20 && ss.getActiveCell().getRow() > 7){

    ss.getActiveCell().offset(0, 1).clearContent().clearDataValidations();

    var materials = datass.getRange(1, 1, 1, datass.getLastColumn()).getValues();
    var materialIndex = materials[0].indexOf(ss.getActiveCell().getValue()) + 1;

    if(materialIndex != 0){

      var validationRangeMU = datass.getRange(2, materialIndex, datass.getLastRow());
      var validationRuleMU = SpreadsheetApp.newDataValidation().requireValueInRange(validationRangeMU).build();
      ss.getActiveCell().offset(0, 1).setDataValidation(validationRuleMU);

    }

  }

【问题讨论】:

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


    【解决方案1】:

    试试这个:

    充分利用事件对象

    function onEdit(e) {
      var idx = [10, 15, 20].indexOf(e.range.columnStart)
      if (e.range.getSheet().getName() == "Test Sheet" && ~idx && e.range.rowStart > 7) {
        var rsh = e.source.getSheetByName("Reference Sheet");
        e.range.offset(0, 1).clearContent().clearDataValidations();
        var materials = rsh.getRange(1, 1, 1, rsh.getLastColumn()).getValues();
        var materialIndex = materials[0].indexOf(e.value) + 1;
        if (materialIndex != 0) {
          var validationRangeMU = rsh.getRange(2, materialIndex, rsh.getLastRow());
          var validationRuleMU = SpreadsheetApp.newDataValidation().requireValueInRange(validationRangeMU).build();
          e.range.offset(0, 1).setDataValidation(validationRuleMU);
        }
      }
    }
    

    【讨论】:

    • 非常干净,因此您也为运行它的列编制了索引
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多