Как скопировать массив в другую электронную таблицу, только если массив не пустой? Ошибка получения длины без определения в Google Appscript - PullRequest
1 голос
/ 29 октября 2019

Я очень новичок в кодировании / Google Appscript, так что прости меня. Я пытаюсь скопировать данные между электронными таблицами, которые соответствуют определенным критериям. Моя проблема в том, что если массив не возвращает ни одной строки, которые соответствуют, я получаю сообщение об ошибке «Ошибка типа: Невозможно прочитать свойство« длина »из неопределенного». Есть ли способ пропустить копирование данных, если массив равен нулю?

function myFunction() {
  var sourcess = SpreadsheetApp.openById();
  var sourcedata = sourcess.getSheetByName('debt data'); //source sheet
  var testrange = sourcedata.getRange('Q:Q'); //range to check
  var testvalue = (testrange.getValues());
  var testrange2 = sourcedata.getRange('R:R');
  var testvalue2 = testrange2.getValues();
  var targetss = SpreadsheetApp.openById();
  var targetdata = targetss.getSheetByName('Debtors'); //destination sheet
  var data = [];
  var j =[];
  var lastRow = targetdata.getLastRow();
  for (i=0; i<testvalue.length;i++) {
    if ( testvalue[i] != '123' && testvalue2[i] == 'abc') {
      data.push.apply(data,sourcedata.getRange(i+1,1,1,20).getValues());  
      j.push(i); 
    }
  }
  targetdata.getRange(lastRow+1,1,data.length,data[0].length).setValues(data);
}

1 Ответ

1 голос
/ 29 октября 2019

Диапазоны Как это: sourcedata.getRange('Q:Q'); часто приводит к множеству пустых предметов, потому что они собирают все ячейки вплоть до Макс. Строк.

Было бы лучше использовать sourcedata.getRange(1,17,sourcedata.getLastRow(),1);

Это: if ( testvalue[i] != '123' && testvalue2[i] == 'abc')

должно быть примерно таким: if ( testvalue[i][0] != '123' && testvalue2[i][0] == 'abc')

Даже для массивов из одного столбца требуется два индекса.

Я бы написал так:

data.push.apply(data,sourcedata.getRange(i+1,1,1,20).getValues());

вот так:

data.push.(sourcedata.getRange(i+1,1,1,20).getValues()[0]);

На самом деле, я бы вообще так не поступил. Я бы сделал что-то вроде этого:

var vA=sourcedata.getRange(1,1,sourcedata.getLastRow(),20).getValues();

, а затем data.push(vA[i]);//and that gets the whole row of 20 columns as a flattened array

Вот пример чего-то похожего на то, что вы делаете, я думаю.

Мой исходный лист выглядит следующим образом:

enter image description here

Мой конечный лист выглядит следующим образом:

enter image description here

А это мой код:

function copyDataIfAB() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet187');
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var hA=vA[0];
  var hObj={};
  var sA=[];
  hA.forEach(function(e,i){if(e){hObj[e]=i}});
  vA.forEach(function(r,i){
    if(vA[i][hObj['HDR2']]=='A' && vA[i][hObj['HDR10']]=='B') {
      sA.push(vA[i]);
    }
  })
  var tss=SpreadsheetApp.openById('Id');
  var tsh=tss.getSheetByName('Sheet9');
  tsh.getRange(tsh.getLastRow()+1,1,sA.length,sA[0].length).setValues(sA);//appending it to the next empty row on the sheet
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...