Скрипт Копировать / Вставить с критериями - PullRequest
0 голосов
/ 11 января 2020

У меня есть сценарий, который будет копировать и вставлять данные из непоследовательных столбцов, и у меня есть сценарий, который будет копировать и вставлять данные на основе нескольких критериев, однако после многочисленных попыток мне не удалось создать сценарий, который выполняет оба эти действия. Любая помощь будет оценена. Для следующего кода ошибка:

Количество строк в данных не соответствует количеству строк в диапазоне.

function UpdateTeam() {
  var source = SpreadsheetApp.openById('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');          // Source workbook
  var sourcesheet = source.getSheetByName("Test").getDataRange().getValues();                    // *Source workbook sheet, sheets vary by location. Case sensitive.
  var dest = SpreadsheetApp.getActiveSpreadsheet();                                              // Destination workbook
  var destsheet = dest.getSheetByName("Team");                                                   // Destination workbook sheet

  var criteria1 = "Active"                                                                       // Criteria #1
  var criteria2 = "Hop"                                                                          // *Criteria #2, change to location name in

  destsheet.getRange(6, 1, destsheet.getLastRow(), destsheet.getLastColumn()).clearContent()      // Clear all previous content on destination sheet
  SpreadsheetApp.flush();                                                                         // Wait till the clear sheet is complete before adding new

  var sourcerange  = [4,2,1,4,5,7,11,12,4,64,4,65,4,68,69,70,4,75];                               // Columns of data to import
  var newvalues = [];

  for (var i = 0, length = sourcesheet.length; i < length; i++) {
    if (sourcesheet[i][1]==criteria1 && sourcesheet[i][2]==criteria2){
      newvalues[i] = [];
      for (var j = 0, width  = sourcerange.length; j < width; j++) {
    if (sourcesheet[i][1]==criteria1 && sourcesheet[i][2]==criteria2){
        newvalues[i][j] = sourcesheet[i][sourcerange[j]];
      }
    }
  }
  }
    if(newvalues.length > 0) {   
      destsheet.getRange(6, 1, length +1, width +1).setValues(newvalues);
    }
}

Ответы [ 2 ]

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

Попробуйте это:

function UpdateTeam() {
  var sss=SpreadsheetApp.openById('id');
  var svA=sss.getSheetByName("Test").getDataRange().getValues();
  var dss=SpreadsheetApp.getActive();
  var dsh=dss.getSheetByName("Team");
  var criteria1="Active";
  var criteria2="Hop";
  dsh.getRange(6,1,dsh.getLastRow()-5,dsh.getLastColumn()).clearContent();
  var srg=[4,2,1,4,5,7,11,12,4,64,4,65,4,68,69,70,4,75];
  var newvalues = [];
  for (var i=0;i<svA.length;i++) {
    if (svA[i][1]==criteria1 && svA[i][2]==criteria2){
      var row=[];
      srg.forEach(function(e,j){row.push(svA[i][srg[j]]);})
      newvalues.push(row);
    }
  }
  if(newvalues){dsh.getRange(6,1,newvalues.length,srg.length).setValues(newvalues);}
}
0 голосов
/ 11 января 2020

Проблема с длиной массива newvaluess. Он не совпадает с длиной массива sourcerange.

Вы можете проверить это, добавив этот код в свой код.

Browser.msgBox("sourcerange length: " + sourcerange.length + " | newvalues length: " + newvalues.length);
return;
if(newvalues.length > 0) {   
  destsheet.getRange(6, 1, length +1, width +1).setValues(newvalues);
}

Я думаю, что проблема в том, что вы не добавляете еще, чтобы добавить пустой слот в массив, чтобы сохранить ту же длину, когда не соответствует критериям.

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