比较来自2个不同电子表格的2个数组,并将其补码写入第2个电子表格

时间:2016-02-25 01:25:17

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

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

我想写一个脚本:

  1. 将所有信息放在从电子表格1到数组
  2. 的范围内
  3. 将电子表格2中范围内的现有信息放入不同的数组
  4. 检查第二个电子表格中第一个电子表格中的新内容
  5. 然后将该信息添加到第二个电子表格中。这是我到目前为止所得到的......
  6. 这里是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);
    
    }
    

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

      

    &#34;范围的坐标或尺寸无效。 (第43行,文件&#34;代码&#34;)。&#34;

    我猜这是因为newData没有显示为零,但没有显示。那就是......

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

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

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

1 个答案:

答案 0 :(得分:0)

  

首先,如果第二个电子表格范围为空,则表示“The   范围的坐标或尺寸无效。 (第43行,档案   “代码”)。“我猜这是因为newData没有显示为零,   但没什么。那就是......

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

  

for循环中的for循环似乎是在推送唯一条目   两次,非唯一的条目一次......

每当循环在dataTo中找到一行不等于您当前正在检查的值时,它就会将其添加到newData
尝试循环遍历第二个数组,当您发现条目设置inCopyTo变量为truebreak时,如果它完全遍历且inCopyTofalse < em>然后将行添加到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]]);
    }
  }
  

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

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