2016-03-22 60 views
1

我有下面的代碼,這是作爲一個谷歌電子表格的自定義函數:的Apps腳本綁定不同,這取決於輸入源

// counts the instances of elem in an array called list 
function countInstances(elem, list) { 
    var p = 0; 

    for (var i = 0; i < list.length; i++) { 
    if (list[i] == elem) p++; 
    } 
    return p 
} 

function J(E) { 
    //var E = ["a","a","a","a","b","b","b","b","c","c","c","c"]; 
    var elems = E.getUnique(); 
    var b; 

return countInstances(elems[0], E); 
} 

似乎直截了當,但一些奇怪的事情正在發生:

  • 當我在代碼中取消註釋「var E」時,b返回我期望它返回的結果:4代表a,4代表b,4代表c,即陣列中每個字符的實例數
  • 當我沒有將E硬編碼到代碼中,而是使用refe依靠我的電子表格,b給我1爲a,1爲b,1爲c。顯然,它只承認第一例。
  • 當我在countInstances中記錄if條件時,我可以學到兩件事:1)只有第一個實例被認爲是TRUE,2)elem在前四次仍然是「a」,列表也是我看到的數組這意味着評估的比較似乎沒有了,但我不知道爲什麼。
  • 當我回到代碼並在評論中的「這裏」中將「elems [i]」更改爲「a」時,例如,再次返回正確數目的a。這是當我將這個值傳遞給子函數時,我總結出一些奇怪的綁定正在發生的地方。

編輯

的getUnique功能

Array.prototype.getUnique = function(){ 
    var u = {}, a = []; 
    for(var i = 0, l = this.length; i < l; ++i){ 
    if(u.hasOwnProperty(this[i])) { 
     continue; 
    } 
    a.push(this[i]); 
    u[this[i]] = 1; 
} 
return a; 
} 

編輯2:

你可以找到一個例子電子表格here

+1

我得到的錯誤:*找不到功能getUnique的對象,一, a,a,b,b,b,b,c,c,c,c。* getUnique()函數在哪裏? –

+0

在編輯中添加了它。它工作的很好,我不想添加太多不必要的代碼 - 關於這個問題 – oliver13

+0

當E從電子表格自定義函數傳遞時,它是否以數組的形式到達函數'J'?你可以用'Logger.log('typeof J:'+ typeof J)檢查數據類型;'這是我能想到的唯一可能會改變的區別? –

回答

1

編輯:如果你想直接在電子表格中使用它作爲一個自定義公式此功能(example spreadsheet):

function J(E) { 
    var list = []; 
    for (var i = 0; i < E.length; i++) 
    { 
    list.push(E[i][0]);  
    } 
    var elems = list.getUnique(); 

    for (var i = 0; i < elems.length; i++) { 
    var b = countInstances(elems[i], list); //here 
    } 
    return b; 
}