通过数组/缓存减少执行时间的代码???谷歌应用脚​​本

问题描述

我正在使用以下代码来编译从 Twitter 推文列表中分离出来的 hastag 列表。

代码忽略主题标签单元格没有值或错误值的所有行。

function copyProcessedHashtags() {

  var sSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheet = sSheet.getSheetByName("SortedIntoRows");
  var targetSheet = sSheet.getSheetByName("HashtagsList");
  var lastRow = sourceSheet.getLastRow();
  
  for (var i = 3; i <= lastRow; i++) {
    var cell = sourceSheet.getRange("E" + i);
    var val = cell.getValue();
      if (val != "") {
      if (val != "#VALUE!") {
      if (val != "#REF!") {

        var sourceRange = sourceSheet.getRange("B" + i + ":" + "E" + i);    
        var targetRow = targetSheet.getLastRow();
        targetSheet.insertRowAfter(targetRow+1);
        var targetRange = targetSheet.getRange("B" + (targetRow+1));
        sourceRange.copyTo(targetRange,{contentsOnly: true});
  }}}}}
};

问题是有时会有数千行,执行时间超过 6 分钟。

我知道批处理可以减少执行时间...

示例

for (var i = 1; i <= 100; i++) {
  SpreadsheetApp.getActiveSheet().deleteRow(i);

to

SpreadsheetApp.getActiveSheet().deleteRows(i,100);

...我只是不知道如何重写我的代码以这种方式工作。

对于谷歌应用脚​​本来说还是很新的。

如果有人能给我一个正确方向的推动,我将非常感谢您的帮助。

谢谢!!

解决方法

您可以使用 getValues() 检索范围内的所有数据并使用 Array.filter() 对其进行过滤。

示例:

代码:

function CopyProcessedHashtags() {

  var sSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheet = sSheet.getSheetByName("SortedIntoRows");
  var targetSheet = sSheet.getSheetByName("HashtagsList");
  
  var data = sourceSheet.getDataRange().getValues();
  var filteredData = data.filter(dataRow => (dataRow[4] != "#VALUE!" && dataRow[4] != "#REF!" && dataRow[4] != ""));
  targetSheet.getRange(1,1,filteredData.length,filteredData[0].length).setValues(filteredData);
}

示例数据:

enter image description here

输出:

enter image description here

参考: