【问题标题】:Google Sheets: two sets of dependent drop down lists on same sheet and same scriptGoogle表格:同一表格和同一脚本上的两组相关下拉列表
【发布时间】:2019-10-11 01:54:01
【问题描述】:

三个小时前,我根本不知道怎么做依赖下拉列表。现在,我有一个数据验证列,在选择数据时,将为下一个单元格提供一个下拉列表。但是,我想这样做两次。问题是,我不知道如何在脚本中复制它。 This is how I even got this far

This is the link to my Google Sheet

这是我在尝试处理 FEEDBACK 列之前的代码。 TECHNICAL 列按预期工作:

var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Raw Data");
var wsTechnical = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Drop Downs - Technical");
var technical = wsTechnical.getRange(2, 1,wsTechnical.getLastRow()-1,2).getValues();



function onEdit(e){
  var activeCell = e.range;
  var val = activeCell.getValue();
  var r = activeCell.getRow();
  var c = activeCell.getColumn();
  var wsName = activeCell.getSheet().getName();
  if(wsName == "Raw Data" && c === 6 &&  r > 2){

    if(val === ""){
      ws.getRange(r, 7).clearContent();
      ws.getRange(r, 7).clearDataValidations();
    } else {
      ws.getRange(r, 7).clearContent();
      var filteredTechnical = technical.filter(function(t){ return t[0] === val });
      var listToApply = filteredTechnical.map(function(t){ return t[1] });
      var cell = ws.getRange(r, 7);
      applyValidationToCell(listToApply,cell);
    }
  }
}


function applyValidationToCell(list,cell){

  var rule = SpreadsheetApp
  .newDataValidation()
  .requireValueInList(list)
  .setAllowInvalid(false)
  .build();

  cell.setDataValidation(rule)
}

这就是我改变它的方式,希望它能为 FEEDBACK 列创建相同的流程,但它完全没有改变; TECHNICAL 列仍按预期工作,但 FEEDBACK 列不能 :

var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Raw Data");
var wsFeedback = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Drop Downs - Feedback");
var feedback = wsFeedback.getRange(2, 1,wsFeedback.getLastRow()-1,2).getValues();
var wsTechnical = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Drop Downs - Technical");
var technical = wsTechnical.getRange(2, 1,wsTechnical.getLastRow()-1,2).getValues();

function onEdit(e){
  var activeCell = e.range;
  var val = activeCell.getValue();
  var r = activeCell.getRow();
  var c = activeCel1.getColumn();
  var wsName = activeCell.getSheet().getName();
  if(wsName == "Raw Data" && c === 4 &&  r > 2){

    if(val === ""){
      ws.getRange(r, 5).clearContent();
      ws.getRange(r, 5).clearDataValidations();
    } else {
      ws.getRange(r, 5).clearContent();
      var filteredFeedback = feedback.filter(function(f){ return f[0] === val });
      var listToApply = filteredFeedback.map(function(f){ return f[1] });
      var cell = ws.getRange(r, 5);
      applyValidationToCell(listToApply,cell);
    }
  }
}

function onEdit(e){
  var activeCell = e.range;
  var val = activeCell.getValue();
  var r = activeCell.getRow();
  var c = activeCell.getColumn();
  var wsName = activeCell.getSheet().getName();
  if(wsName == "Raw Data" && c === 6 &&  r > 2){

    if(val === ""){
      ws.getRange(r, 7).clearContent();
      ws.getRange(r, 7).clearDataValidations();
    } else {
      ws.getRange(r, 7).clearContent();
      var filteredTechnical = technical.filter(function(t){ return t[0] === val });
      var listToApply = filteredTechnical.map(function(t){ return t[1] });
      var cell = ws.getRange(r, 7);
      applyValidationToCell(listToApply,cell);
    }
  }
}


function applyValidationToCell(list,cell){

  var rule = SpreadsheetApp
  .newDataValidation()
  .requireValueInList(list)
  .setAllowInvalid(false)
  .build();

  cell.setDataValidation(rule)
}

任何帮助将不胜感激!

编辑:再说一次,我对脚本几乎一无所知,而且……所有这些。如果愿意,请为我降低答案。谢谢!

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    您的问题在于您的 onEdit(e) 函数。

    当 Google 检测到进行了编辑时,它会调用 onEdit() 函数,但如果有两个,它不会同时调用两个,只会调用第一个。

    要解决此问题,请对您的代码执行以下操作:

    var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Raw Data");
    var wsFeedback = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Drop Downs - Feedback");
    var feedback = wsFeedback.getRange(2, 1,wsFeedback.getLastRow()-1,2).getValues();
    
    var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Raw Data");
    var wsTechnical = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Drop Downs - Technical");
    var technical = wsTechnical.getRange(2, 1,wsTechnical.getLastRow()-1,2).getValues();
    
    function onEdit(e){
      var activeCell = e.range;
      var val = activeCell.getValue();
      var r = activeCell.getRow();
      var c = activeCell.getColumn();
      var wsName = activeCell.getSheet().getName();
      if(wsName == "Raw Data" && c === 4 &&  r > 2){
    
        if(val === ""){
          ws.getRange(r, 5).clearContent();
          ws.getRange(r, 5).clearDataValidations();
        } else {
          ws.getRange(r, 5).clearContent();
          var filteredFeedback = feedback.filter(function(f){ return f[0] === val });
          var listToApply = filteredFeedback.map(function(f){ return f[1] });
          var cell = ws.getRange(r, 5);
          applyValidationToCell(listToApply,cell);
        }
      } else if(wsName == "Raw Data" && c === 6 &&  r > 2){
        if(val === ""){
          ws.getRange(r, 7).clearContent();
          ws.getRange(r, 7).clearDataValidations();
        } else {
          ws.getRange(r, 7).clearContent();
          var filteredTechnical = technical.filter(function(t){ return t[0] === val });
          var listToApply = filteredTechnical.map(function(t){ return t[1] });
          var cell = ws.getRange(r, 7);
          applyValidationToCell(listToApply,cell);
        }
      }
    }
    
    function applyValidationToCell(list,cell){
    
      var rule = SpreadsheetApp
      .newDataValidation()
      .requireValueInList(list)
      .setAllowInvalid(false)
      .build();
    
      cell.setDataValidation(rule)
    }
    

    希望这会有所帮助!

    【讨论】:

    • 不用担心。来帮忙。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    相关资源
    最近更新 更多