首页 > 解决方案 > 搜索匹配的单元格,然后将一个单元格复制到 Google 表格中的其他位置

问题描述

我在电子表格中有两个不同的工作表,它们都包含电子邮件。我正在尝试将 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(){
  }
  
}

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


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

  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 列表的电子邮件匹配,

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

您可以使用的概念:

您可以使用谷歌脚本方法,而不是使用计数公式=COUNTIF(A1:A, "<>")来计算最后一行的内容:sheet.getLastRow().

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


推荐阅读