Funkcje UDF w Arkuszach kalkulacyjnych Google
  strona główna:
A po co ten Excel ;-)
 
 
    Posiadacze kont mail'owych na gmailu mają taką fajną funkcję…  
 
 
 
 
 
 
 
 
 
 
  link do pliku:
  test.xls
  Udostępnienie umozliwia
  nadawanie praw do:
No i zależało mi na utworzeniu takiego własnie pliku który mógłbym utworzyć na swoim kompie w Excelu. Umieścić go na dysku   - Wyświetlenia
Google i udostępnić/pokazać go jakiejść grupie osób które nawet nie muszą
  - Komentowania
mieć Excela. Plik wstawiłem na swój Dysk Google. Udostępniłem "tym którzy   - Edycji
posadają link" ...czyli Ty ;-)    więc śmiało :-)
   wszystko fajnie ale…  
Mam zaistalowany własny dodatek z funkcjami UDF i korzystam z nich  
"nagminnie"!! Szczególnie często z VBALIKE - żyć bez niej nie mogę ;-)  
I zgadnijcie czy funkcję UDF Arkusz kalk. Google sobie sam przetłumaczył??  
No jasne że nie :-)  
 
  dodatek i VBALIKE
 
 
 
 
Co więc zrobić żeby działało??  
"Google Apps Script is a scripting language based on JavaScript
that lets you do new and cool things with Google Apps like Docs, Sheets, and Forms.
There's nothing to install — we give you a code editor right in your browser, and your scripts run on Google's servers.
 
  Overview of Google Apps Script
 
 
 
No to znamy już język i wiemy że IDE też dostarcza Google   
poprzez przeglądarkę. :-) I rzeczywiście z menu: Narzędzia  
mamy dostęp do Edytora Skryptów. Tu trzeba dołożyć naszą  
VBALike ( ... no niby jsLike ale przywiązany jestem do tej nazwy)  
 
    Nad, zdawałoby się, paroma prostymi liniami kodu spędziłem  
dwa wieczory, a wczoraj połozyłem się spać poirytowany xD.  
No ale w efekcie jest…  
 
function VBALikeE_v1(vDane,strLike) {   JavaScript Tutorial
  var tblW = new Array();  
  var patt = new RegExp(strLike, "i");   RegExp Object
     Array length Property
  for (var i=0;i<vDane.length;i++){    For Loop
    tblW.push(patt.test(String(vDane[i][0])));   Array push() Method
  }   test() Method
  return tblW;    String Object
}   Functions With a Return Value
 
Jak wiemy z VBA vDane to tablica 2D. strLike to nasz "wzór". Funkcja ma zwrócić tablicę z elementami prawda/fałsz - wyniki  
porównań elementów z "wzorem".  
Problemy:  
 - w js nie ma operatora Like  
 - jak wykonać na elemencie tablicy metodę którą można wykonywać na Stringach?  
 - jak zwrócić tablicę danych której wielkość będzie uzalezniona od wielkości tablicy vDane?  
Ktoś znający js powie proste ale vb'owcy mają na takie problemy: operator like i Redim tablicy. A tu?? No a tu jest RegExp i   
metoda Push tablicy… :-)  
   Taka wersja wystarczy w 99% przypadków. vDane to za zwyczaj 1 kolumna danych. Funkcja co prawda zwraca tablicę ale  
poziomą. Transponuje się wyniki funkcją Arkuszową i DZIAŁA :-) Mi już na tym etapie mortka się szeroko śmiałą.  
formuła:  
=ARRAYFORMULA(SUM(((TRANSPOSE(VBALike($D$7:$D$93,$N13)))*($C$7:$C$93>=O$11)*($C$7:$C$93<=O$12)  
Ciężka? E skąd… :-) suma.iloczynów. Trzy tablice. Pierwsza to moja TRANSPOSE(VBALike($D$7:$D$93,$N13))  
Czemu nie wbudowana SUMPRODUCT? Bo nie działa - zwraca zera. A sama Suma (SUM) nie wystarcza bo nie ma zatwierdzenia  
tablicowego. Jest za to funkcja ARRAYFORMULA i kombinacja ARRAYFORMULA(SUM w więc Excelowa ={SUMA(… działa!!  
 
działa, działa :-) ale można łatwiej :-) Jeżeli tblW ma mieć takie same wymiary co vDane to …  
 
function VBALike_v2(vDane,strLike) {  
  var tblW = vDane //new Array();  
  var patt = new RegExp(strLike, "i");  
    
  for (var i=0;i<vDane.length;i++){  
    for (var j=0;j<vDane[i].length;j++){  
      tblW [i][j] = (patt.test(String(vDane[i][j])));  
    }  
  }  
  return tblW;   
}  
 
łatwiej?? Ale to już "chodzenie na łatwiznę" ;-)  
Warunek powodzenia takiej funkcji to jw. Tablica wyników ma mieć takie same wymiary co tablica danych. I tu tak jest ale wiedza  
nt. tworzenia tablicy dwu wymiarowej dynamicznie też się może przydać więc…  
 
function VBALike(vDane,strLike) {  
  var tblR = new Array();  
  var tblW = new Array();  
  var patt = new RegExp(strLike, "i");  
    
  for (var i=0;i<vDane.length;i++){  
    for (var j=0;j<vDane[i].length;j++){  
      tblR.push(patt.test(String(vDane[i][j])));  
    }  
    tblW.push(tblR);  
    tblR = new Array();  
  }  
  return tblW;   
}  
 
można tablicę Push'nąć do tablicy Wyników.. I z tej wersji korzystam. :-)  
dla tej wersji wystarczy formuła:  
=ARRAYFORMULA(SUM(((VBALike($D$7:$D$93,$N13))*($C$7:$C$93>=O$11)*($C$7:$C$93<=O$12)  
 
… nie taki diabełstraszny :-)