2016-03-22 20 views
1

Bir Google E-tablosu için özel bir işlevi olarak davranmaktadır Aşağıdaki kod var:Apps Komut farklı giriş kaynağına göre bağlayan

// 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); 
} 

Bu düz ileri görünüyor, ama garip bir şey oluyor:

  • ben kodunda "var E" yorumsuz b ben dönmek beklenir verir: 4 bir için, 4 b, 4 c, her karakterin örneklerini sayısına yani dizideki
  • Kodu E'ye kodlamadığımda, bunun yerine bir referans etiketi kullanın. bültenime göre, b a için 1, b için 1, c için 1 verir. Anlaşılan, sadece ilk örneği tanır.
  • Sayım durumundaki if koşulunu günlüğe kaydederken iki şey öğrenebilirim: 1) yalnızca ilk örnek TRUE olarak kabul edilir, 2) elem hala ilk dört kez "a" ve liste de gördüğüm dizidir Yani, karşılaştırmanın değerlendirilmesi kapalı gibi görünüyor, ama nedenini bilmiyorum.
  • Koduna geri döndüğümde ve yorumda "burada" yazdığı satırdaki "elems [i]" i değiştirdiğimde, ör. A'nın doğru sayısı tekrar döndürülür. Değer alt fonksiyona teslim edildiğinde bazı garip bağlanmaların gerçekleştiği sonucuna varıyorum.

DÜZENLEME

getUnique fonksiyonu

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; 
} 

DÜZENLEME 2:

Bir örnek-tabloyu here bulabilirsiniz.

+1

Şu hatayı alıyorum: * nesne a işlevi getUnique bulamıyor, bir, a, a, b, b, b, b, c, c, c, c. * getUnique() işlevi nerede? –

+0

Düzenlemede eklendi. Çok iyi çalışıyor ve çok fazla gereksiz kod eklemek istemedim - bu – oliver13

+0

hakkında ağlayın E e, elektronik tablo özel işlevinden geçtiğinde, bir dizi olarak J işlevi işlevine ulaşır mı? Veri tipini Logger.log ('typeof J:' + typeof J ile) ile kontrol edebilirsiniz, 'Bu fark yaratabileceğimiz tek şey bu mu? –

cevap

1

Düzenleme: doğrudan e-tablolardaki özel formülü olarak kullanmak istiyorsanız bu fonksiyonu (example spreadsheet) çalışır:

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; 
} 
İlgili konular