当前有一个工作脚本,用于将单元格格式和值同步到另一个电子表格。我知道它很粗糙而且已经准备好了,但是可以用!我不喜欢For循环中有数字来获得正确的单元格编号...但是,这需要从单行9列转到目标电子表格9乘1列。>
与同事交谈后,反馈是运行将会非常缓慢。我已将其重写为9 If语句,但问题是在其上拖动单元格时只会更新第一个单元格,而不是范围。
不幸的是,这里有copyTo函数,仅在单个电子表格中有效。
总体速度并不重要,有其他选择吗?
// for loop to populate all cells
for (let i = 21; i < 30; i++){ // starts at volumn V (22) for 9 columns (21 to 30)
var activeCell = registerSheet.getRange(activeRow, i + 1, 1, 1); // Register column, i + 1 so it increases
var registerValue = activeCell.getValue(); // get cell value
var registerFormat = activeCell.getBackground(); // get cell format
var i2 = 'C' + (33 + i) // this increases the target cell range from C54 to C62 using the loop. 54 (start row on form) - 21 (start i value) = 33
var range = form.getRange(i2); // designate target cell
range.setValue(registerValue); // set target cell value
range.setBackground(registerFormat); // set target cell format
}
}
答案 0 :(得分:1)
您的代码确实效率低下,因为您正在调用setValue()
和setBackground()
9
次,只要您可以简单地使用
setValues()
和setBackgrounds()
改为一次。对于大量的迭代,它将变得效率更低。
您需要做一点技巧,就是将(nrows,ncolumns)
返回的getRange(activeRow,22,1,9).getValues()
形状为(1,9)
的数据(9,1)
转换为{{1 }},并对背景颜色也做同样的事情:
var rowValues=registerSheet.getRange(activeRow,22,1,9).getValues().flat().map(r=>[r]); // V:AD
var rowBackcolors = registerSheet.getRange(activeRow,22,1,9).getBackgrounds().flat().map(r=>[r]); // V:AD
之后,您只需将数据直接设置到目标表即可:
var range = form.getRange('C54:C62'); // C54:C63
range.setValues(rowValues);
range.setBackgrounds(rowBackcolors);
用以下代码替换for循环:
var rowValues=registerSheet.getRange(activeRow,22,1,9).getValues().flat().map(r=>[r]); // V:AD
var rowBackcolors = registerSheet.getRange(activeRow,22,1,9).getBackgrounds().flat().map(r=>[r]); // V:AD
var range = form.getRange('C54:C62'); // C54:C63
range.setValues(rowValues);
range.setBackgrounds(rowBackcolors);
What does the range method getValues() return and setValues() accept?