我有这样一个循环:
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进程。但是由于某种原因,它添加了多行。
答案 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