删除重复项的Google脚本超出了处理时间

时间:2017-07-27 14:54:45

标签: javascript google-apps-script

我有一张包含10k +行数据的Google表格。虽然它应该很少见,但是可能会有重复数据输入到选项卡中,我编写了一个脚本来搜索和删除这些重复项。有一段时间,这个脚本运行良好,完全符合我的预期。但是现在该选项卡已经增长到超过1万行,脚本超过了6分钟的时间限制。

我已将此功能基于this tutorial

m_dir = New [String](m_dir.Where(Function(c) (Asc(c) >= 32) AndAlso (Asc(c) <= 175)).ToArray())

我想过将它分解成碎片;处理3个不同呼叫中每个呼叫的1/3数据。但这实际上是从一个不同的函数调用的,该函数通过电子邮件发送返回的deleteCount值,如果它大于0。

// remove duplicates on Ship Details Complete
function duplicateShipDetailsComplete() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheet = ss.getSheetByName("Shipment Details Complete");
  var sourceRange = sourceSheet.getRange(2, 1, sourceSheet.getLastRow(), 16)
  var sourceData = sourceRange.getValues();
  var keepData = new Array();
  var deleteCount = 0;

  for(i in sourceData) {  // look for duplicates
    var row = sourceData[i];
    var duplicate = false;  // initialize as not a duplicate
    for(j in keepData) {  // compare the current row in data to the rows in newData
      if(row[2] == keepData[j][2]  // duplicate Partner Invoice?
        && row[4] == keepData[j][4]  // duplicate vPO?
        && row[5] == keepData[j][5]  // duplicate SKU?
        && row[7] == keepData[j][7]) {  // duplicate qty?
        duplicate = true;  // only if ALL criteria are duplicate, set row as a duplicate
      }
    }
    if(!duplicate) {  // If the row is NOT a duplicate
      keepData.push(row);  // add to newData
    } else {
      deleteCount++;  // keep track of duplicates being deleted
    }
  }

  sourceRange.clear();
  sourceSheet.getRange(2, 1, keepData.length, keepData[0].length).setValues(keepData);  // paste the keepData into the Working sheet
  return deleteCount;
}

即使没有该电子邮件功能,当我直接调用duplicateShipDetailsComplete()时,它已超出限制。我想我可以编写三个不同的函数(第一个1/3,第二个1/3,第三个1/3)并在某个地方用每个结果更新一个单元格,然后分别调用电子邮件函数来获取该值。如果我可以编写1个函数并将参数传递给它,我会觉得好一点,但这都来自基于时间的触发器,你不能从那些传递parms。但在我开始这样做之前,我想我会检查是否有人就如何使现有代码更有效率提出其他建议。或者,看看是否有人对我如何做到完全不同。

由于

0 个答案:

没有答案