javascript - 谷歌脚本说 - 超过最大执行时间

标签 javascript google-apps-script google-sheets

我正在使用下面的脚本从谷歌电子表格中删除重复的行。该脚本运行良好,但由于每天都在添加电子表格中的数据,现在该脚本抛出“超出最大执行时间”错误。由于我是脚本新手,所以我不明白我的问题是什么。

谁能帮我解决我的这个问题。

    function Deleteduplicates() {
  var SpreadSheetKey = "My key";
  var sheetD = SpreadsheetApp.openById(SpreadSheetKey).getSheetByName("Daily");
  var sheetW = SpreadsheetApp.openById(SpreadSheetKey).getSheetByName("Weekly");
  var dataD = sheetD.getDataRange().getValues();
  var dataW = sheetW.getDataRange().getValues();
  //Daily
  var newDataD = new Array();
  for(i in dataD){
    var row = dataD[i];
    var duplicate = false;
    for(j in newDataD){
      if(row.join() == newDataD[j].join()){
        duplicate = true;
      }
    }
    if(!duplicate){
      newDataD.push(row);
    }
  }
  //weekly
  var newDataW = new Array();
  for(i in dataW){
    var row = dataW[i];
    var duplicate = false;
    for(j in newDataW){
      if(row.join() == newDataW[j].join()){
        duplicate = true;
      }
    }
    if(!duplicate){
      newDataW.push(row);
    }
  }
  sheetD.clearContents();
  sheetW.clearContents();
  sheetD.getRange(1, 1, newDataD.length, newDataD[0].length).setValues(newDataD);
  sheetW.getRange(1, 1, newDataW.length, newDataW[0].length).setValues(newDataW);
}

最佳答案

从概念上讲,这应该会快很多。我没有在大型数据集上尝试过。第一个版本将使行按原样排序。第二个版本会更快,但会根据第一个文本的列从头到尾对行进行排序。

function Deleteduplicates() {
  var SpreadSheetKey = "My key";
  var ss = SpreadsheetApp.openById(SpreadSheetKey);
  var sheetD = ss.getSheetByName("Daily");
  var sheetW = ss.getSheetByName("Weekly");
  var sheets = [sheetD, sheetW];
  var toSs = {};
  for(s in sheets) {
    var data = sheets[s].getDataRange().getValues();
    for(i in data){
      // EDIT: remove commas from join("") for blank test
      data[i].unshift(data[i].join(""),(1000000 + i).toString());
      }
    data.sort();
    // remove blank rows -- Edit
    var blank = 0;
    while(data[blank][0].trim().length == 0) {blank++};
    if(blank > 0) data.splice(0, blank);
    // end Edit
    var len = data.length - 1;
    for(var x = len; x > 0; x-- ) {
      if(data[x][0] == data[x-1][0]) {
        data.splice(x, 1);
        };
      };
    for(i in data) {
      data[i].splice( 0, 1);
      };
    data.sort();
    for(i in data) {
      data[i].splice(0, 1);
      };
    toSs[sheets[s].getSheetName()] = data;
  };
  for(s in sheets) {
    var data = toSs[sheets[s].getSheetName()];
    sheets[s].clearContents();
    sheets[s].getRange(1, 1, data.length, data[0].length).setValues(data);
  }
}

更快地留下由 join() 排序的行以测试重复项

function Deleteduplicates() {
  var SpreadSheetKey = "My key";
  var ss = SpreadsheetApp.openById(SpreadSheetKey);
  var sheetD = ss.getSheetByName("Daily");
  var sheetW = ss.getSheetByName("Weekly");
  var sheets = [sheetD, sheetW];
  var toSs = {};
  for(s in sheets) {
    var data = sheets[s].getDataRange().getValues();
    for(i in data){
      // EDIT: remove commas from join("") for blank test
      data[i].unshift(data[i].join(""));
      }
    data.sort();
    // remove blank rows -- Edit
    var blank = 0;
    while(data[blank][0].trim().length == 0) {blank++};
    if(blank > 0) data.splice(0, blank);
    // end Edit
    var len = data.length - 1;
    for(var x = len; x > 0; x-- ) {
      if(data[x][0] == data[x-1][0]) {
        data.splice(x, 1);
        };
      };
    for(i in data) {
      data[i].splice( 0, 1);
      };
    toSs[sheets[s].getSheetName()] = data;
    };
  for(s in sheets) {
    var data = toSs[sheets[s].getSheetName()];
    sheets[s].clearContents();
    sheets[s].getRange(1, 1, data.length, data[0].length).setValues(data);
  }
}

根据 Henrique 的评论进行编辑。

已编辑 5/8:删除空白行(已标记 2 个已编辑区域)

关于javascript - 谷歌脚本说 - 超过最大执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30103857/

相关文章:

google-apps-script - 当我在 GAS 中出现 "sleep"时会发生什么? (执行时间限制解决方法)

google-apps-script - 提供 API key 以避免 Apps 脚本中的 map 服务出现命中限制错误

JavaScript。中缀到后缀

javascript - 如何使用 javascript 提取链接到某个页面的所有网页?

javascript - Three.js:边界框奇怪的行为

javascript - 获取select jquery的值

google-apps-script - onOpen() 不起作用 - 获取权限错误

javascript - 在附加 HTML 时执行 IF 语句的多个实例的更好方法?

python - 如何使用 python 将公式从一个 gsheet 复制到另一个 gsheet?

javascript - D3 Google Sheet Access-Control-Allow-Origin 错误