当前位置: 首页 > 知识库问答 >
问题:

谷歌应用程序脚本粘贴行基于依赖的下拉列表

汪鸿波
2023-03-14

我已经创建了一个基于本教程的依赖下拉列表的谷歌表。我创建的工作表的副本。我对依赖下拉列表的功能很满意,但是我的目标是从“材料”表(列B: I)中复制一行中的所有数据,这些数据对应于从列E中的依赖下拉列表中选择的选项"crop_specific"表,将此信息复制到列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);
}

共有1个答案

夏飞跃
2023-03-14

>

删除列A,因为您想从材料工作表中从B复制到I。

将值复制到特定裁剪表中的范围E到L。

我有一些关于crop_specific表的问题:

>

列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);
}
 类似资料:
  • 我写了一些代码,应该在显示“分支”的一列中使用一个值,并在此基础上更改“分配给OE”中的下拉菜单(对于上下文,OE是员工),因此可以从下拉列表中选择OE名称,基于他们所在的分支。该列表将仅显示来自相应分支机构的员工。 这是我的电子表格副本,清除了不相关的列:https://docs.google.com/spreadsheets/d/1dzTYQL1YPX6z6qtV4_tNl4ntBMLqcMQ

  • 我使用一个简单的脚本来删除1天后所有标有“摄像头”的电子邮件。这已经奏效好几个月了。我没有改变它,但它突然停止工作。 该脚本仍有在我的Gmail上运行的权限,但已停止。 感谢任何建议。 脚本是; 谢了山姆

  • 在继续使用GoogleApps脚本构建Google电子表格的过程中,我已经完成了获取Bittrex和Poloniex余额的工作,但无法使用Cryptopia。 下面是我与Bittrex将JSON对象数组映射到字符串的斗争的链接 以下是官方API链接:https://www.cryptopia.co.nz/Forum/Thread/256 以下是一些例子: https://www.cryptopia

  • 我在名为“Dashboard”的工作表的F5单元格中有一个主题下拉列表。主题列表(例如,All、ICTE4113、HUM4115、PHY 4105)来自另一个名为“主”的选项卡,其中主题位于第6列,日期位于第1列。 现在在仪表板的G5单元格中,我想看到一个下拉列表,其中只列出与仪表板F5单元格中所选主题相关的唯一日期。但它根本不会产生任何下拉列表。 显然,这些独特的日期将来自Master表的第1列

  • 使用谷歌应用脚本Gmail库,当我使用函数,API似乎将过去的一个段落拆分为多个段落,可能会使用字符限制。例如,我的电子邮件中有一段写道: 但当我在电子邮件中调用此功能时,它变成: 而且,当我在一个新的行定界符上拆分电子邮件文本,并进行一些清理,以使用我的输出创建一个数组时,我最终得到: 我查看了这篇Reddit帖子,它似乎处理了类似的问题。但是,我尝试了提出问题的人提出的解决方案: 但它并没有满

  • 我将描述我的CMake项目目前是如何安排的。现在还早,所以欢迎提出更好的安排。 顶级 lib1 lib2 我在每个级别上都有cmakelists.txt。 在Lib1 I add_library(STATIC)中,然后使用Lib2 target_link_library,它也是静态的。 lib2的cmakelists.txt执行对Qt5Widgets、Qt5Core和qt5gui的find_pac