2014-11-04 119 views
1

下面的代碼來自此post有關將行值複製到新工作表的答案(如果它存在於其他工作表中)。如果存在於另一個工作表中,則刪除超過一個工作表中的行值

現在,如果不是將重複值複製到工作表3中,而是將它們從工作表1和工作表2中刪除(如果它存在工作表3中)。使用相同的spreadsheet,我有3個工作表。在前兩張紙上將比較的唯一值是第一列「ID NUMBER」。

給出的值,784 | John Steep | I.T Department,它存在於所有3個片材,在同一行的值應在表1和2中被刪除,並保持在表3.

function copyRowtoSheet3() { 
    var s1 = SpreadsheetApp.openById("ID").getSheetByName('Sheet1'); 
    var s2 = SpreadsheetApp.openById("ID").getSheetByName('Sheet2'); 
    var s3 = SpreadsheetApp.openById("ID").getSheetByName('Sheet3'); 
    var values1 = s1.getDataRange().getValues(); 
    var values2 = s2.getDataRange().getValues(); 
    var resultArray = []; 
    for(var n=0; n < values1.length ; n++){ 
    var keep = false; 
    for(var p=0; p < values2.length ; p++){ 
     Logger.log(values1[n][0]+' =? '+values2[p][0]); 
     if(values1[n][0] == values2[p][0] && values1[n][3] == values2[p][4]){ 
     resultArray.push(values1[n]); 
     Logger.log('true'); 
     break ;// remove this if values are not unique and you want to keep all occurrences... 
     } 
    } 
    } 
    s3.getRange(+1,1,resultArray.length,resultArray[0].length).setValues(resultArray); 
} 

似乎無法爲相同的值找到正確的解決方案。嘗試了幾個腳本,但沒有成功。

謝謝你的任何建議/建議。

回答

2

雖然對方的回答工作(我沒有測試,但我想它),它使用了大量的spreadsheetApp要求和可能,如果你慢有很多數據。

可以僅使用數組來獲得此結果(如果不需要保留圖紙格式和/或公式)。

該方法稍有不同,因爲它更容易保留數據而不是刪除它。

確實有很多可行的解決方案,下面是我嘗試的解決方案:我創建了一個特殊數組,其中只包含sheet3的第一列,以使重複搜索更簡單。

function removeDupsInOtherSheets() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var s1 = ss.getSheetByName("Sheet1").getDataRange().getValues(); 
    var s2 = ss.getSheetByName("Sheet2").getDataRange().getValues(); 
    var s3 = ss.getSheetByName("Sheet3").getDataRange().getValues(); 
    // iterate s3 and check in s1 & s2 if duplicate values exist 
    var nS1 = []; 
    var nS2 = []; 
    var s3Col1 = [];// data in column1 of sheet3 
    for(var n in s3){ 
    s3Col1.push(s3[n][0]); 
    } 
    for(var n in s1){ // iterate sheet1 and test col 1 vs col 1 in sheet3 
    var noDup1 = checkForDup(s1[n],s3Col1) 
    if(noDup1){nS1.push(noDup1)};// if not present in sheet3 then keep 
    } 
    for(var n in s2){ // iterate sheet2 and test col 1 vs col 1 in sheet3 
    var noDup2 = checkForDup(s2[n],s3Col1) 
    if(noDup2){nS2.push(noDup2)};// if not present in sheet3 then keep 
    } 
    Logger.log(nS1);// view result 
    Logger.log(nS2); 
    ss.getSheetByName("Sheet1").getDataRange().clear();// clear and update sheets 
    ss.getSheetByName("Sheet2").getDataRange().clear(); 
    ss.getSheetByName("Sheet1").getRange(1,1,nS1.length,nS1[0].length).setValues(nS1); 
    ss.getSheetByName("Sheet2").getRange(1,1,nS2.length,nS2[0].length).setValues(nS2); 
} 

function checkForDup(item,s){ 
    Logger.log(s+' = '+item[0]+' ?') 
    if(s.indexOf(item[0])>-1){ 
     return null; 
    } 
    return item; 
} 
+0

我選擇了在OP需要修改和擴展功能的情況下提供易於理解的東西(雖然,雖然,無可否認,效率低下)。 – 2014-11-05 00:11:34

+0

嗨@Serge Insas。我嘗試了你提供的腳本,它完美的工作。我只是修改了一些代碼來滿足我的其他規格。你是個天才!非常感謝! – Orlando 2014-11-05 01:44:22

2

Sheet 1中

ID NUMBER NAME  DEPARTMENT 
784   John Steep I.T. 
901   Liz Green H.R. 

Sheet 2中

ID NUMBER NAME  DEPARTMENT 
784   John Steep I.T. 
653   Bo Gore  Marketing 

表Sheet 3

ID NUMBER NAME  DEPARTMENT 
784   John Steep I.T. 
999   Frank White Sales 
121   Abid Jones Engineering 
901   Liz Green H.R. 

腳本

function main() { 
    var ss = SpreadsheetApp.openById("ID"); 

    var s1 = ss.getSheetByName("Sheet1"); 
    var s2 = ss.getSheetByName("Sheet2"); 
    var s3 = ss.getSheetByName("Sheet3"); 

    var idCol = 1; // Assuming location of ID column is same in all sheets. 

    var s1RowCount = s1.getLastRow(); 

    for (var i = 2; i <= s1RowCount; i++) { // Start at var i = 2 to skip the 
              // first row containing the header. 
    var id = s1.getRange(i, idCol, 1, 1).getValue(); 
    deleteDuplicates(s2, id); 
    deleteDuplicates(s3, id); 
    } 
} 

function deleteDuplicates(sheet, id) { 
    var idCol = 1; // Assuming location of ID column is same in all sheets. 
    var rowCount = sheet.getLastRow(); 
    for (var i = 2; i <= rowCount; i++) { 
    var data = sheet.getRange(i, idCol, 1, 1).getValue(); 
    if (data === id) { 
     // Use this to test out the function. 
     Logger.log("Duplicate of ID " + id + " in sheet " + 
      sheet.getSheetName() + " at row " + i); 
     // Uncomment the next line when ready. 
     // sheet.deleteRow(i); 
    } 
    } 
} 

日誌輸出

[14-11-04 09:16:04:551 PST] Duplicate of ID 784 in sheet Sheet2 at row 2 
[14-11-04 09:16:04:587 PST] Duplicate of ID 784 in sheet Sheet3 at row 2 
[14-11-04 09:16:04:727 PST] Duplicate of ID 901 in sheet Sheet3 at row 5 
+0

謝謝@凱斯巴斯克斯的答案。修改一些代碼後,它也可以工作。希望我能接受2個答案!再次感謝。 – Orlando 2014-11-05 01:45:22

相關問題