我有一个脚本,其中它在两个电子表格列A和B之间搜索具有不同值的第一行。但是,在找到具有不同值的行之后,我希望它得到该行,在Spreadsheet 1中获取值,然后在Spreadsheet 2中找到该特定值,然后在Spreadsheet 2中获取该值的行。可以很好地执行第一部分的代码,但是当我尝试获得第二部分时,我似乎无法考虑如何将其组合在一起。
function checkAndPlace() {
var sos = SpreadsheetApp.openById("Spreadsheet 1");
var sas = SpreadsheetApp.setActiveSpreadsheet(sos);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s1 = ss.getActiveSheet();
ss.getRange('F2').setValue('RUNNING')
var Avals = s1.getRange("A1:A").getValues();
var Alast1 = Avals.filter(String).length;
var s1LastRow = s1.getLastRow()+1;
var Sheet1DataRange = s1.getRange(1,1,s1LastRow,2);
var Sheet1BDataRange = s1.getRange(1,2,s1LastRow,1);
var Sheet1Data = Sheet1DataRange.getValues();
var Sheet1BData = Sheet1BDataRange.getValues();
var Sheet1length = Sheet1Data.length;
var sos2 = SpreadsheetApp.openById("Spreadsheet 2");
var sas2 = SpreadsheetApp.setActiveSpreadsheet(sos2);
var ss2 = SpreadsheetApp.getActiveSpreadsheet();
var s2 = ss2.getActiveSheet();
var Avals2 = s2.getRange("A1:A").getValues();
var Alast2 = Avals2.filter(String).length;
var s2LastRow = s2.getLastRow()+1;
var Sheet2DataRange = s2.getRange(1,1,s2LastRow,2);
var Sheet2BDataRange = s2.getRange(1,2,s2LastRow,1);
var Sheet2Data = Sheet2DataRange.getValues();
var Sheet2BData = Sheet2BDataRange.getValues();
var Sheet2length = Sheet2Data.length;
for (var i = 0; i < Sheet1Data.length; i++) {
var s1data = Sheet1Data[i][0];
Logger.log(s1data)
var s1Bdata = Sheet1BData[i][0];
Logger.log(s1Bdata)
var s2data = Sheet2Data[i][0];
Logger.log(s2data)
var s2Bdata = Sheet2BData[i][0];
Logger.log(s2Bdata)
if (s1data + s1Bdata != s2data + s2Bdata){
var falseRow = i+1
var falseRowARange = s2.getRange(falseRow,1,1,2);
var falseRowAName = falseRowARange.getValues();
var falseRowBRange = s2.getRange(falseRow,2,1,1);
var falseRowBName = falseRowBRange.getValues();
Logger.log("Line: "+i+". Sheets are NOT equal. Sheet1 = "+s1data+", Sheet2 = "+s2data);
for (var j = 0; j < Sheet2Data.length; j++) {
var s1data = Sheet1Data[j][0];
Logger.log(s1data)
var s1Bdata = Sheet1BData[j][0];
Logger.log(s1Bdata)
!!!! var falsejdata = falseRowAName[j][0]; "Cannot read property 0"
Logger.log(falsejdata)
var falsejBdata = falseRowBName[j][0];
Logger.log(falsejBdata)
if(falsejdata + falsejBdata == s1data + s1Bdata) {
var trueRow = j+1
Logger.log(trueRow)
}
}
return false;
}
else {
Logger.log("Line: "+i+". Sheets are equal, value: "+s1data);
}
}
}
它始终显示“无法从未定义中读取属性'0'。”我在代码中标记了这一点的行显示了这一点。
我要这样做的原因是因为我有一个电子表格,该电子表格会不断更新以获取更多信息,并且我需要知道更新了哪些行才能使脚本将包含信息的单元格添加到这些行中。因此,电子表格1将自身与镜像电子表格2进行比较。它查找哪些值不同,然后决定删除或添加一行。但是,确定要执行该操作是一个问题。如果它大于或小于镜像表,我首先对其进行添加或删除。但是,如果更新得非常快,它会发现它会自动删除应该添加的行,并且一切都破了。因此,我决定我希望电子表格1的另一行中的值在电子表格2中找到该值,以确定是否应该删除,添加或从头开始checkAndPlace()
函数,而不是执行任何操作。然后,我想从电子表格2的另一行中查找值,以在电子表格1中搜索自身,以查看该值是否仍存在于该行中以及哪一行?因此它可以比较它所在的行的差异。
但是现在我什至不知道我是否需要两个不同的循环来使这项工作或如何解决。仅查看我的代码,您就可以看到它如何引起各种混乱。我是相对较新的人,所以也许有些简单的事情我被忽略或不知道。
编辑:另一条信息是,电子表格1从每天被多次编辑的电子表格的查询中获取信息。此编辑使可安装的onChange()函数运行checkAndPlace()函数。
答案 0 :(得分:0)
没关系,我想我明白了。想出了我期望看到的价值观。
for (var i = 0; i < Sheet1Data.length; i++) {
var s1data = Sheet1Data[i][0];// s1 is spreadsheet 1's sheet.
Logger.log(s1data)
var s1Bdata = Sheet1BData[i][0];
Logger.log(s1Bdata)
var s2data = Sheet2Data[i][0];
Logger.log(s2data)
var s2Bdata = Sheet2BData[i][0];
Logger.log(s2Bdata)
if (s1data + s1Bdata != s2data + s2Bdata){
var falseRow = i+1
var falseRow2ARange = s2.getRange(falseRow,1,1,1);//s2 is spreadsheet 2's sheet.
var falseRow2AName = falseRow2ARange.getValues();
var falseRow2BRange = s2.getRange(falseRow,2,1,1);
var falseRow2BName = falseRow2BRange.getValues();
Logger.log('falseRow is '+falseRow+' and its value is '+falseRow2AName+' '+falseRow2BName+'.');
Logger.log("Line: "+i+". Sheets are NOT equal. Sheet1 = "+s1data+", Sheet2 = "+s2data);
for (var j = 0; j < Sheet1Data.length; j++) {
var s1data = Sheet1Data[j][0];
Logger.log(s1data)
var s1Bdata = Sheet1BData[j][0];
Logger.log(s1Bdata)
if(falseRow2AName + falseRow2BName == s1data + s1Bdata) {
var trueRow = j+1
Logger.log(trueRow)
}
}
}
}