Для l oop работает снова после выполнения условия - PullRequest
0 голосов
/ 06 апреля 2020

Я работаю над созданием функции, которая добавляет данные из многочисленных листов в документ Google Sheets. Функция создает рабочие листы с именем и слотом для данных, а также заголовки столбцов для данных, которые функция будет вставлять в лист «Печать». У меня проблема с тем, что для l oop, кажется, работает дополнительное время, даже если условия выполнены, насколько я могу судить. Вот код, который у меня есть, он уродлив, но я просто создаю его для себя.

function pasteToPrint(){

  var ui = SpreadsheetApp.getUi()

  var spreadsheet = SpreadsheetApp.getActive();

  var sheetName;

  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

  var lastCol;

  var lastRow;

  var a;

  var x;

  var y;

  var z;

  var array1 = [];

  var array2 = [];

  function getNextPage(){ // spreads subsequent data set to page break for printing 
    x = spreadsheet.getSheetByName("Print").getLastRow();
    y = x/32;
    y = Math.ceil(y);
    z = 32*y;
    return z;
  }

  for(var i = sheets.length-1; i > 4; i--){ // loops through the appropriate sheets and pushes to array1
    lastCol = spreadsheet.getSheetByName(sheets[i].getName()).getLastColumn()+1;
    lastRow = spreadsheet.getSheetByName(sheets[i].getName()).getLastRow()+1;
    array1.push(spreadsheet.getSheetByName(sheets[i].getName()).getRange(1, 1, lastRow, lastCol).getValues());
  }

  for(var i = 0; i < array1.length; i++){ 
    for(var j = 0; j < array1[i].length; j++){
      // Looking for data that has a value grater than 0 at .slice(2,3)
      if(array1[i][j].slice(2,3) > 0){ // Ref1
        for(var k = 0; k < array1[i].length; k++){ // here I push that data to array2
          if(array1[i][k].slice(2,3) > 0){ // ref 2
            array2.push(array1[i][k]);
          }
        }
        ui.alert(array2+" test 1"); // lets me know the content of array2
        ui.alert(array2.length); // tells me the length just to be sure
        for(var l = 0; l < array2.length; l++){ // decides where to paste the next data set
          if(spreadsheet.getSheetByName("Print").getLastRow()>1){ // ref 3
            a = getNextPage(); // returns the next 32nd line
          }
          else {
            a = 1; // starts at row 1
          } 
          // this next section is column formatting for the beginning of the production sheet
          // ref 4
          spreadsheet.getSheetByName("Print").getRange(a,1).setValue("Name:");    
          spreadsheet.getSheetByName("Print").getRange(a,3).setValue("Date:");
          a++; // moves to the next row
          spreadsheet.getSheetByName("Print").getRange(a,1).setValue("Product");
          spreadsheet.getSheetByName("Print").getRange(a,2).setValue("Work Order");
          spreadsheet.getSheetByName("Print").getRange(a,3).setValue("Planned Production");
          spreadsheet.getSheetByName("Print").getRange(a,4).setValue("Product Produced");
          spreadsheet.getSheetByName("Print").getRange(a,5).setValue("Steel Shortage");
          spreadsheet.getSheetByName("Print").getRange(a,6).setValue("Notes");
          a++ // moves to the next row
          // ref 5
          for(var m = 0; m < array2[l].length-1; m++){ // HERE IS THE PROBLEM LOOP
            ui.alert(array2[m]+" test 2"); // I see this run an additional time after m = length
            spreadsheet.getSheetByName("Print").getRange(a,1).setValue(array2[m][0]);
            spreadsheet.getSheetByName("Print").getRange(a,2).setValue(array2[m][4]);
            spreadsheet.getSheetByName("Print").getRange(a,3).setValue(array2[m][2]);
            a++; 
          }
        }
        array2 = []; // array2 is emptied 
        break; // First if statement checking .slice(2,3) now has the function go to the next sheet
      }
    }
  }

  ui.alert("Function ended"); // just letting me know

};

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

Material  Req Planned Quantity MTs Planned Order
AI UPC300 1   1                86  12744851

Колонка «Количество плана» - это то, что ищет .slice (2,3). По умолчанию, когда я вставляю исходные данные в листы из моей системы инвентаризации, значение планового количества будет равно 0. После того, как я просмотрел документ и запланировал производство, это означает, что я присвоил значение плановому количеству больше 0, я запустит функцию вставки данных на лист печати. Там может быть сотни предметов, но я планирую только часть из них, поэтому это удобно. Я не могу поделиться полным документом, с которым я работаю, потому что он содержит конфиденциальные данные. Если вы создаете лист Google с одним листом с именем print и вторым листом с любым именем, вы можете вставить данные примера в строки 1 и 2 второго листа, и вы увидите ошибку, которую я получаю,

TypeError: Невозможно прочитать свойство '0' из неопределенного (строка 138, файл "arrayTest")

Также необходимо изменить for(var i = sheets.length-1; i > 4; i--) на for(var i = sheets.length-1; i > 1; i--), изменить 4 на 1 У меня есть больше кода в моем документе, но он состоит из отдельных функций от этой функции.

Я добавил изображение ниже, которое демонстрирует, как это будет выглядеть до того, как я использую функцию, а также как лист печати будет смотреть после запуска функции. К сожалению, мне пришлось сделать скриншот, чтобы данные были сжаты. Представьте, что каждый раздел данных, который вы видите, зеленый, синий и белый, находится на своих собственных листах. Для ясности данные зеленого цвета будут содержаться в TestSheet1, данные синего цвета - в TestSheet2, а лист печати будет полностью пустым до запуска этой функции. После того, как я ввел свои плановые количества в столбцы Плановое количество в TestSheet 1 и 2, я запустил функцию. Это приведет к вставке данных на страницу печати. Я добавил комментарии «ref» в код, чтобы показать, где происходит каждый шаг следующего объяснения. Функция выполняется в следующем порядке: 1) Функция определит, имеет ли лист значения, превышающие ноль, в столбце Плановое количество, «ref 1». 2) Функция проведет их через l oop через лист и pu sh в любой строке, которая соответствует этому критерию, в array2, "ref 2". 3) Функция будет определять, куда вставлять данные в лист печати, основываясь на данных, которые могут быть уже перетянуты на лист, строка 1, строка 32, строка 64 и т. Д. «Ссылка 3». 4) функция вставит заголовок над данными, которые скоро будут вставлены Этот заголовок включает в себя имя, дату и заголовки столбцов. 5) После того, как заголовок помещен, функция перейдет через l oop через array2 и вставит содержимое на лист для печати, «ref 5». 6) функция установит массив2 таким образом, чтобы array2 = [], и затем будет повторять процесс для следующего листа, пока все листы не будут уложены и больше нет данных для вставки в Print, «ссылка 6».

Image of spreadsheets:

1 Ответ

1 голос
/ 06 апреля 2020

m l oop не требуется. Он зацикливается на столбцах текущей строки (l s). A mcve выглядит так:

const array2d = [1, 2, 3].map(num => new Array(6).fill(num));//boilerplate to simulate array2
console.log({array2d});
for (var l = 0; l < array2d.length; l++) {
  for (var m = 0; m < array2d[l].length - 1; m++) {
    // HERE IS THE PROBLEM LOOP
    // alert(array2d[m] + ' test 2'); // I see this run an additional time after m = length
    console.log(array2d[m][0], array2d[m][2], array2d[m][4]);
  }
}

Решение:

Полностью удалить l oop.

a++; // moves to the next row
//          for(var m = 0; m < array2[l].length-1; m++){ // HERE IS THE PROBLEM LOOP
//           ui.alert(array2[m]+" test 2"); // I see this run an additional time after m = length
spreadsheet
  .getSheetByName('Print')
  .getRange(a, 1)
  .setValue(array2[l][0]);
spreadsheet
  .getSheetByName('Print')
  .getRange(a, 2)
  .setValue(array2[l][4]);
spreadsheet
  .getSheetByName('Print')
  .getRange(a, 3)
  .setValue(array2[l][2]);
a++;
//          }

    }

Лучшие практики:

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