Сортировать столбец по количеству слов в ячейке от самого младшего сценария Google - PullRequest
0 голосов
/ 04 июля 2018

Мне нужно отсортировать диапазон столбцов по количеству слов в ячейке, от наибольшего количества слов в ячейке до наименьшего количества слов в ячейке

Пример

ahtn bmm cnst
Abb Baa
HHH
cc
a
b
c

Я могу отсортировать столбец

function sortColumn() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName("Sheet1");
  var lastCol = s.getLastColumn();
  var lastRow = s.getLastRow();

  // assumes headers in row 1
  var r = s.getRange(2, 1, lastRow - 1, lastCol);

  // Sort on column G = 7
  r.sort([{ column: 7, ascending: true }]);

}

и я могу сортировать массив по мере необходимости

function highLow(a,b){
     return b.length - a.length || // sort by length, if equal then
     a.localeCompare(b);    // sort by dictionary order
} 

, что дает

[HHH,Abb Baa,cc,ahtn bmm cnst,b,c,a].sort(highLow) =  [ahtn bmm cnst,Abb Baa,HHH,cc,a,b,c]

Но я не могу понять, как сортировать диапазон столбцов таким образом, как Google Script, а не формула

Заранее благодарим за помощь

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Кажется, вы не можете сортировать листы ни по чему, кроме столбца. Простым решением было бы добавить еще один столбец с количеством слов и отсортировать по нему.

Здесь описан простой подсчет слов :

=COUNTA(SPLIT(G1, " "))

Если вам нужен сценарий, вы можете прочитать значения из вашей электронной таблицы с помощью range.getValues ​​(), отсортировать двумерный массив, полученный в javascript, а затем записать отсортированные значения обратно в тот же диапазон:

function sortColumn() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName("Sheet1");
  var lastCol = s.getLastColumn();
  var lastRow = s.getLastRow();

  // assumes headers in row 1
  var r = s.getRange(2, 1, lastRow - 1, lastCol);

  // read the Sheet values into a javascript array
  var values = r.getValues();

  var sortedValues = values.sort(wordCountCompare); 

  // write the sorted values back into the Sheet range
  r.setValues(sortedValues);

}

Функция сортировки javascript очень рада сортировать двумерный массив, вам просто нужно передать соответствующую функцию сравнения, чтобы она могла определить порядок:

function wordCountCompare(a, b) {

  // Sort on column G - in javascript this is array element 6
  // make sure the value is a string (toString)
  // split the string using a space
  // get the length of the split array which is the wordCount
  var wordCountA = a[6].toString().split(" ").length;
  var wordCountB = b[6].toString().split(" ").length;

  return wordCountB - wordCountA;
}

Примечание: Это количество слов является приблизительным и использует пробелы для идентификации слова. Вы могли бы сделать лучше, который знает знаки препинания.

0 голосов
/ 04 июля 2018

Вы хотите добиться своей особой сортировки, используя спецификацию, аналогичную методу sort(sortSpecObj) в классе Range. Например, когда «3» (столбец C) и «A2: D» заданы в виде столбца и диапазона, ввод и вывод выполняются следующим образом.

Вход:

enter image description here

Выход :

enter image description here

Если мое понимание верно, как насчет этого ответа? Поток сценария выглядит следующим образом.

  1. Получить значения введенного диапазона.
  2. Получить значения введенного столбца из полученных значений.
  3. Сортируйте столбец, используя ваш скрипт.
  4. Получить индекс отсортированного столбца.
  5. Измените значения отсортированного диапазона, используя индекс.
  6. Поместить значения результатов на лист.

Пример сценария:

var sortColumn = "3"; // Column C
var sortRange = "A2:D";

var ss = SpreadsheetApp.getActiveSheet();
var values = ss.getRange(sortRange).getValues();
var sorted = values.map(function(e){return e[sortColumn - 1]}).filter(String);
var sortCol = sorted.slice().map(function(e){return [e]});
sorted.sort(function (a,b){return b.length - a.length || a.localeCompare(b)}); // This is your script.
var index = sorted.map(function(e){
  for (var j = 0; j < sortCol.length; j++) {
    if (e == sortCol[j][0] && !sortCol[j][1]) {
      sortCol[j].push("temp");
      return j;
    }
  }
});
var newValues = index.map(function(e){return values[e]});
values.splice(0, sorted.length);
Array.prototype.push.apply(newValues, values);
ss.getRange(sortRange).setValues(newValues);

Примечание:

  • Когда вы используете этот пример сценария, сначала установите sortColumn и sortRange.
  • Пожалуйста, измените этот скрипт для вашей среды.
  • Если в столбце, который вы хотите отсортировать, есть пустые ячейки, измените значение var sorted = values.map(function(e){return e[sortColumn - 1]}).filter(String); на var sorted = values.map(function(e){return e[sortColumn - 1]});.

Рекомендации:

Я беспокоюсь, что могу неправильно понять, что вы хотите. Если это не то, что вы хотите, пожалуйста, скажите мне. Я хотел бы изменить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...