2
votes

I would like to implement a script into my sheet that checks if the value in a cell is TRUE or FALSE, and as long as it's TRUE a specified range shall become sorted automatically each time a cell in the sheet is modified. Furthermore, I would like to be able to decide whether the range will be sorted ascending or descending via a drop-down menu.

As for the "auto sort" part I've found this piece of code:

function onEdit(event){
  var sheet = event.source.getActiveSheet();
  var editedCell = sheet.getActiveCell();

  var columnToSortBy = 4;
  var tableRange = "B3:E9";

  if(editedCell.getColumn() == columnToSortBy){   
    var range = sheet.getRange(tableRange);
    range.sort( { column : columnToSortBy } );
  }
}

Source: https://webapps.stackexchange.com/questions/7211/how-can-i-make-some-data-on-a-google-sheets-auto-sorting

This works just fine.
Now, I tried to add my conditionals as follows and it stopped working.
Can you help me to understand what's wrong here?

function onEdit(event) {
  var sortCheck = "G21";    // This cell contains a check box
  if(sortCheck == "TRUE"){  // so its value is either TRUE or FALSE
  
    var sheet = event.source.getActiveSheet();
    var editedCell = sheet.getActiveCell();
  
    var columnToSortBy = 4;
    var tableRange = "B3:M18";
    var sortOrder = "G22";     // This cell contains the drop-down menu
                               // where the user chooses "ascending" or "descending"
    
    if(sortOrder == "descending"){
      var sortOrder = false
      } else if(sortOrder == "ascending"){
        var sortOrder = true
        }
    
    var range = sheet.getRange(tableRange);
    range.sort( { column : columnToSortBy,ascending: sortOrder } );
  }
}
1
Hi! I posted my answer. Let me know if it worked for you.soMario

1 Answers

3
votes

Explanation:

In your code, you use this expression which will always evaluate to false:

var sortCheck = "G21";    
if(sortCheck == "TRUE"){code}

The reason is that "G21" will never be equal to "TRUE".

To get the value of this cell, simply call:

var sortCheck = "G21";    // This cell contains a check box
var sortCheckValue = sheet.getRange(sortCheck).getValue();

The same holds for sortOrder.


Solution:

function onEdit(event) {

  var sheet = event.source.getActiveSheet();
  
  var sortCheck = "G21";    // This cell contains a check box
  var sortCheckValue = sheet.getRange(sortCheck).getValue();
  
  var columnToSortBy = 4;
  var tableRange = "B3:M18";
  var sortOrder = "G22"; 
  var sortOrderValue = sheet.getRange(sortOrder).getValue(); // sort order value
        
  if(sortCheckValue == true){  // so its value is either TRUE or FALSE
         
    if(sortOrderValue == "descending"){
      var sortOrderB = false;
      } else if(sortOrderValue == "ascending"){
        var sortOrderB = true;
        }
    
    var range = sheet.getRange(tableRange);
    range.sort( { column : columnToSortBy,ascending: sortOrderB } );
  }
}