Как можно предотвратить использование строки заголовка в пользовательском сценарии сортировки? - PullRequest
0 голосов
/ 28 мая 2019

Я изменил приведенный пример кода здесь , чтобы создать сценарий ниже.Пока он выполняет свою работу, я не смог найти способ предотвратить удаление первой (первой) строки заголовка листа.

Несколько тангенциально в стороне: следующие две строки кода в конце цитируемого скрипта были удалены для сортировки листа без удаления его содержимого и замены их неформатированным массивом:

sheet.clear();
sheet.getRange(1,1,rows,cols).setValues(vf);

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

function status_sort(){

  var ss=SpreadsheetApp.getActive();

  var sheet = ss.getSheetByName('current');

  var rows = sheet.getLastRow();

  var cols = sheet.getLastColumn(); 

  var columnToSortBy = 4;

  var rg = sheet.getRange(2, columnToSortBy, sheet.getLastRow(), 1);

  var v1 = rg.getValues();

  var sortObj = {'black_box':1, 'purple_box':2, 'green_box':3, 'yellow_box':4, 'red_box':5,'blue_box':6};

  var col = [];

  for(var i = 0; i < v1.length; i++){

    col.push([sortObj[v1[i]]]);
  }

  sheet.getRange(2, cols + 1, rows, 1).setValues(col);

 sheet.getDataRange().sort([{column:sheet.getLastColumn(),ascending:true}]);

  var vf = sheet.getDataRange().getValues();

    for(var i = 0; i < vf.length; i++){

      vf[i].splice(vf[i].length,1);

    }

}

1 Ответ

0 голосов
/ 31 мая 2019

Похоже, что v1 содержит ваши данные (без заголовков), и вы помещаете ключи в col, который добавляется в качестве дополнительного столбца только для целей сортировки, затем вы сортируете всю вещь по ключи. Если я правильно понял, ваши заголовки должны быть где-то в отсортированных данных, так как я не думаю, что getDataRange достаточно умен, чтобы игнорировать ваши заголовки.

Интересно, что произойдет, если вы замените:

sheet.getDataRange().sort([{column:sheet.getLastColumn(),ascending:true}]);

с:

sortThis = sheet.getRange(2, 1, rows - 1, cols + 1)
sortThis.sort([{column:sheet.getLastColumn(),ascending:true}]);

// getRange parameters:
// 2        : skip a row for the headers
// 1        : start with the leftmost column
// rows - 1 : get one fewer than the original row count (to exclude the headers)
// cols     : get one more than the original column count (to include the extra)

Кроме того, я думаю, что цикл в конце захватывает все на листе, а затем удаляет последний столбец (который был введен только для целей сортировки), а удаленный код заменяет лист результатом. Если вы не собираетесь звонить setValues(vf), то можете также пропустить любой другой код, который также ссылается на vf.

Основано на https://stackoverflow.com/a/42224466/1054322 Интересно, можете ли вы вместо этого использовать getDisplayValues(). Я не увидел setDisplayValues() в справочнике по API, поэтому я предполагаю, что ваше форматирование теряется при чтении, а не при записи, и, кроме того, setValues() не будет также clobber Ваше форматирование. Не уверен, что это помешает сортировке, поскольку displayValues ​​может переносить данные и, следовательно, сортировать по-разному.

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