![](/img/trans.png)
[英]Google Apps Script - Compare two sheets for changes by column names instead of hardcoded ranges
[英]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。 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.