2015-04-02 32 views
0

我想「內部連接」 2數據範圍(SHEET 1 & 2)由「ID」和輸出其結果在表3(如下所示)谷歌Apps腳本內部聯接範圍

對於所有片第一行只是標題,實際值從第二行開始。

工作表1是整個數據庫(3000行),工作表2(1000行)是附加數據的工作表1的選擇。每個條目(ID)僅在每張表中出現一次。

表3應該顯示僅包括表2,但與對應的行的表中的數據(由ID)1.

var sheetOneVals = sheetOne.getDataRange().getValues(); sheetOneVals.splice(0, 1);

var sheetTwoVals = sheetTwo.getDataRange().getValues(); sheetTwoVals.splice(0, 1);

如何可以這樣做的行? https://stackoverflow.com/a/17500836/379777幾乎是我想要的,只是它使用了Keys,我沒有這種情況。

表1:

 A   B   C  D 
    ------------------------------------ 
1 | Name | Description | Price | ID | 
    ------------------------------------ 
2 | ABC | Bla1  | 10 | 123 | 
    ------------------------------------ 
3 | DEF | Bla2  | 8  | 234 | 
    ------------------------------------ 
: | : | :   | :  | : | 
: | : | :   | :  | : | 
    ------------------------------------   

表2:

A  B  C  D   E 
    --------------------------------------- 
1 | ID | Cat1 | Cat2 | Cat3 | Nonsense | 
    --------------------------------------- 
2 | 123 | B | C | D | xyz  | 
    --------------------------------------- 
: | : | : | : | : | :  | 
: | : | : | : | : | :  | 
    --------------------------------------- 

表3(期望的結果):

 A  B  C  D  E   F   G 
    ---------------------------------------------------------- 
1 | ID | Cat1 | Cat2 | Cat3 | Name | Description | Price | 
    ----------------------------------------------------------  
2 | 123 | B | C | D | ABC | Bla1  | 10 | 
    ---------------------------------------------------------- 
: | : | : | : | : | : | :   | :  | 
: | : | : | : | : | : | :   | :  | 
    ---------------------------------------------------------- 

回答

0

我結束了以下解決方案。我可能不足以完全理解您的解決方案。我相信你的解決方案要快得多。

function createSheet3(){ 
    var ss  = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet1 = ss.getSheetByName("sheet1"); 
    var sheet2 = ss.getSheetByName("sheet2"); 
    var sheet3 = ss.getSheetByName("sheet3"); 

    var sheet3Header = [Name,Description,Price,ID,ID,Cat1,Cat2,Cat3,Nonsense] 

    var sheetOneVals = sheet1.getDataRange().getValues(); 
    sheetOneVals.splice(0, 1); 

    var sheetTwoVals = sheet2.getDataRange().getValues(); 
    sheetTwoVals.splice(0, 1); 

    var consolidatedArr = new Array(); 

    for each (var item in sheetTwoVals){ 
    for (var i in sheetOneVals) { 
    if(item[0] == sheetOneVals[i][3]){ 
     consolidatedArr.push(sheetOneVals[i].concat(item)); 
    } 
    } 
    } 
    sheet3.clear({contentsOnly:true}); 
    sheet3.getRange(1,1,1,9).setValues(sheet3Header); 
    sheet3.getRange(2,1,consolidatedArr.length,9).setValues(consolidatedArr); 


    SpreadsheetApp.flush();       
    Utilities.sleep("200"); 
    if(consolidatedArr.length > 0){ 
    var last = sheet3.getLastRow();      
    var max = sheet3.getMaxRows(); 
    if (last !== max && max-last > 1) {sheet3.deleteRows(last+2,max-last-1);} 
    } 
} 
1

你只想邏輯或某人編寫這一切?可以輕鬆快速工作的邏輯是:

開始和對象,以密鑰作爲ID。
迭代槽表1並將所有值保存爲這些ID中的對象。
迭代槽表2在ID中再次保存新鍵。
將對象解析爲雙數組。

下面是一些存根:

Initiate myObject 
Get Sheet1 and sheet2 
for(lines in sheet 1) 
    myObject[ lineId ] = {} 
    for(cols in sheet 1[lines]) 
     myObject[ lineId ][ columnHeading ] = columnValue 

for(lines in sheet 2) 
    for(cols in sheet 1[lines]) 
    myObject[ lineId ][ columnHeading ] = columnValue 

你會用duplica ID結束了,因爲屬性鍵,並在其與值的屬性,但根本不算什麼。

Initiate arrayToPaste 
Initiate currLine with 0 
for(props in myObject) 
    Initiate first array key as an Array 
    for(keys in myObject[ props ]){ 
    arrayToPaste[ currLine ].push(myObject[ props ][ key ]) 
    } 
    Increase currLine 

Paste arrayToPaste to sheet 

只需插入標題的地方,可以在初始化,先爲,粘貼的時候,作爲一個不同的陣列,等...

而且我也有一個問題,爲什麼parseInt函數後?

+0

謝謝你的回答。你說得對,parseInt沒用。我刪除它。但是,我認爲您的解決方案不能解決問題。我編輯了文本,也許它更清楚我現在想要的。 – user3797772 2015-04-02 13:37:03

+0

是的,它會的。所有的值將被保存在一個對象中,以id爲鍵,直接構造對象看起來像這樣:'myObject = {123:{Cat1:'B',Cat2:'C':Cat3:'D' ,廢話:'xyz',描述:'Bla1',價格:10,ID:123,名稱:'ABC'},234 {與不同值的123相同}};',這非常適合解析爲雙數組,其中123和234是行(不是文字行號),並且其中的每個關鍵詞都在列中。 – Kriggs 2015-04-02 13:42:32

+0

該邏輯已經在鏈接的s.o中編碼。在問題中。 – 2015-04-02 14:57:12