繁体   English   中英

Google Apps 脚本占用了太多时间,有没有办法减少运行时间?

[英]Google Apps Script is taking too much time, is there a way to reduce the runtime?

function dataManp() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var copySheet = ss.getSheetByName("My-Sheet-1");
  var pasteSheet = ss.getSheetByName("My-Sheet-2");
  var clearContentRange = pasteSheet.getRange("A1:Z100");
  clearContentRange.clearContent();

  var source = copySheet.getRange("a1:f100");

  var destination = pasteSheet.getRange("a1:f100");

  source.copyTo(destination, {formatOnly:true , contentsOnly:true});
  source.copyTo(destination,SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS,false);

  var rows = pasteSheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();

  var rowsDeleted = 0;
  for (var i = 0; i <= numRows - 1; i++) {
    var row = values[i];
    if (row[3] == '') {
      var deleteRowNum = (parseInt(i)+1) - rowsDeleted
      pasteSheet.deleteRow(deleteRowNum);
     // temp_array[i] = i
      rowsDeleted++;
    }
  }
  pasteSheet.deleteColumn(2)
}

你好,

我编写了以下脚本来执行以下操作,

  1. My-Sheet-1复制数据并粘贴到My-Sheet-2
  2. 删除与第 3 列中的空单元格对应的行。
  3. 在删除第 2 列之后

Rigthnow, My-Sheet-1仅包含 60 行和 20 行,脚本大约需要 7 秒才能完成。 但是将来行数可能会扩展到大约 1000 行。有没有办法优化上述代码,从而减少完成的时间

我的观察是,复制和粘贴数据只需几毫秒。 主要耗时的部分是操作,我在粘贴后在pasteSheet中执行。 如果我们可以将My-Sheet-1复制到临时变量(复制所有内容,包括公式、格式规范、值、文本等)并在临时变量中执行所有操作,然后将所有内容粘贴到临时变量中,这可能会有所帮助可变到所需的目标表。 但是,我不知道如何将工作表中的所有内容复制到临时变量中,而且我不确定这是否会减少时间。 如果我也能在这方面得到一些帮助,我会很高兴(即将工作表中的所有内容复制到临时变量,对变量执行操作,然后将变量中的数据粘贴到新工作表)

谢谢

编辑 - 1

想补充一点, My-Sheet-1包含混合数据(即数字、颜色格式的文本、某些单元格中的公式等)

解释:

deleteRow()每次执行需要一些时间,因此不建议在循环中使用数百行。

简单的答案是:

  1. 使用getValues()为 Sheet1 创建一个二维数组。
  2. 删除/过滤出数组元素,具体取决于第2行是否为空白。
  3. 使用setValues()将过滤后的数组写入 Sheet2。

示例代码:

function dataManp() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var copySheet = ss.getSheetByName("My-Sheet-1");
  var pasteSheet = ss.getSheetByName("My-Sheet-2");
  var lr = copySheet.getLastRow();
  var clearContentRange = pasteSheet.getRange(1,1,lr,26);
  clearContentRange.clearContent();

  var source = copySheet.getRange(1,1,lr,6);
  var destination = pasteSheet.getRange(1,1,lr,6);

  source.copyTo(destination, {formatOnly:true , contentsOnly:true});
  source.copyTo(destination,SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS,false);
  destination.clearContent();

  var values = source.getValues();

  var temp_array = [];
  for (var i = 0; i < lr; i++) {
    var rowValue = values[i];
    if (rowValue[2] != '') {
      temp_array.push(rowValue);
    }
  }

  var newDest = pasteSheet.getRange(1,1,temp_array.length,6)
  newDest.setValues(temp_array);
  pasteSheet.deleteColumn(2);
}

需要注意的是,您需要对列中的所有行使用相同的格式。

样本输入:

在此处输入图像描述

样品 Output:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM