Ошибка «Координаты целевого диапазона находятся за пределами размеров листа» при зацикливании - PullRequest
0 голосов
/ 29 декабря 2018

у меня 4 листа.Форма, сырье, URL и США / Япония / Канада.Я получаю значение URL электронной таблицы из листа URL и использую «IMPORTRANGE» на листе «Сырье» для передачи таблицы данных.Оттуда я перебираю таблицу в необработанном листе, чтобы проверить, совпадают ли значения со значениями в листе формы.Если он совпадает, я перенесу эту строку в лист США / Япония / Канада.

Итак, я получил этот код в своих листах Google:

  var mainWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form');
  var continentWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('USA/Japan/Canada');
  var rawWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Raw');
  var urlWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('URLs');

  var tourName = mainWS.getRange('C4').getValue();
  var depDate = new Date(mainWS.getRange('C5').getValue());
  var status = mainWS.getRange('C6').getValue();

  //extract table data
  var url =  urlWS.getRange("B4").getValue();
  rawWS.getRange('A1').setValue('=IMPORTRANGE("' + url + '","Main Data!A1:AE")');

  var dummyHolder = rawWS.getRange("B1:B").getValues();
  var lastRow = dummyHolder.filter(String).length;

  Logger.log(lastRow);

  //loop through the raw extract
  for(var i = 2; i <= lastRow; i++){

    var dateHolder = new Date(rawWS.getRange("E" + i).getValue());

    if(rawWS.getRange("F" + i).getValue() == tourName && rawWS.getRange("I" + i).getValue() == status && dateHolder.getTime() === depDate.getTime()){
      var continentLR = continentWS.getLastRow() + 1; 
      rawWS.getRange('Raw!' + i + ':' + i + '').copyTo(continentWS.getRange(continentLR, 1), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    }

  }

Затем я неожиданно получил "TheКоординаты целевого диапазона выходят за пределы размеров листа «Сообщение об ошибке при входе в цикл.В частности, в первой строке после цикла for:

 var dateHolder = new Date(rawWS.getRange("E" + i).getValue());

Для ясности, rawWS, в котором выполняется цикл, имеет 134 записи и регистрирует 134 в качестве своей последней строки.Я не знаю, почему я получаю ошибку здесь.

Когда я удаляю эту строку, она все равно выдает ошибку на следующей строке.Все ошибки внутри цикла for.

Есть идеи?

1 Ответ

0 голосов
/ 29 декабря 2018

Я не проверял это, но попробую:

Я думаю, что проблема с фильтром состоит в том, что он также удалит пробелы и до конца, а getValues ​​() - нет.Таким образом, вы можете получить неправильную длину в зависимости от набора данных.

function unknown() {
  var formWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form');
  var continentWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('USA/Japan/Canada');
  var rawWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Raw');
  var urlWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('URLs');
  var tourName = formWS.getRange('C4').getValue();
  var depDate = new Date(formWS.getRange('C5').getValue());
  var status = formWS.getRange('C6').getValue();
  //extract table data
  var url =  urlWS.getRange("B4").getValue();
  rawWS.getRange('A1').setValue('=IMPORTRANGE("' + url + '","Main Data!A1:AE")');
  var dummyHolder = rawWS.getRange(1,2,rawWS.getLastRow(),1).getValues();

  for(var i=dummyHolder.length-1;i>=0;i--){
    if(!dummyHolder[i][0]){
      dummyHolder.splice(i,1);
    }else{
      break;
    }
  }
  //loop through the raw extract
  for(var i=2;i<dummyHolder.length; i++){
    var dateHolder = new Date(rawWS.getRange(i,5).getValue());
    if(rawWS.getRange(i,6).getValue() == tourName && rawWS.getRange(i,9).getValue() == status && dateHolder.getTime() === depDate.getTime()){
      var continentLR = continentWS.getLastRow() + 1; 
      rawWS.getRange(i,1,).copyTo(continentWS.getRange(continentLR, 1), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    }

  }
}

Также ваша последняя строка содержит листимя в диапазоне, но rawWS это тот лист.Поэтому я переписал параметры диапазона.Извините, если это не сработает.

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