For loop 满足条件后,For循环再次运行

For loop 满足条件后,For循环再次运行,for-loop,google-apps-script,google-sheets,For Loop,Google Apps Script,Google Sheets,我正在研究一个函数,它可以在Google sheets文档中添加来自多个工作表的数据。该函数将创建具有名称和数据槽以及列标题的生产工作表,并将其粘贴到工作表“打印”中。我遇到了这样一个问题,for循环似乎运行了一段额外的时间,即使我所知道的条件已经满足。这是我到目前为止的代码,它很难看,但我只是为自己构建这个 function pasteToPrint(){ var ui = SpreadsheetApp.getUi() var spreadsheet = SpreadsheetAp

我正在研究一个函数,它可以在Google sheets文档中添加来自多个工作表的数据。该函数将创建具有名称和数据槽以及列标题的生产工作表,并将其粘贴到工作表“打印”中。我遇到了这样一个问题,for循环似乎运行了一段额外的时间,即使我所知道的条件已经满足。这是我到目前为止的代码,它很难看,但我只是为自己构建这个

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

};

Plan Quantity列是.slice(2,3)要查找的内容。默认情况下,当我从库存系统将原始数据粘贴到图纸中时,计划数量的值将为0。在我完成文档和计划生产后,这意味着我已经为计划数量分配了一个大于0的值,我将运行函数将数据粘贴到打印表中。可能有数百个项目,但我将只计划其中的一部分,这就是为什么这是方便。我无法共享正在使用的完整文档,因为其中包含敏感数据。如果您创建一个google工作表,其中一个工作表名为print,另一个工作表名为which,您可以将示例数据粘贴到第二个工作表的第1行和第2行,您将看到我得到的错误,即

TypeError:无法读取未定义的属性“0”(第138行,文件“arrayTest”)

您还必须将(var i=sheets.length-1;i>4;i--)的
更改为
对于(var i=sheets.length-1;i>1;i--)的
,将4更改为1。我的文档中有更多的代码,但它由与此函数不同的函数组成

我在下面添加了一张图片,展示了在我使用该功能之前的外观,以及在该功能运行后打印表的外观。不幸的是,我不得不截图,所以数据被压缩了。想象一下,您看到的每个数据部分,绿色、蓝色和白色,都在各自的工作表上。为清晰起见,绿色数据将包含在TestSheet1中,蓝色数据包含在TestSheet2中,并且在该函数运行之前,打印表将完全为空白。在测试表1和2中的计划数量列中输入计划数量后,我将运行该函数。这将导致数据被粘贴到打印页面。我在代码中添加了“ref”注释,以显示以下解释的每个步骤发生的位置。该函数按以下顺序运行:1)该函数将确定图纸在“计划数量”列“参考1”中是否有大于零的值。2) 函数将使它们在工作表中循环,并将符合此条件的任何行推送到array2“ref 2”。3) 该功能将根据可能已经粘贴到图纸、第1行、第32行、第64行等“参考3”中的数据,确定将数据粘贴到打印图纸中的位置。4) 该函数将在即将粘贴的数据上方粘贴标题。此标题包括名称、日期和列标题。5) 放置页眉后,函数将循环通过array2并将内容粘贴到打印页“ref 5”。6) 该函数将设置array2,以便
array2=[]
,然后对下一张图纸重复该过程,直到所有图纸都已检查完毕,并且没有更多的数据要粘贴到打印“ref 6”中


不需要
m
循环。它在当前行(
l
s)列上循环。A看起来像这样:

constarray2d=[1,2,3].map(num=>newarray(6).fill(num))//模拟阵列的样板2
log({array2d});
对于(var l=0;l}
@Cooper很显然,将所有这些放在较少的行中会很酷,但我对它更感兴趣,因为我的主要目标是更快地完成我的工作。就像我在问题中提到的,你可以制作一个新的谷歌表单文档并粘贴到数据中,以查看我得到的错误。如果您添加第三页并再次输入数据,您将看到我从单独的页面粘贴数据的想法是如何被隔开以便打印的,尽管该功能不起作用,因为循环运行了一段额外的时间。提供在将来我还没有机会编辑代码,但标题文本后的循环点是粘贴到打印页是为了每个数据段都有一个标题。我还添加了一幅图像,描述了事情的发展情况,并详细解释了逐步进行的过程。@Darth
array2
包含行。没有必要为每个
l
添加标题。将addheaders部分移出
l
循环。我认为我对这部分解释得不够好。在我的实际工作环境中,我将使此函数平均循环17张工作表。我总共可以有大约200到300个条目被粘贴到打印页面上。每页将同时将其计划生产数量粘贴到打印页,因为所有数据都将粘贴到一个打印页。因此,过帐数据的每个工作表部分都需要在其上方有一个标题。所以当我运行循环时,我需要有一个标题,我需要循环数据,粘贴,分页符,然后重复。@Darth,我想你不明白我在说什么。告诉你什么,提供一个样本
array2
,记录一个新的电子表格,其中包含两个新的表格,每张表格中有5行,每个表格中有你问题的屏幕截图。(例如:array2=[[xyz,10,0,],[abc,15,0…],…])
Material  Req Planned Quantity MTs Planned Order
AI UPC300 1   1                86  12744851