【问题标题】:Grouping multiple IF OR statements将多个 IF OR 语句分组
【发布时间】:2020-07-28 12:27:47
【问题描述】:

Cooper 编写了以下 onEdit 脚本来在从下拉列表中选择列标题名称时对列进行排序:

//Dropdown List sort Events/Incidents
 function sortByColumnEventsIncidents(e) {
  const sh=e.range.getSheet();
  if(sh.getName()=='Events/Incidents' && e.range.columnStart==5 && e.range.rowStart==1 && e.value) {
    const headerArray=sh.getRange(2,1,1,sh.getLastColumn()).getValues()[0];
    const col={};
    headerArray.forEach(function(h,i){col[h]=i+1;});
    const rg=sh.getRange(3,1,sh.getLastRow()-2,sh.getLastColumn());
    rg.sort({column:col[e.value],ascending:false});
    sh.getRange('A3').activate();
  }
}

这非常有效,但我现在想根据从下拉列表中选择的列标题名称更改升序真/假标准。因此,我修改了脚本,目的是当从下拉列表中选择“分支”、“报告者”或“员工”时,所选列将按升序排序,但如果选择了任何其他标题名称,我想要那些要降序排序的。这是我修改后的脚本,但我无法让它发挥作用:

//Dropdown List sort Events/Incidents
 function sortByColumnEventsIncidents(e) {
  const sh=e.range.getSheet();
  if(sh.getName()=='Events/Incidents' && e.range.columnStart==5 && e.range.rowStart==1 && e.value=='Employee' || sh.getName()=='Events/Incidents' && e.range.columnStart==5 && e.range.rowStart==1 && e.value=='Reported by' || sh.getName()=='Events/Incidents' && e.range.columnStart==5 && e.range.rowStart==1 && e.value=='Branch') {
    const headerArray=sh.getRange(2,1,1,sh.getLastColumn()).getValues()[0]; //Location of Header row
    const col={};
    headerArray.forEach(function(h,i){col[h]=i+1;});
    const rg=sh.getRange(3,1,sh.getLastRow()-2,sh.getLastColumn()); //Range to sort
    rg.sort({column:col[e.value],ascending:true});
    sh.getRange('A3').activate();
  }
  if(sh.getName()=='Events/Incidents' && e.range.columnStart==5 && e.range.rowStart==1 && e.value!=='Employee' || sh.getName()=='Events/Incidents' && e.range.columnStart==5 && e.range.rowStart==1 && e.value!=='Reported by' || sh.getName()=='Events/Incidents' && e.range.columnStart==5 && e.range.rowStart==1 && e.value!=='Branch') { //Location of Dropdown = E1
  const headerArray=sh.getRange(2,1,1,sh.getLastColumn()).getValues()[0]; //Location of Header row
    const col={};
    headerArray.forEach(function(h,i){col[h]=i+1;});
    const rg=sh.getRange(3,1,sh.getLastRow()-2,sh.getLastColumn()); //Range to sort
    rg.sort({column:col[e.value],ascending:false});
  }
}

在其他工作表中,我已经能够修改代码并使其在我设置了一个标准的情况下运行,例如如果等于“分支”,则升序排序,如果不等于“分支”,则降序排序,但是当我设置多个条件时,我无法让它工作。

如果能帮我解决这个问题,我将不胜感激。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    试试这个:

    function sortByColumnEventsIncidents(e) {
      const sh=e.range.getSheet();
      const sA=["Employee","Report by","Branch"];
      if(sh.getName()=='Events/Incidents' && e.range.columnStart==5 && e.range.rowStart==1) {
        const headerArray=sh.getRange(2,1,1,sh.getLastColumn()).getValues()[0];
        const col={};
        headerArray.forEach(function(h,i){col[h]=i+1;});
        const rg=sh.getRange(3,1,sh.getLastRow()-2,sh.getLastColumn());
        if(sA.indexOf(e.value)!=-1) {
          rg.sort({column:col[e.value],ascending:true});
          sh.getRange('A3').activate();
        }else{
          rg.sort({column:col[e.value],ascending:false});
        }        
      }
    }
    

    【讨论】:

    • 太完美了 - 再次感谢您的帮助。我假设 sA 表示 sheetArray?
    • 我在想 selectedArray。我以为它们是列标题。
    • 它们是 e.value 和 col 属性是列标题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2014-08-13
    • 2021-06-20
    相关资源
    最近更新 更多