按索引将数组与数组索引匹配时,代码没有在最内部循环中执行 else 条件?


var amazon = activeSpreadsheet.getSheetByName('Amazon');
var lastRow1 = amazon.getLastRow();
var array1 = amazon.getRange('A2:A' + lastRow1).getValues();
var source = activeSpreadsheet.getSheetByName('ProductDetails');
var lastRow2 = source.getLastRow();
var array2 = source.getRange('B2:B' + lastRow2).getValues();
n = 2;
x = 0; // match
z = 0; // non-match
for (var i = 0; i < array2.length; i++){
for (var j = 0; j < array1.length; j++){
if (array2[i] !== array1[j]){
z = z + 1;
}
else {
x = 9999
}
}
newsheet.getRange([n],[5]).setValue(z);
newsheet.getRange([n],[6]).setValue(x);
if (z > x) {
newsheet.getRange([n],[1]).setValue(array2[i]);
n == n++;
z = 0;
x = 0;
}
else if (z < x) {
z = 0;
x = 0;
}
}

我的项目是用 GAS(谷歌应用程序脚本(编写的,本质上是出于所有意图和目的的 JS,在库中具有变化。

基本上,我正在获取 array2 中的一个元素,并通过循环将其传递以匹配 array1。对于每次不匹配时,它都会加 1,当它匹配时(如果它有任何匹配,则只匹配一次(,它存储一个任意的大数字(大于 array1 的长度(并比较它们。

如您所见,我已经写出以显示这些值,并且我总是得到z = 5183(array1的长度(和x = 0(意味着找不到不匹配项(。因此,即使数组 2 和 1 中存在某些内容,它也始终会将其写入单元格。

应该发生的是,如果存在匹配项,z= 5182 和 x= 9999(或任意大数(,并且由于 5182 <9999,它不执行任何操作。

我的范围有误吗?还是我没有正确编写 If/Else?还是别的什么?

您的代码在两个Array的元素之间执行严格的比较。一般来说,这很好。但是,对于这些特定的Array,这些元素也Arrays,这意味着严格(不(相等正在检查它们是否是内存中完全相同的数组对象。有关详细信息,请参阅此问题。

您可能想要进行基于值的比较,这意味着您需要比较该内部数组的特定元素(即再次索引(。if (array2[i][0] !== array1[j][0]) {...}将检查内部数组的第一个元素。

查看array1array2的实例化,我们看到这些确实是单列Ranges 的 2D 数组,因此每个内部数组中只有 1 个元素。您可以通过在读取这些数组时展平这些数组来降低所需的索引级别:

const array1 = sheet.getRange(...).getValues().map(function (row) { return row[0]; });
const array2 = ...;

我也不确定为什么要将数组传递给Sheet#getRange- 您应该以与应用程序脚本文档中详述的方法签名一致的方式传入 1-4 个参数。

请注意,有更好的算法来检查给定数组中是否存在值 - 重新扫描所有第二个数组以查找第一个数组的每个值。在提出有关如何改进算法的新问题之前,您应该对此主题进行彻底的研究。

最后,应实现使用批处理方法的最佳做法 - 当前在循环中调用setValue。考虑将要写入的结果存储在数组中,然后在循环完成后使用Range#setValues进行写入。关于这个主题,有许多问题可供您查看。

最新更新