google-apps-script - 在两个电子表格之间查找一行,然后查找包含第一行中的值的行
问题描述
我有一个脚本,它在两个电子表格列 A 和 B 之间搜索具有不同值的第一行。但是,在它找到具有不同值的行之后,我希望它获取该行,获取电子表格 1 中的值并在电子表格 2 中找到该特定值。然后在电子表格 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() 函数。
解决方案
没关系,我想我明白了。想出了我期望看到的价值观。
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)
}
}
}
}
推荐阅读
- r - R中的Plotly折线图产生C堆栈使用错误
- c - C程序可以在gdb中找到(通过fopen)但不能释放(a.out)
- r - 从 R 中的数据框列表中提取名称:现有解决方案不起作用
- mysql - “字段列表”中的未知列“created_by”-触发器
- powershell - 通过 PowerShell 在 IIS 10 中启用 ASP.NET 模拟
- spring-mvc - 如何通过 Jmockit 使用 Junit 的路径获取文件
- python-3.x - 在 python 中“接受 2 个位置参数,但给出了 3 个”
- php - 在PHP中将数组值转换为数组键
- python - 如何在 Python 中获取 SQL 行名
- microsoft-graph-api - SharePoint 列表项 ID 上 OrderBy 的图形资源管理器查询不起作用