Я работаю над созданием функции, которая добавляет данные из многочисленных листов в документ 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».