簡體   English   中英

在比較兩張表中的兩列時,無法復制多個值以獲取Google Apps腳本中的差異

[英]Can't copy more than one value when comparing two columns in two sheets for differences in Google Apps Script

我正在使用Google Apps腳本創建一個腳本,該腳本可以在包含唯一ID的特定列中逐行比較電子表格中的兩個工作表。 如果Sheet(1)中的A [i]與Sheet(2)中的A [i]不同,我希望將具有該單元格的整行復制到新工作表中。 床單真的很大,幾千行。

到目前為止,當腳本復制一次值然后繼續循環而沒有進一步的結果時,我已經達到了一個目的。 此外,它需要很長時間,我懷疑這可能是非常次優的。 我在Google Apps腳本中進行調試非常困難,而且我很有智慧。 這是我到目前為止所做的和我的評論。

function compareSheetDrop(input) {

    var ss = SpreadsheetApp.getActiveSpreadsheet();

    //create a new blank sheet where the output will be stored
    ss.insertSheet(5);

    /*create references to sheets used by the script. 
    dropSheet is the sheet used as a basis, 
    compareSheet is a sheet possibly containing new values, 
    resultSheet is the blank sheet that will store new values
     */
    var dropSheet = ss.getSheetByName("Drop (2)");
    var compareSheet = ss.getSheets()[4];
    var resultSheet = ss.getSheets()[5];

    /*loop over the entire dropSheet and look for differences. 
The sheets have header rows*/
    for (var i = 2; i <= dropSheet.getLastRow(); i++) {

        /*variable j will represent the row number 
        where the difference will be pasted to 
        resultsSheet.A[j] etc.*/
        var j = 1;

        /*establish references to the cells 
        that will be used for comparison 
        (i.e. A[i] in dropSheet, A[i] in compareRange)*/
        var dropRange = dropSheet.getRange(i, 1);
        var compareRange = compareSheet.getRange(i, 1);

        /*establish references to the row 
        that will be copied from compareSheet 
        and to the row that 
        will be the destination in resultsSheet*/
        var resultRange = resultSheet.getRange(j, 1);
        var entireRow = compareSheet.getRange(i, 1);

        /*check if the unique value of 
        cell dropSheet.A[i] is different from 
        compareSheet.A[i] and whether they are not blanks. 
        If they are different, 
        copy entire row from compareSheet to the resultsSheet*/
        if (dropRange.getValues()[0] !== compareRange.getValues()[0] && dropSheet.getRange(i, 1).isBlank() == false && compareSheet.getRange(i, 1).isBlank() == false) {
            j++;
            entireRow.copyTo(resultRange, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
        }
    }
}

我希望resultSheets在compareSheet中沒有dropSheet中存在的行,但是在一行中我得到一個單元格A1填充,然后在腳本仍在運行時沒有任何反應。 我懷疑問題可能在循環本身和copyTo中,但我找不到原因。

如果只比較每個工作表的第一列,則可以使用getSheetValues(startRow, startColumn, numRows, numColumns)方法獲取值,而無需相互檢查每個單元格。 當你拿到床單時,你應該得到這樣的:

var dropSheet = ss.getSheetByName("Drop (2)").getSheetValues(1,1,x,1);
var compareSheet = ss.getSheets()[4].getSheetValues(1,1,x,1);

其中x是每張紙上的行數。 這樣可以獲得工作表中所有值的兩個數組。 迭代這些來檢查不同的行應該更容易,然后你可以使用你找到它們的索引來獲取resultSheet中行的范圍來編輯它並插入你想要的行。

這個問題就如何獲得行的范圍有一個很好的例子: Google腳本選擇Google電子表格中的整行

如果對方法有任何疑問,請鏈接到電子表格文檔: https//developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getsheets

嘗試這個:

function copyRowWhenAsDontMatch() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Sheet1');
  var rg1=sh1.getRange(2,1,sh1.getLastRow()-1,sh1.getLastColumn());
  var vA1=rg1.getValues();
  var sh2=ss.getSheetByName('Sheet2');
  var rg2=sh2.getRange(2,1,sh2.getLastRow()-1,sh2.getLastColumn());
  var vA2=rg2.getValues();
  var sh3=ss.getSheetByName('Sheet3');//rows that dont match in sheet1
  sh3.clear();
  var sh4=ss.getSheetByName('Sheet4');//rows that dont match in sheet2
  sh4.clear();
  for(var i=0;i<vA1.length;i++) {
    if(vA1[i][0]!=vA2[i][0]) {
      sh3.appendRow(vA1[i]);
      sh4.appendRow(vA2[i]);
    }
  }
}

暫無
暫無

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

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