1

我花了整整两个工作日搜索论坛并对其进行一般故障排除,但由于我对 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;
}
4

1 回答 1

0

您可以通过更改来解决此问题

if (nameArray[0].number[i] == vendorNumber)

if (nameArray[0].number[i][0] == vendorNumber)

结果将是undefined,32undefined(考虑到 23 和 100 不在 Name Array 的数据表中,这是有道理的。

这是因为getValues()总是返回一个由行和列组成的二维数组,以明确数据的布局。

nameArray包含一个元素(索引0),即nameObj.
nameObj.number被分配getValues表的结果。
这表面上是一个列向量,但就 Google Apps 脚本而言,它是一个 3x1 矩阵。
要访问实际值,您需要引用该行,然后0为唯一可用的列建立索引。

于 2016-09-16T07:23:23.163 回答