Google Apps Script - почему .getNextDataCell () пропускает данные - PullRequest
2 голосов
/ 01 ноября 2019

Я хочу начать с верхней части столбца и выполнить CTRL + SHIFT + DOWN , чтобы получить непустую ячейку в строке15.

В этом столбце есть данные только по строкам 1, 15 и 16 . Когда я использую следующий скрипт для запуска в строке 1 и пытаюсь перейти к 15, мой сценарий пропускает строки 15 и 16 и переходит к нижней части листа, строка 2000.

Когда я пытаюсь записать макроси выполнить эту функцию, она отлично работает во время записи, но пропускает непустые ячейки, когда я пытаюсь вызвать макрос.

Любая помощь будет высоко ценится!

function DOWN() {
    var spreadsheet = SpreadsheetApp.getActive();
    spreadsheet.getRange('Q1').activate();
    spreadsheet.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.DOWN).activate();
}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Свернул снова! Перед этим шагом в моем процессе я скопировал и вставил столбец как значения. Формула в Q2: Q было = если (H2 = "", "", Today ()). Когда я копировал и вставлял как значения, были скрытые символы, которые заставляли очевидно пустые ячейки «содержать данные». Хотя я не уверен, почему будут скрытые персонажи, похоже, это решение этой проблемы. Если кто-нибудь знает, как избежать скрытых персонажей, я буду признателен за любые ваши советы. Я также нахожу странным, что за пределами сценария я мог сделать CTRL + DOWN, и он пропустил бы только видимые данные.

0 голосов
/ 01 ноября 2019

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

function TestNextNonBlank() {
  var spreadsheet = SpreadsheetApp.getActive();
  var mysheet=spreadsheet.getSheetByName('MainSheet');
  var myrange=mysheet.getRange('Q1'); 

  myrange=nextNonBlank(myrange); //First Non Blank
  Logger.log(myrange.getA1Notation()); //Give Q15

  myrange=nextNonBlank(myrange); //Second Non Blank
  Logger.log(myrange.getA1Notation()); //Give Q16

  myrange=nextNonBlank(myrange); //Third Non Blank
  Logger.log(myrange.getA1Notation()); //Give Q994

};


function nextNonBlank(theRange)
{
  if (theRange.offset(1, 0).isBlank()==false) return theRange.offset(1, 0);
  theRange=theRange.offset(1, 0);
  if (theRange.offset(1, 0).isBlank()==false) return theRange.offset(1, 0);
  theRange=theRange.getNextDataCell(SpreadsheetApp.Direction.DOWN);
  return theRange;
}

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

function nextNonBlank(theRange)
{
  if (theRange.getSheet().getMaxRows()==theRange.getRowIndex()){
     return theRange; 
  }
  //save the range as last range
  var storedRange=theRange;
  if (theRange.offset(1, 0).isBlank()==false) return theRange.offset(1, 0);
  theRange=theRange.offset(1, 0);
  if (theRange.offset(1, 0).isBlank()==false) return theRange.offset(1, 0);
  theRange=theRange.getNextDataCell(SpreadsheetApp.Direction.DOWN);
  //if the reach range is blank, back to use the stored range
  if (theRange.isBlank()) theRange=storedRange;
  return theRange;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...