Функция AppsScript приводит к ошибке «координаты диапазона находятся за пределами размеров листа» - PullRequest
0 голосов
/ 09 января 2020

Мне нужно l oop поверх листа по вертикали и горизонтали и скопировать определенные значения на другой лист. Проблема в том, что он не будет работать из-за ошибки «Координаты диапазона находятся за пределами размеров листа». Он появится в строках с методами getLastRow () или getLastColumn (). Попытка исправить с помощью getLastRow () - 1 (ответ в другом посте), но не работает.

Также нет формулы, заполняющей ячейки "" или подобным, просто простой текст.

Код:

function Ordenar_XT() {

  var leidas = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Base de datos REPXT");
  var relevado= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Base de datos REPXT").getRange("A:A").getValues();
  var idTurma= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Base de datos REPXT").getRange("B:B").getValues();
  var baseTrainers= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("BASEXT");
  var baseContenido = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("BASECONTENIDO");


  var XT = leidas.getRange(1, 1, leidas.getLastRow() - 1, leidas.getLastColumn()).getValues();

  for(var i=1;i<leidas.getLastRow()+1;i++){

    if(relevado[i]!="Relevado"){

      for(var j=0;j < leidas.getLastColumn()-1;j++){

        if(XT[i][j]=="Estou deixando feedback sobre:" || XT[i][j]=="Estoy dejando feedback sobre:"){

          var last= baseTrainers.getLastRow()+1; 

          baseTrainers.getRange(last, 2).setValue(XT[i][j+1]);
          baseTrainers.getRange(last, 1).setValue(idTurma[i]);

          var formula = baseTrainers.getRange(1,8);

          formula.copyTo(baseTrainers.getRange(last, 8));


          var ok=true;
          var l = 2;
          while(ok && l <=10){

            switch(XT[i][j+l]){

              case "¿Qué tan satisfecho estás con tu XT?": 
              case "Quão satisfeito você ficou com seu XT?": baseTrainers.getRange(last, 3).setValue(XT[i][j+l+1]);
                break;

              case "¿El XT tiene dominio del tema?": 
              case "O XT tinha domínio do tema?": baseTrainers.getRange(last, 4).setValue(XT[i][j+l+1]);
                break;

              case "¿El XT explicó y comunicó los temas correctamente?": 
              case "O XT explicou bem os assuntos?": baseTrainers.getRange(last, 5).setValue(XT[i][j+l+1]);
                break;
              case "¿El XT fue abierto para evacuar dudas?": case "O XT foi aberto para tirar dúvidas?": baseTrainers.getRange(last, 6).setValue(XT[i][j+l+1]);
                break;
              case "¿La cantidad de práctica aplicada por el XT fue suficiente para aprender los procesos?" :
              case"A quantidade de prática aplicada pelo XT foi suficiente para aprender sobre os processos?": baseTrainers.getRange(last, 7).setValue(XT[i][j+l+1]);
                break;
              default: ok=false;
                break; 
            }                 
            l +=2;       
          }       
        }
      }     
    } 
  }  
}




РЕДАКТИРОВАТЬ

Спасибо, Купер, я добавляю раздел кода с изменениями:


var XT = leidas.getRange(1, 1, leidas.getLastRow() - 1, leidas.getLastColumn()).getValues();

  for(var i=0;i<XT.length;i++){

    if(relevado[i]!="Relevado"){

      for(var j=0;j < XT[i].length;j++){

        if(XT[i][j]=="Estou deixando feedback sobre:" || XT[i][j]=="Estoy dejando feedback sobre:"){

          var last= baseTrainers.getRange(); 

          baseTrainers.getRange(last, 2).setValue(XT[i][j+1]);
          baseTrainers.getRange(last, 1).setValue(idTurma[i]);

          var formula = baseTrainers.getRange(1,8);

          formula.copyTo(baseTrainers.getRange(last, 8));

1 Ответ

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

Ваш цикл начинается с 1 var i=1;i<leidas.getLastRow()+1;i++

, но ваши данные:

var relevado= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Base de datos REPXT").getRange("A:A").getValues();
var idTurma= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Base de datos REPXT").getRange("B:B").getValues();

Имеет форму 2-мерного массива, поэтому вы всегда пропустите первую строку данных и запустите из элементов массива в конце.

Вместо циклического перебора строк попробуйте выполнить циклический перебор данных. Начните for для l oop с нуля или используйте метод массива forEach.

Начните с чего-то вроде этого:

for(var i=0;i<relevado.length;i++)

Также получайте данные, используя диапазоны, подобные этому: getRange("A:A").getValues() can привести к большому количеству нулей в конце данных. Попробуйте использовать getRange(1,1,sh.getLastRow()).getValues().

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