Как переместить строку в последнюю строку именованного диапазона (onEdit) - PullRequest
0 голосов
/ 23 февраля 2019

Мне бы хотелось, чтобы этот сценарий переместился row в конец именованного диапазона («УТВЕРЖДЕН»)

function onEdit(e) {
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var s = e.source.getActiveSheet();
   var r = e.source.getActiveRange();

   if (s.getName() == "Sheet1" && r.getColumn() == 6 && r.getValue() == "APPROVED") {

      var row = r.getRow();
      var numColumns = s.getLastColumn();
      var namedRange = ss.getRangeByName('APPROVED');
      s.getRange(row, 1, 1,numColumns).moveTo(namedRange);
      s.deleteRow(row)
   } 
}

В настоящее время сценарий перезаписывает первую строку в именованном диапазоне.Я попробовал следующее

var row = r.getRow();
var numColumns = s.getLastColumn();
var namedRange = ss.getRangeByName('APPROVED');
var target = (namedRange.getLastRow() +1, 1));
s.getRange(row, 1, 1,numColumns).moveTo(target);
s.deleteRow(row)

Я, конечно, новичок в GAS, поэтому любые разработки по исправлениям будут оценены.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019
  • Вы хотите переместить строку в последний ряд namedRange.

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

С:

s.getRange(row, 1, 1,numColumns).moveTo(namedRange);

Кому:

 s.getRange(row, 1, 1,numColumns).moveTo(namedRange.offset(namedRange.getLastRow() - namedRange.getRow(), 0));
  • В этой модификации поместите строку впоследняя строка namedRange с использованием offset().
  • Если вы хотите поместить строку в следующую строку последней строки namedRange, измените ее следующим образом.
    • s.getRange(row, 1, 1,numColumns).moveTo(namedRange.offset(namedRange.getLastRow() - namedRange.getRow() + 1, 0))

Примечание:

  • В вашем скрипте используется moveTo().Так что эту строку s.deleteRow(row) можно удалить.Об этом, пожалуйста, сделайте это для вашей ситуации.

Ссылки:

Если это не тот результат, который вам нужен, я приношу свои извинения.

Редактировать:

  • Вы хотите поместить строку впоследняя строка в именованном диапазоне.
  • В этом случае последняя строка является последней строкой в ​​именованном диапазоне.
    • Например, именованный диапазон содержит 40 строк, а некоторые значения помещаются в первые 5 строк, вы хотите поместить строку из 6 строк.

Если мое понимание верно, как насчет этой модификации?

От:

s.getRange(row, 1, 1,numColumns).moveTo(namedRange);

Кому:

var values = namedRange.getValues();
for (var i = values.length - 1; i >= 0; i--) {
  var r = values[i].some(function(e) {return e});
  if (r) {
    s.getRange(row, 1, 1,numColumns).moveTo(namedRange.offset(i + 1, 0));
    break;
  }
}
  • namedRange.getLastRow() извлекает максимальную строкуномер названного диапазона.Поэтому я подготовил скрипт для получения последней строки в именованном диапазоне.
0 голосов
/ 23 февраля 2019

Попробуйте это:

function setLastRowOfANamedRange(row,s,nr) {
  var nr=nr || SpreadsheetApp.getActive().getRangeByName('APPROVED');//debug
  var s=s || SpreadsheetApp.getActive().getActiveSheet();//debug
  var row=row || 5;//debug
  var vA=nr.getValues();
  vA[vA.length-1]=s.getRange(row,1,1,vA[0].length).getValues();
  nr.setValues(vA);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...