【问题标题】:Comparing values from two arrays runs but fails to evaluate比较来自两个数组的值运行但无法评估
【发布时间】:2017-01-24 02:12:10
【问题描述】:

我花了整整两个工作日在论坛上搜索并排除故障,但由于我对 java 比较陌生,这可能是新手违反基本原理的情况。如果属实,请见谅。

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

问题: 代码运行,根据我使用调试器观察到的情况,如果要评估 IF 语句,则应该识别匹配,但 IF 语句无法评估,因此没有识别出这样的匹配。我试图让您在运行the accompanying reconstruction 中的代码时生成的日志中更容易看到这一点(其中 i = 2,匹配值为 32)。

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

约束: 消除数组使用的变通办法如果激增对服务器的调用可能是不切实际的,就像我尝试使用单数 getValue() 方法(相对于复数 getValues() 方法)将数组加载到一个值时的情况一样时间。在伴随的重建中不会观察到这种现象,因为用于比较的两个表在同一个文件中。

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

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

补充材料: 这个问题的本质在this Google 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;
}

【问题讨论】:

  • 那么你在日志中看到了什么?
  • 欢迎来到 Stackoverflow。一个很好的问题!

标签: arrays google-apps-script getvalue


【解决方案1】:

你可以通过改变来解决这个问题

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

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

然后结果将是 undefined32undefined(这是有道理的,因为 23 和 100 不在名称数组的数据表中。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多