Скрипт Google Sheets для перестановки строк

#google-apps-script #google-sheets #google-apps #google-sheets-formula

#google-apps-script #google-sheets #google-приложения #google-sheets-формула

Вопрос:

Пытаюсь создать таблицу Google, которая позволяет выбирать приоритет строк с помощью опции выпадающего списка.

Вот базовый алгоритм, который я пытаюсь создать:

1 Пользователь изменяет приоритет строки с помощью выпадающего списка (примечание: эта часть работает нормально)

2 Отредактированная строка переместится на позицию, основанную на новом приоритете (примечание: Эта часть работает нормально)

3 Все остальные строки изменят свои номера в зависимости от отредактированной ячейки (т. Е., скажем, отредактированная ячейка изначально была 13, а затем изменена на 4. Я хочу, чтобы старые 4 превратились в 5, а все от 5 до 12 увеличились на 1)

Проблема, с которой я сталкиваюсь, заключается в том, что когда ячейка изменяется на номер 4, она переходит под старый номер 4 — следовательно, цикл for не работает.

Кто-нибудь делал что-нибудь подобное или у вас есть предложения?

 function onEdit(event) {
  var activeSheet = SpreadsheetApp.getActiveSheet();
  var editedCell = activeSheet.getActiveCell();


  var columnToSortBy = 1;
  var tableRange = "A2:M22";

  if(editedCell.getColumn() == columnToSortBy){
   var priority =  editedCell.getValue();
   var range = activeSheet.getRange(tableRange);
   var time = new Date();
    time = Utilities.formatDate(time, "GMT", "HH:mm:ss");
   var nextCell = editedCell.offset(0, 13);
    nextCell.setValue(time);


   range.sort({ column: columnToSortBy, ascending: true});

  } 
}

function rearrangeRows() {
  var i;

  var ss = SpreadsheetApp.getActiveSheet();
  var startRow = 1;
  var endRow = ss.getLastRow();
  var getRange = ss.getDataRange();
  var getRow = getRange.getRow();

  var testPriority = 3;

  var cell = ss.getRange("A4");
  var cellValue = cell.getValue();
  if (cellValue > number) {
   Logger.log(cellValue);  
  }
  Logger.log(number);

 // for(i; i > )
}
  

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

1. Вместо того, чтобы просто сортировать диапазон при изменении приоритета, рассмотрите возможность вставки строки в желаемую позицию, перемещения / копирования отредактированной строки в эту строку, удаления старой строки (при необходимости, возможно, ее уже нет из-за перемещения), а затем увеличения значений всех номеров строк между целевой позицией строки (выводимой из event.value ) и старой позицией строки (выводимой из event.oldValue ).).

Ответ №1:

Я думаю, вы могли бы поместить код, подобный тому, что я написал ниже, в функцию onEdit, прежде чем сортировать электронную таблицу. Это должно увеличить значение всех ячеек с приоритетом выше, чем только что установленный вами приоритет, игнорируя ячейку, которую вы только что изменили. Возможно, вам придется немного адаптировать его для работы также при уменьшении приоритета строки, поскольку вы захотите уменьшить приоритет всех строк, находящихся между первоначальным приоритетом строки и ее новым приоритетом.

 var endRow = activeSheet.getLastRow();
for (var i = 1; i <= endRow; i   ) {
    var currentCell = activeSheet.getRange("A"   i);
    if (currentCell.getValue() > priority amp;amp; i != editedCell.getRow()) {
         currentCell.setValue(currentCell.getValue()   1)
    }
}