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

谷歌工作表相关下拉脚本查询

梁磊
2023-03-14

我试图在我的工作表中创建一个依赖的下拉列表,在Col A中,它将允许您选择区域列表(例如。美洲、非洲、亚洲)等,然后在Col B中显示在Col A中选择的该地区国家的列表。

我尝试使用=间接和=索引/匹配公式,但它们对我超过1000行的工作表不起作用。

我的工作簿中有11个选项卡,但是我只想将数据从“国家”选项卡拉到“主呼叫表”选项卡进行验证。所有其他选项卡都是从主工作表中删除的。

在countries(国家)选项卡中,我列出了第2行A栏中的地区以及B栏中的相应国家,因此如下所示:

非洲加纳,亚洲。日本

等等。

在我的主调用选项卡中,我在顶部有切片器等,所以数据输入只从第9行开始。

我尝试了下面的脚本,但没有成功:

var mainWsName = "Master Calls Sheet";
var optionsWsName = "countries";
var firstLevelColumn = 1;
var secondLevelColumn = 2;

var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("mainWsName");
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("optionsWsName");
var options = wsOptions.getRange(2, 1,wsOptions.getLastRow()-1,2).getValues();

function myFunction() {

  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 == "mainWsName" && c === firstLevelColumn && r > 8){
       var filteredOptions = options.filter(function(o){ return o[0] === val });
       var listToApply = filteredOptions.map(function(o){ return o[1] });
    var cell = ws.getRange(r, 2);
    applyValidationToCell(listToApply,cell)
  }

  }}

function applyValidationToCell(list,cell){

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

  cell.setDataValidation(rule)

}

有人能帮忙吗?!?

共有1个答案

云季同
2023-03-14

您可以使用以下由两个函数组成的脚本来实现所需的功能:createDropdown()onEditTrigger(e)

  • 全局变量:
var ss = SpreadsheetApp.getActiveSpreadsheet()
var master = ss.getSheetByName("Master Calls Sheet");
var countries = ss.getSheetByName("countries");
var options = countries.getRange(2, 1,countries.getLastRow()-1,2).getValues();
var continentsList = ['Americas','Africa','Asia']; 

如果要将其他大陆添加到函数中,则只需更改var colontslist变量。

  • createDropdown()函数:
function createDropdown() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var rangeRule = SpreadsheetApp.newDataValidation().requireValueInList(continentsList,true).build();
  ss.getRange('A9').setDataValidation(rangeRule);
}

上述功能用于创建包含所有大陆的下拉列表,并将在主调用表的A9单元格上创建该下拉列表。

  • onEditTrigger(e)函数:
function onEditTrigger(e) {
  var countries = e.range.getSheet();
  var cellValue = e.range.getValue();

  var k =0;

  for (k=0; k<continentsList.length;k++) {

    if (cellValue == continentsList[k]) {
      countries.getRange("B9:B").clear();
      var j=0;
      for (var i=0; i<options.length; i++) 
        if (options[i][0]== continentsList[k]) {
          j++;
          countries.getRange(j+8,2).setValue(options[i][1]);
      }
    }
  }
}

上面的函数是一个可安装的触发器,这意味着每次下拉列表中的值被更改时,它都会触发。它的工作原理是循环遍历ContinentsList,并检查每次迭代的值是否与从下拉列表中选择的值相对应。如果值对应,则列出每个大陆的国家。

这些值将出现在B列上,从主调用表上的B9开始。

应使用以下属性设置触发器:

此外,我建议您查看以下链接,因为它们可能对您未来的发展有所帮助:

>

数据验证类。

 类似资料:
  • 我正在重新创建和扩展我以前制作的文档。我已经引入了我最初使用的脚本,并在我认为合适的地方对其进行了调整,以使其在本表中正常工作,但我一定错过了一些东西。可在此处找到涉及的3个电子表格文件的可编辑示例。这些文件是一个样本“价目表”、“目录”(它汇总了所有价目表中的制造商名称,还有一个“目录”选项卡,用于我的一个主要供应商未销售的杂项物品),以及“附录B”,这是我需要帮助的文件。 这份文件是我合同的增

  • 我有一个电子表格从谷歌表单收集我的表单回复。 附在这张纸上的是一个脚本,它将每一行都拉出,进行一些计算,并将结果放入另一张纸中。我不是每次都复制整张表,而是用下面的代码拉两张表的增量: 问题是,我还将过滤器应用于接收工作表,并且每当我插入任何新数据时,过滤器范围都不会更新。 有什么办法可以让我绕过这件事吗?作为上面更新函数的一部分,我能否以编程方式更新过滤器范围?

  • 我试图使用一个谷歌脚本,从检索2个证券字段,并将输出保存到Google Sheet文件。我还需要脚本将datetime添加到工作表的第一列。 我创建了一个包含3列的基本Google工作表: A的格式为DateTime。第1行中有列名称date,第2行之后为空 以下是我的功能: 以下是输出: C和D列的输出正确。A列输出错误。每次我运行该函数时,每一行都会在最后一行的上方添加: 我第一次运行该函数是

  • 如何让子类别列根据在google sheets的主类别下拉列表中选择的值填充下拉列表? 我谷歌了一下,找不到任何好的解决方案,所以我想分享我自己的。请看下面我的回答。

  • 在谷歌工作表上,尝试根据特定单元格中的值隐藏/取消隐藏行,并尝试在AppsScript中为此编写脚本。发现一个隔离工作(如果B55=NO,则隐藏64行): 但我需要对多个单元格和多行使用相同的方法,只要我展开它,就只有代码的最后一部分有效,而不是第一部分: 从这里开始,B121号牢房开始工作,但我的B55停止工作。有什么提示吗?谢谢!

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