Условная сортировка диапазона

#javascript #google-apps-script #google-sheets

#javascript #google-приложения-скрипт #google-таблицы

Вопрос:

Я хотел бы внедрить в свой лист скрипт, который проверяет, является ли значение в ячейке ИСТИННЫМ или ЛОЖНЫМ, и до тех пор, пока это ВЕРНО, указанный диапазон будет автоматически сортироваться при каждом изменении ячейки на листе. Кроме того, я хотел бы иметь возможность решить, будет ли диапазон отсортирован по возрастанию или по убыванию через выпадающее меню.

Что касается части «автоматическая сортировка», я нашел этот фрагмент кода:

 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 } );
  }
}
  

Источник: https://webapps.stackexchange.com/questions/7211/how-can-i-make-some-data-on-a-google-sheets-auto-sorting

Это работает просто отлично.
Теперь я попытался добавить свои условия следующим образом, и это перестало работать.
Можете ли вы помочь мне понять, что здесь не так?

 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. Привет! Я опубликовал свой ответ. Дайте мне знать, сработало ли это для вас.

Ответ №1:

Объяснение:

В вашем коде вы используете это выражение, которое всегда будет принимать значение false:

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

Причина в том, что «G21» никогда не будет равнозначно «TRUE».

Чтобы получить значение этой ячейки, просто вызовите:

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

То же самое справедливо для sortOrder .


Решение:

 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 } );
  }
}
  

Комментарии:

1. Я вижу! <br/> Итак, что я в основном сделал, это присвоил строку «G21» переменной sortCheck и то же самое для «G22» соответственно, но мне пришлось использовать класс getRange для достижения моей цели.<br/> Я также отметил ваше исправление к переменной sortOrderB , поскольку я, очевидно, использовал ее дважды в одной и той же функции. Это было довольно глупо.<br/> Единственное, что я сделал по-другому для своей цели, это то, что он вообще не должен сортировать, если флажок равен false:<br/> var sortCheckValue = sheet.getRange(sortCheck).getValue(); if(sortCheckValue == true){ var columnToSortBy = 4;