使用阵列缩短Google Apps脚本的执行时间?

时间:2013-07-11 21:36:22

标签: google-apps-script

我编写了一个脚本来定期从一列复制数据,具体取决于是否确定每个单元格都有当前数据(在另一列中指定为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);
  }
 }}

1 个答案:

答案 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