0

我编写了一个脚本,根据每个单元格是否被确定为具有当前数据(在另一列中指定为 ALIVE),定期从一列复制数据,并将该数据放在不同工作表的另一列中。该脚本不会超过执行时间,但是我想知道是否有办法通过利用 Arrays 使其更快。

感谢您的帮助,我是 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);
  }
 }}
4

1 回答 1

1

二维数组中的转置非常简单。主要区别在于数据的索引方式:范围从 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
于 2013-07-11T22:26:32.107 回答