搜索匹配的单元格,然后将一个单元格复制到Google表格中的其他位置

时间:2020-07-30 07:18:07

标签: javascript google-apps-script google-sheets

我在电子表格中有两个不同的工作表,两个工作表都包含电子邮件。我正在尝试将3个单元格从工作表“ y”中的电子邮件所在的行移到工作表“ x”中该电子邮件相同的行。

示例: 电子邮件在D3的工作表“ y”上,同一电子邮件在F7的工作表“ x”上;然后,我想将单元格从工作表“ y”上的H3:K3复制(因为电子邮件在工作表“ y”上的第3行)到工作表“ x”上的L7:P7(因为同一封电子邮件在工作表的第7行中) “ x”)。

此外,我在工作表“ x”的R2中有此公式,在工作表“ y”的N2中有此公式,以告诉最后包含数据的行是什么,因此脚本仅扫描匹配的电子邮件,直到该行为止。我有分别引用这些单元格的变量“ finalRowV”和“ maxEmail”:

=COUNTIF(A1:A, "<>")

我不是JavaScript方面的佼佼者,但是我感觉自己编译了一个连贯的脚本(对我来说...),但是当我运行它时,什么也没发生:没有错误,但是数据没有移动。

function onOpen(e){

  function runIt(){
    var mainSheet = SpreadsheetApp.getActiveSpreadsheet();
    var workoutSheet = mainSheet.getSheetByName("x");
    var customerSheet = mainSheet.getSheetByName("y");

    var searchRow = 2;
    var searchLoc = "C" + searchRow;
    var copyLoc = "D" + searchRow + ":F" + searchRow;
    
    var maxEmail = customerSheet.getRange("N2").getValue();
    var found = 0;
    
    if (searchRow > maxEmail){
      
      if(found = 0){
        Logger.log("No match found");
      }
      else{
        endSearch();
      }
      
    }

    var finalRowV = workoutSheet.getRange("R2").getValue();
    var targetColumnV = "C2:C" + finalRowV;
    var targetColumn = workoutSheet.getRange(targetColumnV).getValues();
  
    var email = customerSheet.getRange(searchLoc).getValue();

    for (var i = 2; i < targetColumn[2].length; i++){
      
      if (targetColumn["C"][i].toString() == email.toString()){
        Logger.log("found the email " + targetColumn["C"][i] + " at cell" + searchRow + i);
        found++;
        searchRow++;
        
        var pasteLoc = "M" + i + ":O" + i;
        customerSheet.getRange(copyLoc).copyTo(workoutSheet.getRange(pasteLoc));
        
        runIt();
      }
      else {
        customerSheet.getRange(searchLoc).setBackground("red");
        i++;
        searchRow++;
        runIt();
      }
  
    }
    
  }
  
  function endSearch(){
  }
  
}

1 个答案:

答案 0 :(得分:1)

我发现很难复制您的代码,因此我只是根据您的问题提出了一个类似的方案,您也可以将其用于您的案例:

  function moveEmails() {
  
  ss = SpreadsheetApp.getActive();
  sx = ss.getSheetByName("x");
  sy = ss.getSheetByName("y");
  sx_size = sx.getLastRow();
  sy_size = sy.getLastRow();
  x_email = sx.getRange("F2:F"+sx_size).getValues().flat([1]);
  y_email = sy.getRange("D2:D"+sy_size).getValues().flat([1]);

  for (var i = 0 ; i < y_email.length ; i++ ) {  
  pos_found = x_email.indexOf(y_email[i]);
  if (pos_found > -1) {
  y_data = sy.getRange("H"+(i+2)+":K"+(i+2)).getValues();
  sx.getRange("L"+(pos_found+2)+":O"+(pos_found+2)).setValues(y_data);
  }
  }  
}

说明:

  • 我有两张纸:x,y,

  • x中的电子邮件在F列中,而y中的电子邮件在D列中,

  • 两个表中的
  • 列都有标题,这就是为什么范围从第二行开始的原因,

  • 检查y列表中的电子邮件是否匹配x列表中的电子邮件,

  • 如果有匹配项,因为您从4列复制数据,因此将相关数据从y(H:K)复制到x(L:0)。

您可以使用的概念:

您可以使用Google脚本方法:=COUNTIF(A1:A, "<>")来代替具有计算公式的sheet.getLastRow()来计算包含内容的最后一行。

最后,pos_found = x_email.indexOf(y_email[i])给出元素x_email在列表y_email[i]中匹配的位置。如果不匹配,则返回-1。

相关问题