javascript - 比较 2 个不同电子表格中的 2 个数组,并将其补码写入第二个电子表格

标签 javascript arrays google-apps-script google-sheets

我正在从主文档中提取数据。我正在使用 =IMPORTRANGE 解决方案,但注意到当有人过滤主文档时,它也会更改我的第二个电子表格(这是一个问题,因为有几列我正在输入附加数据)。

我想编写一个脚本:

  1. 将电子表格 1 范围内的所有信息放入数组中
  2. 将电子表格 2 中某个范围内的现有信息放入不同的数组中
  3. 检查第一个电子表格中第二个电子表格中没有的新增内容
  4. 然后将该信息添加到第二个电子表格中。这是我到目前为止所得到的...

这是first spreadsheetsecond spreadsheet .

function importNewData() {
  var dataFrom = SpreadsheetApp.openById("1bUDzevRV1urlndILAAfJBXcnh-Isy_oEJleV9OlLZ8o").getRange("A2:A200").getValues();
  var dataTo = SpreadsheetApp.getActiveSheet().getRange("B2:B200").getValues(); //first row is just headers, so we start on 2
  var newData = new Array (); 

  var dataFromLastRow = 0;
  var dataToLastRow = 0;

  for (var i in dataFrom){ //finds the last row by assuming the row before the first blank row "" is the last row
    dataFromLastRow = i;
    if(dataFrom[i][0]==""){break}
  }

  for (var j in dataFrom){
    dataToLastRow = j;
    if(dataTo[j][0]==""){break}
  }

  dataFrom.length = dataFromLastRow; //sets array to just the cells that have data
  dataTo.length = dataToLastRow;

  for(k=0; k<dataFrom.length; k++) {
    for(l=0; l<dataTo.length; l++) {
      if(dataFrom[k][0] !== dataTo[l][0]) {
        // the extra square brackets will make it a 2D array, 
        // aligning it vertically -- code from Jacob Jan Tuinstra
        newData.push([dataFrom[k][0]]);
      }
    }
  }

var toPaste = SpreadsheetApp.getActiveSheet().getRange(2+dataToLastRow,2,newData.length);
  toPaste.setValues(newData);

}

首先,如果第二个电子表格范围为空,则显示

"The coordinates or dimensions of the range are invalid. (line 43, file "Code")."

我猜这是因为 newData 没有显示为零,而是什么都没有。所以就是这样...

for 循环中的 for 循环似乎将唯一条目推送两次,将非唯一条目推送一次...不确定我应该在此处更改为仅推送唯一条目并且只执行一次。如果第二个范围有 3 个条目,则它会执行 3 次唯一条目,而其他条目则执行 2 次。

最后,在我们写回电子表格的最后一点,它将 2 和 dataToLastRow 变量连接起来,而不是相加。我觉得我在这里遗漏了一些非常明显的东西。

另外,如果效率低下,甚至是风格错误,请告诉我,因为我正在努力更好地学习 JS。

最佳答案

First of all, if the second spreadsheet range is empty, it says "The coordinates or dimensions of the range are invalid. (line 43, file "Code")." I'm guessing this is because newData isn't showing as zero, but as nothing. So there's that...

如果脚本找不到任何要写入第二个工作表的数据,即没有任何值不在 CopyTo 中时,就会发生这种情况。
然后,当 GAS 需要写入数组的数组时,它会尝试将数组写入某个范围(即使它只是 [[]])。

The for loop within a for loop seems to be pushing unique entries twice, and non-unique entries once...

每当循环在 dataTo 中发现一行不等于您当前正在检查的值时,它就会将其添加到 newData 中。
尝试循环遍历第二个数组,当您发现条目时,将 inCopyTo 变量设置为 truebreak(如果它完全遍历并且) inCopyTofalse 然后将该行添加到 newData

未测试:

for(k=0; k<dataFrom.length; k++) {
    var inArray = false;
    for(l=0; l<dataTo.length; l++) {
      if(dataFrom[k][0] === dataTo[l][0]) {
        inArray = true;
        break;
      }
    }
    if(!inArray) {
      newData.push([dataFrom[k][0]]);
    }
  }

Finally, on the last little bit where we write back to the spreadsheet, it's concatenating the 2 and the dataToLastRow variable instead of adding them. I feel like there's something really obvious that I'm missing here.

数组是对象的特殊情况。每个键(数组的索引)始终是一个字符串。您需要首先使用 parseInt(dataToLastRow) 将其转换为整数。

关于javascript - 比较 2 个不同电子表格中的 2 个数组,并将其补码写入第二个电子表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35616542/

相关文章:

javascript - 从 aspx 页面中提取 svg 元素的代码?

javascript - 了解测试中的过滤器注入(inject)

python - 从列表中查找矩阵中的字符串元素

objective-c - 将对象从数组添加到字典

google-apps-script - 自动化 Google 幻灯片制作

javascript - 禁用 "remove on backspace"(或完全删除 ibeam)

c++ - [] 运算符如何工作?

amazon-web-services - Google 脚本 HMAC 加密的二进制输出

javascript - getBody 在 Apps 脚本中始终返回 null,即使我认为应该这样编写

javascript - mysqli_fetch_array --> 根据 2 个输入字段更新输入