Google表格脚本 - 查找匹配的元组并在工作表之间复制数据

时间:2018-01-18 00:37:27

标签: google-apps-script google-sheets

我在同一个电子表格中有两张纸,称之为sheet1和sheet2。在每个工作表中,每行描述一些硬件组件及其属性。 sheet2的要点是最终替换过时的sheet1。

简单的例子,(实际纸张长达数百行):

sheet1:
componentId | prop1 | prop2 | prop3 | isvalid
---------------------------------------------
 1          | x1    | y1    | z1    | yes
 2          | x1    | y2    | z3    | yes
 3          | x2    | y1    | z1    | yes

sheet2:
componentId | quantity | prop1 | prop2 | prop3 | prop4 | isvalid
----------------------------------------------------------------
 15          | 4        | x1    | y1    | z1    |  w1   | TBD
 23          | 25       | x3    | y3    | z2    |  w1   | TBD
 33          | 3        | x1    | y2    | z3    |  w2   | TBD

已手动填充sheet1中的最后一列“isValid”。我想要做的是编写一个脚本,遍历sheet1,生成属性值的元组,然后在sheet2中查找匹配的属性值元组。如果匹配,我想将sheet1中的“isValid”字段复制到sheet2中的“isValid”字段。

到目前为止我所拥有的是以下内容,但我遇到错误“范围的坐标或尺寸无效” - 请参阅下面的代码中的注释,显示错误的位置。并且,整个事情感觉非常hacky。希望有人能指出我更好的方向吗?提前谢谢。

function arraysEqual(a, b) {
  if (a === b) return true;
  if (a == null || b == null) return false;
  if (a.length != b.length) return false;

  for (var i = 0; i < a.length; ++i) {
    if (a[i] !== b[i]) return false;
  }
  return true;
}

function copySheetBasedOnRowTuples(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName('sheet 1 name');
  var sheet2 = ss.getSheetByName('sheet 2 name');

  s2data = sheet2.getDataRange().getValues()
  s1data = sheet1.getDataRange().getValues()
  for( i in s1data ){
     sheet1Tuple = [ s1data[i][1], s1data[i][2], s1data[i][3] ] 

     // Now go through sheet2 looking for this tuple,
     // and if we find it, copy the data in sheet1 column 4
     // to sheet2 column 6 for the rows that matched (i and j)
     for ( j in s2data){
        sheet2Tuple = [ s2data[j][2], s2data[j][3], s2data[j][4] ]
        if ( arraysEqual(sheet1Tuple, sheet2Tuple) ){
          // ERROR HAPPENS HERE
          sheet2.getRange(j, 6).setValue( sheet1.getRange( i, 4 ).getValue() )
        }
     }
  }
}

1 个答案:

答案 0 :(得分:2)

错误的原因是数组和范围之间的起始编号。数组的索引从0开始。getRange()的行和列从1开始。那么这个修改怎么样?

来自:

sheet2.getRange(j, 6).setValue( sheet1.getRange( i, 4 ).getValue() )

致:

sheet2.getRange(j+1, 7).setValue( sheet1.getRange( i+1, 5 ).getValue() )

如果这对你没用,请告诉我。我想修改。