Arrays 比较两个数组中的值会运行,但计算失败

Arrays 比较两个数组中的值会运行,但计算失败,arrays,google-apps-script,getvalue,Arrays,Google Apps Script,Getvalue,我花了整整两个工作日搜索论坛并对其进行了一般性的故障排除,但由于我对java比较陌生,这可能是一个新手违反基本原则的情况。如果这是真的,请原谅 上下文: 我编写的业务案例需要比较两个单独的Google电子表格文件之间的记录,非常像sql查询两个使用主键和外键的表。为了方便起见,将相应电子表格文件中的两个范围加载到单独的数组中,然后比较充当主键和外键的字段以进行匹配 问题: 代码运行时,根据我使用调试器观察到的情况,如果if语句要求值,则应该识别匹配项,但是if语句求值失败,因此没有识别出这样的匹

我花了整整两个工作日搜索论坛并对其进行了一般性的故障排除,但由于我对java比较陌生,这可能是一个新手违反基本原则的情况。如果这是真的,请原谅

上下文: 我编写的业务案例需要比较两个单独的Google电子表格文件之间的记录,非常像sql查询两个使用主键和外键的表。为了方便起见,将相应电子表格文件中的两个范围加载到单独的数组中,然后比较充当主键和外键的字段以进行匹配

问题: 代码运行时,根据我使用调试器观察到的情况,如果if语句要求值,则应该识别匹配项,但是if语句求值失败,因此没有识别出这样的匹配项。我已经尝试在运行代码时生成的日志中轻松地看到这一点(其中I=2,匹配值为32)

我检查了两个电子表格中比较字段的数据类型是否相同,并且在数组值为浮点数的情况下,我尝试了不同的比较运算符。此外,在使用[[],[]语法(而不是伴随的重构中使用的语法)声明数组之后,我尝试使用for循环加载数组。最后,我让IF语句只在函数的参数根本没有存储在数组中时才正确计算。然而,由于以下提到的限制,这是一个不令人满意的解决方案

约束条件: 如果大量调用服务器,那么消除数组使用的变通方法可能是不切实际的,就像我尝试使用单数getValue()方法(而不是复数getValue()方法)一次加载一个数组值时的情况一样。在随后的重建中不会观察到这种现象,因为两个用于比较的表格位于同一个文件中

此外,虽然加载到阵列中的两个系列在附带的重建中位于相邻列中,但它们不在我的实际用例中。因此,将两个getValues()方法合并为一个方法的任何变通方法也可能不切实际

成功会是什么样子: 当代码运行后,名为“return”的变量不再在日志中未定义时,则已识别并存储匹配项

补充材料: 这个问题的本质在中被重新构造以供您演示,我将复制下面的代码

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;
}
功能模拟(){
var thisheet=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);
对于(变量i=1;i
您可以通过更改

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

然后,结果将是
undefined
32
undefined
(如果23和100不在名称数组表的数据中,这是有意义的)

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

nameArray
包含一个元素(索引
0
),即
nameObj

nameObj.number
获得表的
getValues
结果。
这表面上是一个列向量,但就谷歌应用程序脚本而言,它是一个3x1矩阵。

要访问实际值,您需要引用该行,然后为唯一可用的列编制索引。

您可以通过更改

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

然后,结果将是
undefined
32
undefined
(如果23和100不在名称数组表的数据中,这是有意义的)

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

nameArray
包含一个元素(索引
0
),即
nameObj

nameObj.number
获得表的
getValues
结果。
这表面上是一个列向量,但就谷歌应用程序脚本而言,它是一个3x1矩阵。

要访问实际值,您需要引用行,然后为唯一可用的列编制索引。

那么您在日志中看到了什么?欢迎来到Stackoverflow。问得好!那么您在日志中看到了什么?欢迎来到Stackoverflow。问得好!