如何从数据验证单元格onEdit排序2种不同的方式

时间:2019-03-02 09:08:14

标签: google-apps-script google-sheets

我正在尝试创建一个onEdit触发器来对2种方式中的一种进行排序。列表排序的方式由数据验证决定。一种排序选项(仅名称)为第3列“升序”。第二个选项(名称和TH)是对第4列进行降序排序,然后对第3列进行升序排序。

我目前有以下代码,如果更改了数据验证单元,则会触发该代码。效果很好,但不允许我选择其他方式对数据进行排序。

function sortRoster() {

  var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var roster = activeSheet.getRange("B8:D77");
  var sorter = activeSheet.getRange("G4");

  roster.sort( [{ column : 4, ascending: false },{ column : 3, ascending: true }] );
  var clear = activeSheet.getRange("G4").clearContent().setValue("Do you want to Sort?");
}

function onEdit(e) {
  // test if G4 was modified
  if (e.source.getActiveSheet() && e.range.rowStart === 4 && e.range.columnStart === 7) {
    sortRoster(); 

  }
}

我首先尝试添加另一个函数(称为sortName()),该函数仅在第3列上运行排序。

function sortName() {

  var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var roster = activeSheet.getRange("B8:D77");

  roster.sort( [{ column : 3, ascending: true }] );
  var clear = activeSheet.getRange("G4").clearContent().setValue("Do you want to Sort?");

然后我尝试将if更改为

if (e.source.getActiveSheet() && activeCell == "Name Only") {
  sortName();
  sorter.clearContent().setValue("Choose how to Sort?");
} else if (e.source.getActiveSheet() && activeCell == "Name and TH") {
  sortRoster();
  sorter.clearContent().setValue("Choose how to Sort?");
}

这个想法行不通,我也不明白为什么。
即使在网上研究后,我仍无法完全理解事件触发的工作原理。 我见过类似this的几个页面,但它们似乎并不能解决我遇到的相同问题。

在此先感谢您的帮助和指导。

1 个答案:

答案 0 :(得分:0)

通过几个复选框排序onEdit()

这需要在A4和A5中有几个复选框。这是其他的一部分。您还需要为onCheckOpenSideBar(e)创建一个可安装的onEdit触发器,或者可以使用提供的功能。

function onCheckOpenSideBar(e) {
  if(e.range.getSheet().getName()!='Sheet1')return;
  if(e.range.rowStart==4 && e.range.columnStart==1) {
    if(e.value=='TRUE') {
      sortByCol(3);
      e.range.getSheet().getRange(e.range.rowStart,e.range.columnStart).setValue("FALSE");
    }
  }
  if(e.range.rowStart==5 && e.range.columnStart==1) {
    if(e.value=='TRUE') {
      sortByCol(4,5);
      e.range.getSheet().getRange(e.range.rowStart,e.range.columnStart).setValue("FALSE");
    }
  }
}

function sortByCol(col,col2) {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet1');
  var rg=sh.getRange(1,3,getColumnHeight(col,sh,ss),3);
  if(col2) {
    rg.sort([{column: col,ascending:true},{column: col2,ascending:true}]);
  }else{
    rg.sort({column: col, ascending:true});
  }
}

function createOnEditTrigger() {
  ScriptApp.newTrigger('onCheckOpenSideBar').forSpreadsheet('Spreadsheet ID').onEdit().create();
}

这是我的电子表格在排序之前的样子。

enter image description here

A2和A3中的复选框用于打开侧边栏和对话框。

添加使用验证下拉列表

function onCheckOpenSideBar(e) {
  if(e.range.getSheet().getName()!='Sheet1')return;
  if(e.range.rowStart==2 && e.range.columnStart==1) {
    if(e.value=='TRUE') {
      openTheSidebar();
      e.range.getSheet().getRange(e.range.rowStart,e.range.columnStart).setValue("FALSE");
    }
  }
  if(e.range.rowStart==3 && e.range.columnStart==1) {
    if(e.value=='TRUE') {
      openTheDialog();
      e.range.getSheet().getRange(e.range.rowStart,e.range.columnStart).setValue("FALSE");
    }
  }
  if(e.range.rowStart==4 && e.range.columnStart==1) {
    if(e.value=='TRUE') {
      sortByCol(3);
      e.range.getSheet().getRange(e.range.rowStart,e.range.columnStart).setValue("FALSE");
    }
  }
  if(e.range.rowStart==5 && e.range.columnStart==1) {
    if(e.value=='TRUE') {
      sortByCol(4,5);
      e.range.getSheet().getRange(e.range.rowStart,e.range.columnStart).setValue("FALSE");
    }
  }
  if(e.range.rowStart==6 && e.range.columnStart==1) {
    if(e.value=='C') {
      sortByCol(3);
    }
  }
  if(e.range.rowStart==6 && e.range.columnStart==1) {
    if(e.value=='D,E') {
      sortByCol(4,5);
    }
  }
}

现在看起来像这样:

enter image description here

或者这个:

enter image description here

数据验证对话框:

enter image description here