簡體   English   中英

搜索匹配的單元格,然后將一個單元格復制到 Google 表格中的其他位置

[英]Search for matching cells then copy one cell to a different location in Google Sheets

我在電子表格中有兩個不同的工作表,它們都包含電子郵件。 我正在嘗試將 3 個單元格從 email 在工作表“y”上的行移動到相同 email 在工作表“x”上的行。

示例: email 在 D3 的工作表“y”上,同樣的 email 在 F7 的工作表“x”上; 然后我想將單元格從工作表“y”上的 H3:K3(因為 email 在工作表“y”上的第 3 行)復制到工作表“x”上的 L7:P7(因為相同的 email 在工作表上的第 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(){
  }
  
}

我發現很難重現您的代碼,因此我只是根據您的問題制作了一個類似的場景,您也可以將其用於您的案例:

  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 列中,

  • 兩張表中的列都有 header,這就是范圍從第二行開始的原因,

  • 檢查 y 列表中的 email 是否與 x 列表中的 email 匹配,

  • 如果存在匹配,則將相關數據從 y(H:K) 復制到 x(L:0),因為您從 4 列復制數據。

您可以使用的概念:

您可以使用 google 腳本方法: sheet.getLastRow() ,而不是使用計數公式=COUNTIF(A1:A, "<>")來計算最后一行的內容。

最后, pos_found = x_email.indexOf(y_email[i])給出了列表x_email中與元素y_email[i]匹配的元素的 position。 如果沒有匹配,則返回 -1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM