Как можно исключить строку 1 (первая строка листа) в getActiveRange (), когда она находится в активном диапазоне (Google Таблицы)? - PullRequest
0 голосов
/ 06 мая 2020

Как можно исключить верхнюю строку или ячейку листа из getActiveRange (), если она существует? Как можно интегрировать shift ()? Выбор делается только внутри столбца для определения области, которая будет использоваться в столбце 3.

function x() {
  var s = SpreadsheetApp.getActive().getActiveSheet();
  var lastColumn = s.getActiveRange().getLastColumn();
  var activeRange = s.getActiveRange().offset(0, -lastColumn+3); // column 3
  if (activeRange.getRow() == 1) {
    s.getRange('F1').copyTo(activeRange, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  }
  else {
  s.getRange('F1').copyTo(activeRange, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  }
}

Если ячейки (смежные) активированы в столбце и только строка 1 (строка заголовка), 5, 8 и 9 отображаются, например, из-за фильтра. Затем F1 (x) нужно вставить в строки 5, 8 и 9 с помощью copyTo (). Мне пока не ясно, как интегрировать предложенные решения. Вот несколько примеров:

1:

function getRangeMinusHeaders(range) {
  var height = range.getHeight();
  if (height == 1) {
    return null;
  }
  var width = range.getWidth();
  var sheet = range.getSheet();
  return sheet.getRange(1, 1, height-1, width);
}

function x() {
  var s = SpreadsheetApp.getActive().getActiveSheet();
  var lastColumn = s.getActiveRange().getLastColumn();
  var range = s.getActiveRange().offset(0, -lastColumn+3); // column 3
  s.getRange('F1').copyTo(getRangeMinusHeaders(range), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}

2:

function x() {
  var s = SpreadsheetApp.getActive().getActiveSheet();
  var lastColumn = s.getActiveRange().getLastColumn();
  const activeRange = s.getActiveRange().offset(0, -lastColumn+3); // column 3
  if (activeRange.getRow() == 1) {
    activeRange.getValues();
    activeRange.shift();
    activeRange.forEach(function(row, index) {
      s.getRange('F1').copyTo(row, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    })
  }
  else {
  s.getRange('F1').copyTo(activeRange, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  }
}

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Чтобы получить объект Range, соответствующий заданному диапазону, за вычетом одной строки заголовка:

function getRangeMinusHeaders(range) {
  var height = range.getHeight();
  if (height == 1) {
    return null;
  }
  var width = range.getWidth();
  var sheet = range.getSheet();
  return sheet.getRange(1, 1, height-1, width);
}
1 голос
/ 06 мая 2020

Просто используйте shift при getValues ​​(), который удаляет первую строку и оставляет все остальные строки.

const activeRange = s.getActiveRange().getValues();
activeRange.shift(); // this removes the first row
activeRange.forEach( function(row, index){
  // do something here with each row
  console.log(row)
})
0 голосов
/ 06 мая 2020

Да, можно.

function x() {
  var s = SpreadsheetApp.getActive().getActiveSheet();
  var activeRange = s.getActiveRange()
  if(activeRange.getRow() == 1){
    // If first row is 1, then resize the range.
    var height = activeRange.getHeight();
    activeRange = activeRange.offset(1, 0, height-1);
  }

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