我在同一个电子表格中有两张纸,称之为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() )
}
}
}
}
答案 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() )
如果这对你没用,请告诉我。我想修改。