Почему GAS вводит неверный диапазон в проверку данных? - PullRequest
0 голосов
/ 23 января 2020
function DYNAMIC(){
  var s = SpreadsheetApp.getActiveSpreadsheet(), ss = s.getSheetByName("Snippet Gen"), 
      dd = s.getSheetByName("dv snip"), column = 1, lastc = dd.getLastColumn(), 
      lastr = dd.getLastRow(), time = ss.getRange(2,1), name = ss.getRange(4,1), 
      time_v = time.getValue(), tp = dd.getRange(1,1,1,lastc), 
      nm = dd.getRange(2,column,lastr,1), match = dd.getRange(1,column).getValue();

  var rule_tp = SpreadsheetApp.newDataValidation().requireValueInRange(tp,false).build();
  time.setDataValidation(rule_tp);

  for(; column < lastc; column++){
    if(match = time_v){
      var rule_nm = SpreadsheetApp.newDataValidation().requireValueInRange(nm,false).build();
      name.setDataValidation(rule_nm);
    }
  }
}

Лист 1: Snippet Gen
Лист 2: DV Snip

Результат правильный DV в A2, но непрерывный Загрузка ... DV в A4. И затем, когда я go на панели DV, диапазон устанавливается как 'dv snip'!$A$2:$A$8, который является недопустимым диапазоном. Как правильно установить диапазон?

Ответы [ 2 ]

1 голос
/ 23 января 2020

if(match = time_v){ - это задание, а не сравнение, попробуйте вместо этого if(match == time_v){

0 голосов
/ 27 января 2020

Скорее всего, вы получаете недопустимый диапазон из-за этого метода:

nm = dd.getRange(2,column,lastr,1); 

Обратите внимание, что метод getRange (строка, столбец, numRows, numColumns) принимает число строк в качестве третьего параметра, а не индекса последней строки в диапазоне.

Из-за этого здесь вы получаете диапазон, который:

  • Начинается со строки 2.
  • Количество строк равно индексу последней строки.

При этих настройках последняя строка в этом диапазоне не существует. Следовательно, вы получаете недопустимый диапазон.

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

var firstRow = 2;
var column = 1;
var numRows = dd.getLastRow() - firstRow + 1;
var numCols = dd.getLastColumn() - column + 1;
var nm = dd.getRange(firstRow, column, numRows, numCols);

Также, как сказал Купер, вы должны использовать оператор сравнения, а не оператор присваивания здесь:

if(match == time_v){

Ссылка:

Я надеюсь, что это поможет.

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