簡體   English   中英

比較兩個列中的兩列A,並使用Google Apps腳本在表單1中生成唯一值

[英]Compare two columns A in two sheets and generate unique values in sheet 1 using Google Apps Script

我有兩張紙,上面有十幾列和幾千行。 每個工作表都有一個包含唯一ID的列A. 我想比較僅使用A列作為比較點的兩張紙,並生成第三張紙,其中包含具有Sheet 1中唯一ID但不在Sheet 2中的唯一ID的整個行。

這是一個可視化:

Sheet 1
+---+--------+-----+-----+
|   |   A    |  B  |  C  |
+---+--------+-----+-----+
| 1 | 1111   | xxx | zzz |
| 2 | 2222   | yyy | zzz |
| 3 | 2222-1 | zzz | xxx |
| 4 | 3333   | xxx | yyy |
+---+--------+-----+-----+
Sheet 2
+---+------+-----+-----+
|   |  A   |  B  |  C  |
+---+------+-----+-----+
| 1 | 1111 | xxx | zzz |
| 2 | 2222 | yyy | zzz |
| 3 | 3333 | xxx | yyy |
+---+------+-----+-----+

所需的函數將使用A作為基礎比較表1和表2,函數將指出單元格sheet1 [A2]是唯一的,它將復制整個2:2行,然后它將它粘貼到一個新的生成的表格。 相比之下,B和C的含量無關緊要。

我想創建一個循環來比較兩個工作表中A列中的每個單元格,如果是sheet1.A [n]!= sheet2.A [n],但只有當兩個工作表具有相同的長度時它才會起作用。

在我上面指定的情況下,我在用戶Cooper的幫助下創建的循環發現第3行是唯一的,之后由於未對齊,所有內容都將是唯一的。

紙張將始終具有不同的長度,並且唯一身份可能出現在不同的位置(即,2222-1可能在下一次我在第5行進行比較時結束)。

function compareSheetDrop(input) {

var ss = SpreadsheetApp.getActiveSpreadsheet();

//establish first sheet and get its data range
var dropSheet = ss.getSheetByName("Drop (2)");
var dropRange = dropSheet.getRange(2, 1, dropSheet.getLastRow() - 1, dropSheet.getLastColumn());
var vA1 = dropRange.getValues();

//establish the sheet with new data and get its data range
var compareSheet = ss.getSheets()[4];
var compareRange = compareSheet.getRange(2, 1, compareSheet.getLastRow() - 1, compareSheet.getLastColumn());
var vA2 = compareRange.getValues();

//establish the sheet with results
var resultSheet = ss.getSheetByName("ADQA");

for (var i = 0; i < vA1.length; i++) {

//i've tried to make the loop stop once it encounters a blank cell to avoid a type error, but doesn't work
    if (vA2[i][0] === '' || vA1[i][0] === '') {
        break;
        }

    else if (vA1[i][0] != vA2[i][0]) {
    Logger.log(vA1[i][0] + " & " + vA2[i][0]);
            resultSheet.appendRow(vA2[i]);
        }
    }
}

即使我的代碼沒有提供我想要的結果,它也有兩個問題:它循環直到出現TypeError: Cannot read property "0" from undefined. 我試圖打擊但無濟於事。

此外, appendRow方法不會在現有單元格中寫入數據,而是在已存在的單元格之前插入行 - 在運行我的測試腳本3次后,結果表有數千列並且幾乎無法操作。

任何想法如何修改我現有的代碼以獲得我想要的,同時避免上述問題? 還是需要一種全新的方法? 有什么建議么?

流:

  • 使用Array#map獲取Array#map所有sheet1 col A(比如說a )。
  • 使用Array#filter按上面的數組過濾sheet2。
  • 直接在setValues()中使用過濾后的數組

片段:

 var a1 = [[1,'x','z'],[2,'y','z'],[3,'m','z'],['2-1','x','z']];//sheet1ValuesArr var a2 = [[1,'x','z'],[2,'y','z'],[3,'m','z']];//Sheet2ValuesArr var a = a2.map(function(e){ return e[0]}); //Sheet2Col A : [1,2,3] var filteredArr = a1.filter(function(e){return !~a.indexOf(e[0])}); console.log(filteredArr); //to use in setValues 

resultSheet.getRange(1, 1, filteredArr.length, filteredArr[0].length).setValues(filteredArr)

參考文獻:

暫無
暫無

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

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