繁体   English   中英

减少脚本执行时间 - Google 脚本

[英]Reduce script execution time - Google script

我制作了一个可以正常工作的脚本(按我的意愿行事),但是,它非常缓慢,按照这种速度,它将在大约 20 天内完成。 我等不及 20 天了,而且我还不够好,无法自己让它更快。

以下是任务的简要说明: Masterlist - 这是一个包含 23 列和 29000 多行的工作表。 种子- 这是一张空表,我要将 Masterlist 复制到其中。 重复- 这是一张空表,我将在其中存储任何重复的行。

过程:从Masterlist中获取第一行。 检查行是否已经在种子中。 如果行不在种子中,请添加行。 如果行已在种子中,则将行添加到重复项。 无论哪种方式,从 Masterlist 中删除原始行。

重复的定义:每一行都有一个电子邮件列。 列可以是单个电子邮件地址,也可以是由“;”分隔的多个电子邮件地址。 如果在 Masterlist 的行内找到电子邮件并且已存在于 Seed 的行内,则整行被视为重复。

例子:

“aaa@gmail.com”不是“a@gmail.com;aa@gmail.com”的重复

“bbb@gmail.com”是“b@gmail.com; bbb@gmail.com”的副本

此外,如果主列表中的电子邮件单元格为空,则不会将其视为重复项。

这是我的代码 - 它有效但不够快。

function getSheet(name){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(name);
  return sheet;
}

function getRowByID(sheet, rowID) {
  var range = sheet.getRange(rowID, 1, 1, 23);
  var value = range.getValues();
  return [range, value];
}

//main executes the entire thing
function main(){
  var sourceSheet = getSheet('Masterlist');
  var targetSheet = getSheet('Seed');
  var remainingSheet = getSheet('Duplicates');
  var counter = sourceSheet.getLastRow();
  var start = new Date();

  while(counter >= 2){
    var sourceLine = getRowByID(sourceSheet, 2)[1];
    var duplicates = checkEmailMatch(sourceLine, targetSheet);

    if(duplicates == 0){
      targetSheet.appendRow(sourceLine[0]);
      sourceSheet.deleteRow(2);
    }
    else{
      remainingSheet.appendRow(sourceLine[0]);
      sourceSheet.deleteRow(2);
    }
    counter--;
  }
}

//iterates through existing lines in the Seed sheet (locates the email cell and reads its contents)
function checkEmailMatch(row, seed){
  var sourceEmail = row[0][7];
  var counter = seed.getLastRow();
  var result = [];

  if(!counter){
    return 0;
  }
  else{
    var j = 0;
    var i = 2;
    for(i; i <= counter; i++){
      var seedLine = getRowByID(seed, i)[1];
      var seedEmail = seedLine[0][7];
      if(!seedEmail){}
      else if(compareEmails(seedEmail, sourceEmail) == true) {
        result[j] = i; 
        j++;
      }
  }
  return result;
}
}

//Compares each email in Masterlist ("; " separated) with each email in Source ("; " separated) 
function compareEmails(emailSeedCell, emailSourceCell){
  var seedEmails = emailSeedCell.split("; ");
  var sourceEmails = emailSourceCell.split("; ");
  for(var i = 0; i < seedEmails.length; i++){
    for(var j = 0; j < sourceEmails.length; j++){
      if(seedEmails[i] == sourceEmails[j]) return true;
    }
  }
  return false;
}

请帮助我 - 如果您需要任何其他信息,我很乐意提供! 请注意,这是我有史以来的第三个脚本,因此欢迎任何反馈!

感谢所有提供帮助的人,我设法想出了这段代码,将执行时间减少了 10000 多次! 谢谢大家 - 这是代码:

function sheetToArray(name){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(name);
  var counter = sheet.getLastRow();
  var columns = sheet.getLastColumn();
  var array = sheet.getRange(2, 1, counter, columns).getValues();
  return array;
}

function compareEmails(emailSeedCell, emailSourceCell){
  var seedEmails = emailSeedCell.split("; ");
  var sourceEmails = emailSourceCell.split("; ");
  var result = false;
  for(var i = 0; i < seedEmails.length; i++){
    for(var j = 0; j < sourceEmails.length; j++){
      if(seedEmails[i] == sourceEmails[j]) result = true;
    }
  }
  return result;
}

function save2DArrayToSpreadsheet(name, array){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(name);
  sheet.getRange(2, 1, array.length, array[0].length).setValues(array);
}

function main(){
  var masterArray = sheetToArray('Masterlist');
  var seedArray = [];
  var duplicateArray = [];

  for(var i = 0; i < masterArray.length; i++){
    Logger.log(i);
    if(!seedArray.length){
      seedArray.push(masterArray[i]);
    }
    else if(!masterArray[i][7]){
      seedArray.push(masterArray[i]);
    }
    else{
      var result = false;
      for(var j = 0; j < seedArray.length; j++){
        if(compareEmails(seedArray[j][7], masterArray[i][7]) == true){
          result = true;
        }
      }
      if(result == true){
          duplicateArray.push(masterArray[i]);
        }
        else{
          seedArray.push(masterArray[i]);
      }
    }
  }
  
  save2DArrayToSpreadsheet("Seed", seedArray);
  save2DArrayToSpreadsheet("Duplicates", duplicateArray);
}

暂无
暂无

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

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