2012-11-13 22 views
2

這與我上一個問題有點不同,但無法將代碼轉換爲此。根據匹配值將數據複製到另一個表單中

表1與公司名稱有個別聯繫。每個人都有一個名字,但公司名稱可能會根據表格中有多少人顯示多次。所以:

Name  Company  Work Address 
John Smith ABC Company 
Jim Smith XYZ Company 
Bob Smith ABC Company 

第2頁的公司擁有自己的工作地址:

Company  Work Address 
ABC Company 1234 Street, USA 
XYZ Company 5678 Street, USA 

我如何腳本,使該公司的地址去到各個接觸片?

我試過使用數組,並尋找行/ col索引,但我失去了一些東西。這段代碼讓我走得最近,但不能使它工作(代碼列和行號與示例不匹配,它們只是我正在嘗試使用的當前陣列,fyi):

function populateCofieldsincontact() { 
    var writeSheet = sskey.getSheetByName('POCs'); 
    var sourceSheet = sskey.getSheetByName('Businesses'); 

    var writeData = writeSheet.getRange(1, 6, writeSheet.getLastRow(), 5).getValues();Logger.log(writeData) 
    for (var w = 0; w < writeData.length; w++) { 

    var sourceData = sourceSheet.getRange(1, 2, sourceSheet.getLastRow(), 3).getValues(); 
    var dest = []; 
    for (var i = 0; i < sourceData.length; i++) { 
     if (writeData ==sourceData[i][0].toString().match(writeData)) { 
     dest.push(sourceData[i][2]); 
     } 
    } 
    } 
    if (dest.length > 0) { 
     writeSheet.getRange(2,10,dest.length,1).setValue(dest.toString()); 
    } 
} 

任何幫助非常感謝!

快速更新 - 我能夠得到setValue(不是因爲某種原因無法工作的setValues),並將地址寫入正確的列中,但只有我能想到的將它寫入循環才能使用getLastRow,我只知道如何爲表單做這件事。所以我打算把所有的地址放在正確的列中,但是從實際數據的底部開始寫入行。我無法弄清楚如何讓它寫入最上面一行,然後向下,呃。

FINAL(希望)代碼:我插一個[w][0]旁邊writeData第二提上@亞當的代碼行13,似乎一些測試後進行工作。謝謝@Adam和@Serge !!:

function populateCofieldsincontact() { 
    var writeSheet = sskey.getSheetByName('POCs'); 
    var sourceSheet = sskey.getSheetByName('Businesses'); 

    var writeData = writeSheet.getRange(2, 6, writeSheet.getLastRow() - 1).getValues(); 
    var sourceData = sourceSheet.getRange(2, 2, sourceSheet.getLastRow(), 12).getValues(); 
    var dest = []; 
    var temp; 

    for (var w = 0; w < writeData.length; w++) { 
    temp = null; 
    for (var i = 0; i < sourceData.length; i++) { 
     if (writeData[w][0] == sourceData[i][0].toString().match(writeData[w][0])) { 
     temp = sourceData[i][11]; 
     break; 
     } 
    } 
    dest.push([temp]); 
    } 
    if (dest.length > 0) { 
     writeSheet.getRange(2, 13, dest.length, 1).setValues(dest); Logger.log(dest) 
    } 
} 

回答

4

看是否有此按預期工作,希望我的假設是正確的(編輯:錯字更正爲每評論)

function populateCofieldsincontact() { 
    var writeSheet = sskey.getSheetByName('POCs'); 
    var sourceSheet = sskey.getSheetByName('Businesses'); 

    var writeData = writeSheet.getRange(2, 6, writeSheet.getLastRow() - 1).getValues(); 
    var sourceData = sourceSheet.getRange(1, 2, sourceSheet.getLastRow(), 3).getValues(); 
    var dest = []; 
    var temp; 

    for (var w = 0; w < writeData.length; w++) { 
    temp = null; 
    for (var i = 0; i < sourceData.length; i++) { 
     if (writeData[w][0] == sourceData[i][0].toString().match(writeData[w][0])) { 
     temp = sourceData[i][2]; 
     break; 
     } 
    } 
    dest.push([temp]); 
    } 
    if (dest.length > 0) { 
     writeSheet.getRange(2, 10, dest.length, 1).setValues(dest); 
    } 
} 

我猜你的代碼有幾個問題,但我認爲重要的信息(它讓我像一個公平的解決方案)解決了當你使用getValues和setValues時,你總是處理二維數組,即使該陣列只有一列寬。因此,dest.push([temp])位中的方括號 - 實際上是逐漸將長度爲1的數組推到dest數組上。

+0

嗨,亞當,我認爲你說得對!只有一個細節:可以刪除最後一個IF語句,因爲dest數組永遠不會爲空,因爲空值和它的方括號在那裏作爲默認值...... - 乾杯 –

+0

是的真正的Serge,我把它留在那裏以防萬一OP因爲某個原因想要它,但是你是對的,它確實沒有任何用處。也許我們可以這樣做:if(writeSheet.getLastRow()<2)return;'在開始時檢查writeSheet中是否有數據。 – AdamL

+0

@AdamL我試了一下,什麼都沒有發生。根據我登錄的日誌,我的日誌顯示沒有數據或空數組。猜猜這是無法完成的。 – user1783229

0

您應該使用兩個循環並在第一個循環的每個步驟中迭代第二個循環。 如果在第二個循環中找不到匹配項,那麼您應該在第一個數組中將一個空項目推入,以保持第一個數據表中的數據對齊。 我敢肯定,你可以通過這個...

+0

thx,我確實嘗試了兩個循環 - 我甚至嘗試了第三個數組來將writedata「擠壓」到強制它到達第一行(第二行)而不是所有數據的底部(我注意到的是發生在我的快速更新中)。幾個小時,我已經嘗試了一切,直到午夜。我有一個企業要運行,這樣的事情應該很簡單,這是一個絕對頭痛的問題。 – user1783229

+0

我明白你確實不想在這上面花費你的生命......這就是爲什麼我們會盡力幫助;-)亞當給你帶來了一個很好的解決方案......至少我認爲,直到我看到你的評論爲止......他肯定會回來看看會發生什麼 –

+0

哦,不,我非常欣賞它,我對谷歌感到沮喪而不是與任何人 - 我在這裏得到的幫助非常棒 - 但我在嘗試在來這裏之前耗盡我所有的精神力量。我看到太多的提問者只是發佈「爲我做這件事」,但我儘可能在儘可能多的嘗試之前來到這裏。不幸的是,其他答案沒有奏效。我只是不明白。 – user1783229

相關問題