2016-09-15 25 views
1

我花了兩個完整的工作日來搜索論壇並對其進行了一般性的解決,但由於我對java相對較新,這可能是一個新手是違反基本面。在這種情況下,請原諒。比較來自兩個陣列的運行值,但未能評估

語境: 我編碼的業務案例需要兩個獨立的谷歌電子表格文件之間進行比較的記錄,非常像SQL查詢使用主鍵和外鍵的兩個表。爲了方便起見,將相應Spreadsheet文件中的兩個範圍加載到單獨的數組中,然後將作爲主鍵和外鍵的字段進行比較以進行匹配。

問題: 代碼運行,並從我使用調試器觀察到,比賽應該確定,如果IF語句是評估,但IF語句無法評估,因此沒有這樣的匹配鑑定。我試圖在運行the accompanying reconstruction(其中i = 2且匹配值爲32)中的代碼時生成的日誌中容易看到這種情況。

我已經檢查過兩個Spreadsheets中的比較字段的數據類型是否相同,並且在數組值爲浮點數的情況下,我已經嘗試過使用不同的比較運算符。此外,我試圖在用[[],[]]語法聲明它們之後使用for循環加載數組,而不是在隨後的重建中使用的語法。最後,我只是在函數的參數根本沒有存儲在數組中時才使得IF語句正確地評估。然而,由於下面提到的限制,這是不令人滿意的解決方案。

限制條件: 變通辦法,消除了使用陣列很可能不切實際的,如果它們增殖到服務器呼叫,因爲是的情況下,當我試圖使用單數的getValue()方法(相對於複數的GetValues()方法)一次加載數組一個值。在隨後的重建中將不會觀察到這種現象,因爲用於比較的兩張表在同一個文件中。另外,加載到陣列中的兩個序列在​​相應的重建中位於相鄰的列中,但它們並不在我的實際使用情況中。因此,任何將兩個getValues()方法合併爲一個的解決方法也可能不切實際。

什麼成功的樣子: 當名爲「迴歸」變量不再在日誌中未定義的代碼運行後,再匹配已經被識別並存儲!

補充材料: 這個問題的本質是重建您在this Google Sheet來說明,我將在下面的代碼複製。

function simulation() { 

    var thisSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    var nameObj = {} 
    var nameArray = [] 
    nameObj.name = thisSheet.getRange(2,1,3,1).getValues(); 
    nameObj.number = thisSheet.getRange(2,2,3,1).getValues(); 
    nameArray.push(nameObj); 

    var vendorObj = {} 
    var vendorArray = [] 
    vendorObj.vendorName = thisSheet.getRange(2,4,3,1).getValues(); 
    vendorObj.vendorNumber = thisSheet.getRange(2,5,3,1).getValues(); 
    vendorArray.push(vendorObj); 

    for (var i = 1; i < vendorArray[0].vendorNumber.length + 1; i++) { 
    matchOnNumber(nameArray,vendorArray[0].vendorNumber[i - 1]); 
    } 
} 


function matchOnNumber(nameArray, vendorNumber) { 
    var thisSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    for (var i = 0; i < nameArray[0].name.length; i++) { 
    Logger.log("vendorNumber = " + vendorNumber + ", i = " + i + ", Matched against: " + nameArray[0].number[i]); 
    if (nameArray[0].number[i] == vendorNumber) { 
     var result = nameArray[0].number[i]; 
    } 
    } 
    Logger.log("Result: " + result); 
    return result; 
} 
+0

那麼你在日誌中看到了什麼? – johnnyaug

+0

歡迎來到Stackoverflow。一個問題很好問! –

回答

0

你可以通過改變

if (nameArray[0].number[i] == vendorNumber) 

if (nameArray[0].number[i][0] == vendorNumber) 

解決這個結果隨後將undefined32undefined(使給定的23和100的意義不在名稱數組表格的數據。

原因是因爲getValues()總是返回一個2d的行列數組,以便明確地表明數據的佈局。

nameArray包含一個元素(索引0),它是nameObj
nameObj.number獲取表格的getValues結果。
這表面上是一個列向量,但在Google Apps腳本方面,它是一個3x1矩陣。
要訪問實際值,您需要引用該行,然後索引0作爲唯一可用的列。