如何从for()循环中获取特定行。它应该在何时停止循环播放

时间:2019-06-03 19:54:19

标签: google-apps-script google-sheets

我有这样一个循环:

for (var i = 0; i < Sheet1Data.length; i++) {

并且我试图在它等于特定行时获取i,该行必须是两个不同电子表格上的两个值不匹配的行,我这样得到。

 var s1data = Sheet1Data[i][0];
 var s2data = Sheet2Data[i][0];
if (s1data != s2data){
      var falseRow = i+1
}

工作表数据是工作表范围的所有值。因此,如果if函数使用循环递减计数,则它看起来像:

0:Aang = Aang

1:科拉=科拉

2:Sakka!= Toph-> var falseRow = 2 + 1 = 3

我加1的原因是将数字从整个0 =第一行更改为其他函数可以理解的整数。 当它得到错误的行时,它会选择根据它在工作表中的位置进行处理。例如:”; ;”表示电子表格中的更改。

0:Aang; ;昂

1:科尔拉; ;科拉

2:Sakka; ; Toph

3:托普; ;(空白)

它使用另一个循环来查找这些值在另一个工作表中的位置

   var s1falseRowARange = s1.getRange(falseRow,1,1,1);
   var s1falseRowAName = s1falseRowARange.getValues();
for (var j = 0; j < Sheet1Data.length; j++) {
   var s1dataj = Sheet1Data[j][0];
   var s2dataj = Sheet2Data[j][0];
   if(s1falseRowAName == s2dataj){
      var s2trueRow = j+1;
}
}

除了sheet2以外,它也这样做。因此,它找到了Toph在工作表2(第4行)中的位置

var s1trueRow =j+1;//or 4

但是Sheet2中没有Sakka吗?因此它确定他不在使用

  if(falseRow > s2trueRow) {
    var fm2t = 'true';
  }
  else if(falseRow < s2trueRow) {
    var fl2t = 'true';
  }
    var s2Rowfound = 'true';
}
  else if(j+1 == s2LastRow && s2Rowfound != 'true'){
     s2.insertRows(falseRow);
     s2.getRange(falseRow,1,1,1).setValue(s1data)
  }
function insertCell(cellRange) {
  var sos = SpreadsheetApp.openById("Sheet1");
  var sas = SpreadsheetApp.setActiveSpreadsheet(sos);
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1 = ss.getActiveSheet();
  s1.getRange(cellRange).insertCells(SpreadsheetApp.Dimension.ROWS);
}

function deleteCell(cellRange){
  var sos = SpreadsheetApp.openById("Sheet1");
  var sas = SpreadsheetApp.setActiveSpreadsheet(sos);
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1 = ss.getActiveSheet();
  s1.getRange(cellRange).deleteCells(SpreadsheetApp.Dimension.ROWS);
}

Var s2Rowfound从不等于true。因此,它确定他不存在于sheet2上,并将其添加到了sheet 2上。

这是我的问题终于出现的地方! falseRow等于循环值i。因此,当添加新行时,循环功能可能仍会在发生意外的情况下起作用,该意外会在将Sakka添加到列表后导致类似这样的事件:

0:Aang; ;昂

1:科尔拉; ;科拉

2:Sakka; ; Sakka

3:托普; ;(空白)

4 :(空白); ; Toph

它应该在下一行插入一行。这与falseRow是循环变量i有关。这不仅是添加行,还删除行(我有一种情况,如果在sheet1上不存在该行,则会删除该行)。有时它会很好地工作,但有时它会在循环之后添加或删除行。我如何才能让它在删除或添加行之后才继续循环,以防止发生这种双重添加或双重删除?

编辑: 好的,因此我对其进行了更多测试。看来问题可能更多在于deleteCell()insertCell()insertRows()函数。在某些打it中,它会无缘无故地重演。我可能不得不提出另一个问题,这个问题比循环更重要。但是,如果这里有人有任何想法,我会为您提供更多背景知识。

if(j+1 == s1LastRow && fnot1t == 'true' && 'F3' != 'RUNNING'){
          s1.getRange('F3').setValue('RUNNING');

我尝试了很多事情,例如在函数开始时将Cell设置为“ RUNNING”,然后将其设置回“”。当那部分结束时。为了防止它自己赛车。至少这给了我一个视觉上的指示,即当时的功能在做什么的好处。

          var falseRow = falseRowC.getRow();
          s1.getRange('F4').setValue(falseRow);
          var F4 = s1.getRange('F4').getValue();
          s2.deleteRow(F4);

然后,我尝试将falseRow制作为其他类型的变量,以使其尽可能远离“ i”,以为这是造成错误的原因。甚至可以将行写到一个单元格中,并获取该单元格的值来代替我需要更改的行。

          s1.getRange('C'+F4).deleteCells(SpreadsheetApp.Dimension.ROWS);
          Logger.log('Delete row '+F4+' from Mirror Sheet.');
          s1.getRange('F3').setValue('');
        }

此处是F3单元返回到零的位置,表示此过程已完成,并允许从头开始执行该过程。您还可以看到deleteCells函数在这里,所以如果只写一次并且该函数直到RUNNING指示灯熄灭后才能再次运行,它将如何执行两次?这就是问题。

        else if(j+1 == s1LastRow && fnot2t == 'true' && fl1t == 'true' && 'F3' != 'RUNNING') {
          s1.getRange('F3').setValue('RUNNING');
          var falseRow = falseRowC.getRow();
          s1.getRange('F4').setValue(falseRow);
          var F4 = s1.getRange('F4').getValue();
          s1.getRange('C' + F4).insertCells(SpreadsheetApp.Dimension.ROWS);
          s1.getRange('C' + F4).setValue('HOME');
          var SRange = s1.getRange(F4,1,1,2);
          var A1Range = SRange.getA1Notation();
          var SData = SRange.getValues();
          s2.insertRows(F4);
          s2.getRange(A1Range).setValues(SData);
          s1.getRange('F3').setValue('');
        }

这是相同的过程,但是要添加行。同样的问题。使F3 = RUNNING以防止其运行此insertRows进程。但是由于某种原因,它添加了多行。

1 个答案:

答案 0 :(得分:0)

根据getValues()方法的文档(下面的链接),它“返回一个二维值数组,按行然后按列索引。”因此,当您将其与单个值s2dataj进行比较时,可能会给您带来麻烦。由于您设置了在致电s1.getRange(falseRow,1,1,1)时获取单个单元格的范围,因此我认为您的支票应为:

if(s1falseRowAName[0][0] == s2dataj){
      var s2trueRow = j+1;
}

getValues()文档链接:https://developers.google.com/apps-script/reference/spreadsheet/range#getvalues