Я хочу отредактировать макрос так, чтобы данные из 1 в другой лист соответствовали дате? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь редактировать макрос, который копирует данные из вложенных листов IOSRef, AndroidRef, WebRef, BetaRe на основной лист (все они принадлежат одному листу). НО я хочу, чтобы он сначала совпадал с датами и соответственно копировал данные.


Я попытался создать массив дат основного листа и сопоставить его с 7-дневным диапазоном дат на вложенных листах и ​​поместить его в цикл. И таким образом создали 4 таких цикла, которые видны в коде. Сценарий выполняется без ошибок, но не выполняет никаких действий.


function UpdateMacro() {
 var spreadsheet = SpreadsheetApp.getActive();
 spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Consolidated'), true);

 var data=spreadsheet.getActiveSheet().getRange(2,1,1,321); 
//Date array named data //

  for(var nn=0;nn<data.length;nn++){ 
    if (data[0][nn]==spreadsheet.getRange('IOSRef!B2')){
      spreadsheet.setCurrentCell(data[i][nn]); 
      spreadsheet.getCurrentCell().offset(1, 0).activate();
      spreadsheet.setActiveSheet(spreadsheet.getSheetByName('IOSRef'), true);
// Above 3 lines for copying the data //
      spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Consolidated'), true);
      spreadsheet.getRange('IOSRef!B3:I6').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);      
    }
    else{spreadsheet.setCurrentCell('NULL');};
      }; //to Copy from iOS to Consolidated 

  for(var nn=0;nn<data.length;nn++){
    if (data[0][nn]==spreadsheet.getRange('AndroidRef!B2')){
      spreadsheet.setCurrentCell(data[i][nn]);
      spreadsheet.getCurrentCell().offset(5, 0).activate();
      spreadsheet.setActiveSheet(spreadsheet.getSheetByName('AndroidRef'), true);
      spreadsheet.getCurrentCell().offset(2, 1, 4, 8).activate();
      spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Consolidated'), true);
      spreadsheet.getRange('AndroidRef!B3:I6').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);     
    };
      }; //to Copy from Android to Consolidated 

  for(var nn=0;nn<data.length;nn++){
    if (data[0][nn]==spreadsheet.getRange('WebRef!B2')){
      spreadsheet.setCurrentCell(data[i][nn]);
      spreadsheet.getCurrentCell().offset(9, 0).activate();
      spreadsheet.setActiveSheet(spreadsheet.getSheetByName('WebRef'), true);
      spreadsheet.getCurrentCell().offset(2, 1, 4, 8).activate();
      spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Consolidated'), true);
      spreadsheet.getRange('WebRef!B3:I6').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);     
    };
      }; //to Copy from Web to Consolidated

    for(var nn=0;nn<data.length;nn++){
    if (data[0][nn]==spreadsheet.getRange('BetaRef!B2')){
      spreadsheet.setCurrentCell(data[i][nn]);
      spreadsheet.getCurrentCell().offset(13, 0).activate();
      spreadsheet.setActiveSheet(spreadsheet.getSheetByName('BetaRef'), true);
      spreadsheet.getCurrentCell().offset(2, 1, 4, 8).activate();
      spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Consolidated'), true);
      spreadsheet.getRange('BetaRef!B3:I6').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);     
    };
      };

1 Ответ

1 голос
/ 07 ноября 2019

В этой строке: var data=spreadsheet.getActiveSheet().getRange(2,1,1,321);

Нет data.length, поскольку он возвращает диапазон.

Возможно, вы бы предпочли добавить .getValues() в конец

Однако, даже тогда data.length всегда будет одним, так что вы действительно хотите использовать цикл for?

В этой строке: spreadsheet.setCurrentCell(data[i][nn]);

вы используетеиндекс i, который не определен в нашем примере, так что это не минимально воспроизводимый пример , потому что i не определен для нас, поэтому мы не можем помочь.

Также обратите внимание на следующий код:

spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Consolidated'), true); var data=spreadsheet.getActiveSheet().getRange(2,1,1,321);

Макро-рекордер следует вашим действиям, поэтому при переходе на другой лист и получении данных он записывает все ваши движения. Но в сценарии вам не нужно переходить на другой лист. Таким образом, приведенные выше строки сценария могут быть записаны просто как:

var data=spreadsheet.getSheetByName('Consolidated').getRange(2,1,1,321);, таким образом, избегайте всего лишнего кода активации листов, который не нужно активировать.

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