Почему массивы в моем скрипте Google Apps перезаписываются? - PullRequest
1 голос
/ 25 октября 2019

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

Теперь, с каждым шагом предыдущий массив изменяется и становится равным производному массиву дов конце все массивы одинаковы.

Есть идеи, что я делаю неправильно?

(Я не профессионал и все еще в процессе создания сценария, поэтому, пожалуйста, имейте в видуменя по поводу уродливого / неэффективного кода:)

function dataTables() {


  /* All spreadsheet data to tables */


  var mastersheet = SpreadsheetApp.openById("xyz");


  // Data array of whole sheet with values in "Artikelbezeichnung" (field 6)
  var completeTable = mastersheet.getSheetByName("Mastersheet").getDataRange().getValues();
  completeTable.splice(0,2); // Remove header lines 1 & 2
  for ( i = completeTable.length; i > 0 ; i-- ) {
    if (completeTable[i-1][6-1] == "") { completeTable.splice(i-1,1); } // Remove lines with empty "Artikelbezeichnung" (field 6) if necessary
  }

  Logger.log(completeTable); // Log 1

  // Indexeded data array of whole sheet
  var completeTableIndexed = completeTable;
  for ( i = completeTableIndexed.length; i > 0; i-- ) {
    completeTableIndexed[i-1].unshift(i+2);
  }

  Logger.log(completeTableIndexed); // Log 2
  Logger.log(completeTable);

  // Data array of all lines eligible for RTN sheet with Indexed
  var rtnTableIndexed = completeTableIndexed;
  for ( i = rtnTableIndexed.length; i > 0 ; i-- ) {
    if ( rtnTableIndexed[i-1][17] == "Nein" ) { rtnTableIndexed.splice(i-1,1); } // Remove lines with "Reparaturcontroller" (field 17) = "Nein"  if necessary
    else if ( rtnTableIndexed[i-1][28] != "" ) { rtnTableIndexed.splice(i-1,1); } // Remove lines with "Versanddatum G4G -> Hersteller" (tracker, field 28) if necessary
    else if ( rtnTableIndexed[i-1][23] == "Ja" && rtnTableIndexed[i-1][25] == "" ) { rtnTableIndexed.splice(i-1,1); } // Remove lines with "KVA (J/N)" (field 23) = "Ja" and KVA is not yet confirmed ("KVA bestätigt am", field 25) if necessary
  }


  // Data array of all lines eligible for KVA sendings with Indexed
  var kvaTableIndexed = completeTableIndexed;
  for ( i = kvaTableIndexed.length; i > 0 ; i-- ) {
    if ( kvaTableIndexed[i-1][23] != "Ja" && kvaTableIndexed[i-1][24] != "" ) { kvaTableIndexed.splice(i-1,1); } // Remove lines with "KVA (J/N)" (field 23) not "Ja" and "KVA versendet am" (field 24) not empty if necessary
  }


  var results = [completeTableIndexed,rtnTableIndexed, kvaTableIndexed, completeTable]; // Log 3

  Logger.log(completeTableIndexed); // Log 4
  Logger.log(rtnTableIndexed);
  Logger.log(kvaTableIndexed);
  Logger.log(completeTable);




}

Ожидаемый вывод в журнале 1 - это полные данные электронной таблицы без каких-либо пустых строк - это прекрасно работает и выдает около 15 строк.

ОжидаетсяВыход Log 2 представляет собой индексированный массив первого шага, а также исходный массив. Вместо этого он выводит индексированный массив дважды.

Ожидаемым выводом Log 3 и 4 будет исходный массив, индексированный исходный массив и два разбитых массива, в каждой из которых примерно две строки. Вместо этого все зарегистрированные массивы - это разбитые массивы, содержащие две строки. Все они идентичны.

В процессе первоначальный полный массив, кажется, перезаписывается несколько раз.

1 Ответ

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

Вместо использования этого var completeTableIndexed = completeTable;

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

var completeTableIndexed=[];
completeTable.forEach(function(r){completeTableIndexed.push(r.slice();});

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

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