Сортировать сгруппированные диапазоны строк - Google Sheets - PullRequest
0 голосов
/ 05 февраля 2020

Пример листа: Ссылка

У меня довольно небольшой набор данных, который я часто сортирую, и чтобы избежать сортировки вручную каждый раз, я создал базовую c сортировку в приложениях- скрипт, который работает, но далек от идеала. Я надеялся, что есть более простой метод сортировки, не требующий ввода формул Google.

Данные представлены как (слева) и один раз отсортированы как (справа):

enter image description here enter image description here

У меня до сих пор выглядит скрипт-приложения:

function sortSheet() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Sheet1');
  var data = ss.getSheetByName('Data');

  var lA = data.getRange('B2').getValue(); //Retuns the row for the first occurance of this value. Via.(=MATCH($A2,'Sheet1'!$A:$A,0)) Where Match(Value,Range to check) on the 'data' sheet.
  var nA = data.getRange('C2').getValue(); //Returns the total number of these values. Via. (=COUNTIF('Sheet1'!$A:$A,$A2)) Where CountIF(Range to check,Value) on the 'data' sheet.
  var sortA = sheet.getRange('A'+lA+':Y'+(lA+nA)); //Selects the range that contains the values to be sorted. Via. A through Y within the specified rows.
  sortA.sort({column: 2, ascending: true}) //Sorts range by column 2.

  var lB = data.getRange('B3').getValue();
  var nB = data.getRange('C3').getValue();
  var sortB = sheet.getRange('A'+lB+':Y'+(lB+nB));
  sortB.sort({column: 2, ascending: true})

  var lC = data.getRange('B4').getValue();
  var nC = data.getRange('C4').getValue();
  var sortC = sheet.getRange('A'+lC+':Y'+(lC+nC));
  sortC.sort({column: 2, ascending: true})

}

Этот скрипт зависит от информации приведены из листа «Данные» . На этом листе берется первая строка, в которой данный ключ находится в столбце B, и счетчик этого ключа в столбце C.

enter image description here enter image description here

Затем сценарий получает необходимый диапазон для сортировки и просматривает их по одному. Кто-нибудь сможет помочь упростить эту операцию или сделать ее проще?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Вы можете сделать это с помощью обычных формул, без необходимости использовать Apps Script:

=QUERY(A:B, "SELECT A,B where A is not null and B is not null order by A, B",1)

Это результат:

formula input and output

Вы можете видеть, что это работает здесь .

Примечание : Это не будет держать ваши пустые места между каждым ID "разделом" .

0 голосов
/ 05 февраля 2020

Вы можете попытаться собрать свои данные в листе для каждого идентификатора.

Ваши листы будут выглядеть примерно так: sheets = ["Sheet1","ID A","ID B","ID C",...]

А затем:

  1. Set поднимите идентификационные листы для сортировки по возрастанию, применив sort.
  2. Сделайте ячейки по вашему выбору в Sheet1, чтобы указать = для каждого идентификационного листа.

От Ваш комментарий у вас есть некоторые ручные входы на листе. Поэтому, возможно, вы могли бы попытаться использовать форму Google для ручного ввода и использовать Apps Script запускает для создания вашего Sheet1, когда вносятся изменения в лист.

Кроме того, вам может быть полезен метод Sheets.getDataRange().

Прочитайте класс Range службы SpreadsheetApp, есть методы как и getLastRow() или getNumRows(), которые могут помочь.

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