我编写了一个脚本来定期从一列复制数据,具体取决于是否确定每个单元格都有当前数据(在另一列中指定为ALIVE),并将该数据放在另一列中的另一列中。该脚本不会超过执行时间,但我想知道是否有办法通过使用数组使其更快。
我感谢您的帮助,我是Google Apps脚本编程的新手,但仍在插件中。非常感谢您的建议。
function copyFunctionDATA() {
var defSheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(DATA)")
var defSheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(DATAdead)")
var numLastRow = 60
for (var x=11; x<=numLastRow; x++) {
var srcRange = defSheet1.getRange(x,1);
var srcRange2 = defSheet1.getRange(x,1);
var value = srcRange.getValue();
var value2 = srcRange2.getValue();
if (value2.indexOf("ALIVE") !== -1) {
defSheet2.getRange(x,1).setValue(value);
}
}}
答案 0 :(得分:1)
在2D数组中转置非常简单。主要区别在于数据的索引方式:范围从1开始计数,数组从0开始计算。
因此,要转换代码,您应该获得2个数组(每个工作表一个)并迭代相应的单元格,根据您的条件更改值,并将数组写回电子表格以进行更新。
以下是您的代码的粗略转置,并附有几条注释来解释:(为了清晰起见,某些变量应该重命名)
function copyFunctionDATA() {
var defSheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(DATA)").getDataRange().getValues();// read the whole sheet in a 2D array
var defSheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(DATAdead)").getDataRange().getValues();// read the whole sheet in a 2D array
var numLastRow = 59 ; // I suppose you intentionally limit to the 60 first rows ?
for (var x=10; x<=numLastRow; x++) { // starting from row 11 >> becomes 10
var value = defSheet1[x][0];
var value2 = defSheet1[x][0]; // you made a mistake in your code : you define 2 identical ranges !! change it to your need : 0 is column A, 1 is B etc...
if (value2.indexOf("ALIVE") !== -1) {
defSheet2[x][0] = defSheet1[x][0];
}
}
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(DATAdead)").getRange(1,1,defSheet2.length,defSheet2[0].length).setValues(defSheet2);// write back defSheet2 array to sheet (DATAdead)
}
编辑:如果您只想覆盖defSheet2中的第一列,只需更改此工作表的范围定义,例如:
var defSheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(DATAdead)").getRange('A1:A').getValues();// read the whole sheet in a 2D array