Google apps脚本粘贴行基于依赖下拉列表



我根据本教程创建了一个带有从属下拉列表的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表有一些担忧:

  • 数据从被编辑的行开始粘贴到E-L范围内。因此,我假设您想要清除该范围内先前的内容,否则新值将覆盖该范围的一部分。

  • 列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);
}

最新更新