繁体   English   中英

谷歌应用脚本根据依赖下拉列表粘贴行

[英]google apps script to paste row based on dependent drop down list

我根据本教程创建了一个带有相关下拉列表的 google 工作表。 我创建的工作表的副本。 我对相关下拉列表的功能感到满意,但是我的目标是从“材料”表(B:I 列)中复制与从相关下拉列表中选择的选项相对应的所有数据在“crop_specific”表的 E 列中,将此信息复制到 E:L 列。 如果更改了 D 列的选择,我想保留当前脚本的功能,即清除 E 列中的内容,并将其扩展到整行。 任何帮助将非常感激。 脚本的代码如下。

    var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("crop_specific");
var wsMaterials = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("materials");
var options = wsMaterials.getRange(2,1,wsMaterials.getLastRow()-1,9).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 == "crop_specific" && c === 4 && r>1){
    if(val === ""){
      ws.getRange(r,5).clearContent();
      ws.getRange(r,5).clearDataValidations();
    }else {
    ws.getRange(r,5).clearContent();
    var filteredOptions = options.filter(function(o){ return o[0] ===val });
    var listToApply = filteredOptions.map(function(o){return o[1] });
    var cell = ws.getRange(r,5);
    applyValidationToCell(listToApply,cell);
    }
  }
}

function applyValidationToCell(list,cell){
  
  var rule = SpreadsheetApp
    .newDataValidation()
    .requireValueInList(list)
    .setAllowInvalid(false)
    .build();

  cell.setDataValidation(rule);
}

解释:

  • 您可以添加一些代码来根据下拉选择过滤materials表中的数据。

  • 删除 A 列,因为您想从materials表中从 B 复制到 I。

  • 将值复制到crop_specific表中的E 到L 范围内。

我对crop_specific表有一些担忧:

  • 数据从编辑的行开始粘贴到范围 EL 中。 所以我假设您要清除该范围内的先前内容,否则新值将覆盖该范围的一部分。

  • E 列包含一个下拉菜单,具体取决于 D 列的值。也许您想下拉该下拉菜单,以便将其应用于 E 列中的其他单元格。

解决方案:

var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("crop_specific");
var wsMaterials = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("materials");
var options = wsMaterials.getRange(2,1,wsMaterials.getLastRow()-1,9).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 == "crop_specific" && c === 4 && r>1){
    if(val === ""){
      ws.getRange(r,5).clearContent();
      ws.getRange(r,5).clearDataValidations();
    }else {
    ws.getRange(r,5).clearContent();
    var filteredOptions = options.filter(function(o){ return o[0] ===val });
    var listToApply = filteredOptions.map(function(o){return o[1] });
    var cell = ws.getRange(r,5);
    applyValidationToCell(listToApply,cell);
  
    var matData = wsMaterials.getDataRange().getValues().filter(r=>r[0]===val); // new code
    matData.forEach(a => a.splice(0, 1)); // new code
    ws.getRange("E2:L" + ws.getLastRow()).clearContent(); // new code
    ws.getRange(r,5,matData.length,matData[0].length).setValues(matData); // new code
    
    }
  }
}

function applyValidationToCell(list,cell){
  
  var rule = SpreadsheetApp
    .newDataValidation()
    .requireValueInList(list)
    .setAllowInvalid(false)
    .build();

  cell.setDataValidation(rule);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM