Скопируйте вставленные столбцы с одного листа в строки другого листа с разными шагами подсчета в цикле for. - PullRequest
0 голосов
/ 01 июля 2019

У меня есть один лист: 'trainingmatrix' с информацией в столбцах строки 2, B, D, F, H ..., который я хотел бы вставить в другой столбец 'vlearning' другого листа, строки 2,3,4,5.... я пробовал код ниже, но он не работает ... есть идеи?Должна быть проблема с циклом for, но я впервые делаю цикл for с двумя переменными и разными шагами отсчета.

  var trainingmatrix=ss.getSheetByName('Training Matrix');
  var vlearning=ss.getSheetByName('VLearning_Upload');

var lr=getlastrow(trainingmatrix,"A1:HA");

var tnavalues=trainingmatrix.getRange(1,1,lr-1,15).getValues();

var vlearnvalues=vlearning.getRange(1,1,vlearning.getLastRow(),
vlearning.getLastColumn()).getValues();

  for (var i=1 &&  j=1;i<vlearnvalues.length && j<vlearnvalues[0].length;i++ && j=j+2){


     vlearnvalues[i][2]=tnavalues[1][j];

    }



  Logger.log(values);```

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Я вижу несколько проблем в вашем коде:

  1. У вас неправильный синтаксис для поиска последней строки. Пожалуйста, замените var lr=getlastrow(trainingmatrix,"A1:HA"); до var lr = trainingmatrix.getLastRow();
  2. Как указывал camaulay, вы не можете выполнять итерации по i и j одновременно в одном цикле for, а вместо этого вынуждены вкладывать цикл «j» в цикл «i».
  3. Подумайте о том, что вы делаете: вы принимаете vlearnvalues[0].length (то есть 15) и пытаетесь получить доступ к значению tnavalues[1][j], которое может не существовать, если ширина диапазона в Training Matrix уже, чем в VLearning_Upload .
  4. К сожалению, vlearnvalues[i][2]=tnavalues[1][j]; не работает в скрипте приложений. Вместо этого вам нужно получить доступ к отдельной ячейке в вашем диапазоне VLearning_Upload и использовать функцию setValue(), чтобы присвоить ей значение из диапазона в Training Matrix.
  5. Как вы выбираете, что только определенные значения из листа Training Matrix должны копироваться? Вам нужно заявление для этого. Например, предполагая, что B, D, F, H являются непустыми столбцами - и вы хотите скопировать только непустые значения, вы можете реализовать: if(tnavalues[1][j]!="").

Пример кода, который соответствует вашим требованиям, будет следующим:

function Copy() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var trainingmatrix=ss.getSheetByName('Training Matrix');
  var vlearning=ss.getSheetByName('VLearning_Upload');
  var lr = trainingmatrix.getLastRow();  
  var tnavalues=trainingmatrix.getRange(1,1,lr-1,15).getValues();
  var vlearnvalues=vlearning.getRange(2,3,vlearning.getLastRow(),vlearning.getLastColumn());
  var array=[];
  for (var j=1; j<tnavalues[0].length; j++)
  {
    if(tnavalues[1][j]!="")
    {
      array.push(tnavalues[1][j])
    }
  }
  for(var i=1;i<vlearnvalues.getHeight();i++)
  {
    var cell=vlearnvalues.getCell(i,1);              
    if(typeof array[(i-1)]!=='undefined')
    {
      cell.setValue(array[(i-1)]); 
    }
  }
}

Пожалуйста, обратитесь к справочнику «Сценарий приложений» для получения дополнительной информации о различных методах и примерах их использования:

https://developers.google.com/apps-script/reference/

0 голосов
/ 01 июля 2019

Попробуйте выполнить цикл с двумя переменными с двумя вложенными циклами 'for'.

for (var i = 1; i < vlearnvalues.length; i++) {
  for (var j = 1; j < vlearnvalues[0].length; j++) {
    vlearnvalues[i][2] = tnavalues[1][j];
  }
}

Хотя я бы позаботился о том, чтобы ваши переменные (vlearnvalues, tnavalues) содержали то, что, по вашему мнению, они делают, записав их в журнал перед цикломих, потому что я не уверен, что вы достигнете того, чего хотите, даже если этот цикл работает правильно.

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