我花了整整两个工作日搜索论坛并对其进行一般故障排除,但由于我对 java 比较陌生,这可能是新手违反基本原理的情况。如属实,请见谅。
上下文: 我正在编写的业务案例需要比较两个单独的 Google 电子表格文件之间的记录,这非常类似于 sql 使用主键和外键查询两个表。为方便起见,将各自电子表格文件中的两个范围加载到单独的数组中,然后将充当主键和外键的字段进行比较以进行匹配。
问题: 代码运行,根据我使用调试器观察到的情况,如果要评估 IF 语句,则应该识别匹配,但 IF 语句无法评估,因此没有识别出这样的匹配。我试图让这很容易在日志中看到,当您在随附的重建中运行代码时(其中 i = 2 并且匹配值为 32)将产生的日志。
我检查了两个电子表格中比较字段的数据类型是否相同,并且我尝试了不同的比较运算符,以防数组值是浮点数。此外,在使用 [ [ ],[ ] ] 语法而不是伴随重构中使用的语法声明数组之后,我尝试使用 for 循环加载数组。最后,只有当函数的参数根本没有存储在数组中时,我才正确评估 IF 语句。然而,由于下面提到的约束,这是一个不能令人满意的解决方案。
约束: 消除数组使用的变通办法如果激增对服务器的调用,则可能是不切实际的,就像我尝试使用单数 getValue() 方法(与复数 getValues() 方法相比)加载数组一个值时的情况一次。在伴随的重建中不会观察到这种现象,因为用于比较的两个表在同一个文件中。
此外,虽然加载到数组中的两个系列在随附的重建中位于相邻列中,但它们不在我的实际用例中。出于这个原因,任何将两个 getValues() 方法合并为一个的解决方法也可能是不切实际的。
成功会是什么样子: 当代码运行后名为“return”的变量在日志中不再未定义时,则匹配已被识别并存储!
补充材料: 这个问题的本质在这个谷歌Sheet中重构给大家说明,我复制下面的代码。
function simulation() {
var thisSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var nameObj = {}
var nameArray = []
nameObj.name = thisSheet.getRange(2,1,3,1).getValues();
nameObj.number = thisSheet.getRange(2,2,3,1).getValues();
nameArray.push(nameObj);
var vendorObj = {}
var vendorArray = []
vendorObj.vendorName = thisSheet.getRange(2,4,3,1).getValues();
vendorObj.vendorNumber = thisSheet.getRange(2,5,3,1).getValues();
vendorArray.push(vendorObj);
for (var i = 1; i < vendorArray[0].vendorNumber.length + 1; i++) {
matchOnNumber(nameArray,vendorArray[0].vendorNumber[i - 1]);
}
}
function matchOnNumber(nameArray, vendorNumber) {
var thisSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
for (var i = 0; i < nameArray[0].name.length; i++) {
Logger.log("vendorNumber = " + vendorNumber + ", i = " + i + ", Matched against: " + nameArray[0].number[i]);
if (nameArray[0].number[i] == vendorNumber) {
var result = nameArray[0].number[i];
}
}
Logger.log("Result: " + result);
return result;
}