Почему мой скрипт сортировки работает непоследовательно?

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

#javascript #google-apps-script #google-sheets #google-формы

Вопрос:

Привет полезным участникам,

У меня есть таблица Google ответов, в которой есть набор данных с разными типами значений данных (скриншот), как показано ниже. Значения временных меток Col2 автоматически генерируются при вводе пользователем в gform. Я переместил его как col2 (по умолчанию в col1), потому что я хочу поместить идентификатор цитаты в качестве столбца первичного ключа. Значения идентификатора цитаты генерируются автоматически на основе Google script, который запускается при отправке gform:-
таблица ответов с несогласованной сортировкой

Я предполагал, что у нас будет автосортировка диапазона данных по метке времени (и мне это очень нужно для сортировки по метке времени), но это не согласуется с моим. Я уже пробовал приведенные ниже коды, но все еще не работает последовательно. Но когда я сортирую его вручную на листе, используя фильтр функций, чтобы выбрать столбец метки времени, а затем отсортировать A-> Z, он работает нормально. Но это не будет эффективно для моих требований

Способ 1 :

 // this resulted as in the screenshot.

SortRange = "A2:AC";
SortOrder = [{column:2, ascending: true}];
function multiSortColumns(){
  var range = msheet.getRange(SortRange);
  range.sort(SortOrder);
}
  

Способ 2 :

 // some sorted, some not but still wrong and not ascending order.

SortRange = 2,1,sheet.getLastRow() - 1, sheet.getLastColumn();
SortOrder = [{column:2, ascending: true}];
function multiSortColumns(){
   var range = sheet.getRange(SortRange);
   range.sort(SortOrder);
}
  

Способ 3

 var sheet=SpreadsheetApp.getActiveSheet().sort(2);
// this doesn't sort by specific column we want and it includes sorting the header.
  

Пожалуйста, помогите исправить мой код. Tqvm заранее.

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

1. Вы запускаете эту функцию в триггере formSubmit? Почему временные метки перепутались в первую очередь? Обычно форма отправляет данные на лист назначения в хронологическом порядке.

2. @ziganotschka OP, возможно, вручную отсортировал другие столбцы

Ответ №1:

Потенциальные проблемы:

  • Первые два метода в вашем вопросе, похоже, не определяют sheet объект.

  • Также я даже не уверен, выполняете ли вы multiSortColumns вообще.

  • Третий метод также отсортирует заголовок.

  • Еще одна потенциальная проблема может возникнуть при использовании:

     const sheet = ss.getActiveSheet();
      

    Последний рассматривает активный лист, который может быть любым из выбранных листов в файле электронной таблицы.

Вместо этого я бы посоветовал вам использовать:

 const sheet = ss.getSheetByName("Form Responses 1");
  

предполагая, что имя листа, который вы хотите отсортировать, является Form Responses 1


Решение:

Вот модифицированная версия вашего второго метода, который гарантирует, что все выполняется при выполнении myFunction() :

 function myFunction() {
  const ss = SpreadsheetApp.getActive();
  // const sheet = ss.getActiveSheet(); // not recommended
  const sheet = ss.getSheetByName("Form Responses 1"); // recommended
  sheet.getRange(2, 1, sheet.getLastRow() -1, sheet.getLastColumn()).sort({column: 2, ascending: true});   
}
  

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

1. Да, ваше решение работает, @Marios! Спасибо! Извините, ранее я не упомянул основную функцию, в которой я вызываю функцию сортировки. Я подумал, что это не имеет значения, чтобы выделить проблему, потому что до этого эта функция (метод 1) работала просто отлично, поскольку я тестировал ее несколько раз, прежде чем использовать ее с июля. Я заметил, что он внезапно перестал работать, когда я тестировал ввод адресов, отличных от gmail, и это повлияло на другие записи с адресом gmail с тех пор. довольно странно. Я надеюсь, что ваш скрипт будет работать вечно. Спасибо!