使用单元格内容修改下拉菜单列表

时间:2019-04-13 15:09:16

标签: validation google-apps-script drop-down-menu google-sheets

我有一个Google表格,我在其中保存有关大学的信息,并且有一个针对地区和国家(地区或大洲,不过您想看到的)列,而我想做的是让region列包含所有大洲的下拉菜单(数据验证),取决于您选择的大洲,“国家/地区”列将具有相应的国家/地区。

我还有一张包含所需数据的工作表,第一行是各大洲的名称,其余各行是该大洲的国家/地区。

我尝试了自定义公式,但最终发现过于复杂而无法正常工作,因此我将其删除。

如果有人知道我该如何使用脚本编辑器或直接在数据验证中做到这一点,那就太好了!

1 个答案:

答案 0 :(得分:1)

大陆和国家/地区下拉列表

很抱歉,但这有点牵连。让我们从获取数据的地方开始。这是网站:https://datahub.io/JohnSnowLabs/country-and-continent-codes-list

我实际上只是复制并粘贴到名为“ C&C”的工作表中。我先按大洲然后再按国家/地区对它进行排序,因为它减少了获取这些国家/地区的工作量,因此我依靠它保持不变。

这是Google脚本代码:

function onEdit(e) {
  var dlm=" - ";
  var msg="Start" + dlm;
  var sh=e.range.getSheet();
  if(sh.getName()!='DropDown')return;
  if(e.range.getA1Notation()=='A2' && e.value) {
    var dsh=e.source.getSheetByName('C&C');
    var drg=dsh.getRange(1,1,dsh.getLastRow(),1);
    var dvA=drg.getValues();
    var cA=[];
    var cStart=0;
    var cEnd=0;
    for(var i=0;i<dvA.length;i++) {
      if(!cEnd && !cStart && dvA[i][0]==e.value) {
        cStart=i+1;
        msg+="cStart: " + cStart + dlm;
        //e.source.toast(msg);
      }
      if(!cEnd && cStart && dvA[i][0]!=e.value || i==dvA.length-1) {
        cEnd=i+1;
        msg+="cEnd: " + cEnd + dlm;
        //e.source.toast(msg);
        break;
      }
    }
    var crg=dsh.getRange(cStart,3,cEnd-cStart+1,1);
    var cvA=crg.getValues();
    e.source.getRangeByName('Countries').clearContent();
    sh.getRange('B2').clearContent();
    e.source.getSheetByName('NamedRanges').getRange(2,2,cvA.length,1).setValues(cvA);
  }
  msg+="Exit" + dlm;
  e.source.toast(msg);
}

我把调试吐司留在那儿,以备不时之需。

这是C&C页面的外观:

enter image description here

这是我放置NamedRanges的页面。我将该页面命名为NamedRanges:

enter image description here

这是带有两个下拉菜单的页面:

enter image description here

它正在显示南美大陆的选择。

这是NamedRanges设置:

enter image description here

这是数据验证设置:

enter image description here

enter image description here