Google E-Tablolar'daki Özel İşlevler

Google E-Tablolar; AVERAGE, SUM ve VLOOKUP gibi yüzlerce yerleşik işlev sunar. Bunlar ihtiyaçlarınız için yeterli olmadığında Google Apps Komut Dosyası'nı kullanarak özel işlevler (örneğin, sayaçları mil biçimine dönüştürmek veya internetten canlı içerik getirmek) yazabilir ve Google E-Tablolar'da yerleşik bir işlev gibi kullanabilirsiniz.

Başlarken

Özel işlevler standart JavaScript kullanılarak oluşturulur. JavaScript'i kullanmaya yeni başladıysanız Codecademy, yeni başlayanlar için mükemmel bir kurs sunar. (Not: Bu kurs Google tarafından geliştirilmemiştir ve Google ile ilişkili değildir.)

Bir girdi değerini 2 ile çarpan DOUBLE adlı basit bir özel işlevi aşağıda görebilirsiniz:

/**
 * Multiplies an input value by 2.
 * @param {number} input The number to double.
 * @return The input multiplied by 2.
 * @customfunction
*/
function DOUBLE(input) {
  return input * 2;
}

JavaScript yazmayı bilmiyorsanız ve öğrenmek için zamanınız yoksa, ihtiyacınız olan özel işlevi başka birinin önceden oluşturup oluşturmadığını öğrenmek için eklenti mağazasına göz atın.

Özel işlev oluşturma

Özel bir işlev yazmak için:

  1. Google E-Tablolar'da e-tablo oluşturun veya açın.
  2. Uzantılar > Apps Komut Dosyası menü öğesini seçin.
  3. Komut dosyası düzenleyicideki kodları silin. Yukarıdaki DOUBLE işlevi için kodu kopyalayıp komut dosyası düzenleyiciye yapıştırmanız yeterlidir.
  4. Üstte Kaydet'i tıklayın.

Artık özel işlevi kullanabilirsiniz.

Google Workspace Marketplaceiçinden özel bir işlev alma

Google Workspace Marketplace , Google E-Tablolar için eklenti olarak çeşitli özel işlevler sunar. Bu eklentileri kullanmak veya keşfetmek için:

  1. Google E-Tablolar'da e-tablo oluşturun veya açın.
  2. En üstte, Eklentiler > Eklenti al'ı tıklayın.
  3. Google Workspace Marketplace açıldıktan sonra sağ üst köşedeki arama kutusunu tıklayın.
  4. "Özel işlev" yazın ve Enter tuşuna basın.
  5. İlgilendiğiniz bir özel işlev eklentisi bulursanız yüklemek için Yükle'yi tıklayın.
  6. Bir iletişim kutusu, eklentinin yetkilendirme gerektirdiğini gösterebilir. Böyle bir durumda bildirimi dikkatlice okuyun, ardından İzin ver'i tıklayın.
  7. Eklenti e-tabloda kullanılabilir hale gelir. Eklentiyi farklı bir e-tabloda kullanmak için diğer e-tabloyu açın ve üstte Eklentiler > Eklentileri yönet'i tıklayın. Kullanmak istediğiniz eklentiyi bulun ve Seçenekler > Bu dokümanda kullan'ı tıklayın.

Özel işlev kullanma

Özel bir işlev yazdıktan veyaGoogle Workspace Marketplaceüzerinden bir işlev yükledikten sonra, bunu yerleşik bir işlev olarak kullanmak kadar kolaydır:

  1. İşlevi kullanmak istediğiniz hücreyi tıklayın.
  2. Eşittir işaretini (=), ardından işlev adını ve herhangi bir giriş değerini (ör. =DOUBLE(A1)) yazıp Enter'a basın.
  3. Hücrede kısa bir süre Loading... görüntülenecek ve sonuç döndürülecektir.

Özel işlevlerle ilgili yönergeler

Kendi özel işlevinizi yazmadan önce bilmeniz gereken birkaç kural vardır.

Adlandırma

JavaScript işlevlerini adlandırmayla ilgili standart kurallara ek olarak, aşağıdakilere dikkat edin:

  • Özel işlevlerin adı, SUM() gibi yerleşik işlevlerin adlarından farklı olmalıdır.
  • Özel işlevlerin adı, Apps Komut Dosyası'nda gizli bir işlevi ifade eden alt çizgi (_) ile bitemez.
  • Özel işlevin adı, var myFunction = new Function() yerine function myFunction() söz dizimiyle tanımlanmalıdır.
  • Elektronik tablo işlevlerinin adları geleneksel olarak büyük harfle yazılsa da, büyük harf kullanımı önemli değildir.

Bağımsız değişkenler

Yerleşik işlevler gibi özel bir işlev de bağımsız değişkenleri giriş değeri olarak alabilir:

  • İşlevinizi bağımsız değişken olarak tek bir hücreye başvuruyla (=DOUBLE(A1) gibi) çağırırsanız bağımsız değişken, hücrenin değeri olur.
  • İşlevinizi, bağımsız değişken olarak bir hücre aralığına başvuruyla (=DOUBLE(A1:B10) gibi) çağırırsanız bağımsız değişken, hücre değerlerinin iki boyutlu bir dizisi olur. Örneğin, aşağıdaki ekran görüntüsünde =DOUBLE(A1:B2) içindeki bağımsız değişkenler Apps Komut Dosyası tarafından double([[1,3],[2,4]]) olarak yorumlanmıştır. Yukarıda verilen DOUBLE örnek kodunun, bir diziyi giriş olarak kabul edecek şekilde değiştirilmesi gerektiğini unutmayın.


  • Özel işlev bağımsız değişkenleri deterministik olmalıdır. Yani her hesaplama yaptığında farklı bir sonuç döndüren NOW() veya RAND() gibi yerleşik e-tablo işlevlerine, özel bir işlevin bağımsız değişkeni olarak izin verilmez. Özel işlevler bu değişken yerleşik işlevlerden birine dayalı bir değer döndürmeye çalışırsa süresiz olarak Loading... görüntüler.

Döndürülen değerler

Her özel işlev, görüntülenecek bir değer döndürmelidir. Örneğin:

  • Özel işlev bir değer döndürürse değer, işlevin çağrıldığı hücrede görüntülenir.
  • Özel bir işlev iki boyutlu bir değer dizisi döndürürse değerler, bu hücreler boş olduğu sürece bitişik hücrelere taşar. Bu durum, dizinin mevcut hücre içeriklerinin üzerine yazılmasına neden olursa özel işlev bunun yerine bir hata verir. Örnek için, özel işlevleri optimize etme bölümüne bakın.
  • Özel işlevler, değer döndürdükleri dışındaki hücreleri etkileyemez. Diğer bir deyişle, özel bir işlev rastgele hücreleri düzenleyemez. Yalnızca çağrıldığı hücreler ve bitişik hücreler oluşturulur. Rastgele hücreleri düzenlemek için bunun yerine işlev çalıştırmak üzere özel menü kullanın.
  • Özel işlev çağrısı 30 saniye içinde döndürülmelidir. Aksi takdirde hücre bir hata mesajı görüntüler: Internal error executing the custom function.

Veri türleri

Google E-Tablolar, verileri niteliğine bağlı olarak farklı biçimlerde depolar. Bu değerler özel işlevlerde kullanıldığında, Apps Komut Dosyası bunları JavaScript'teki uygun veri türü olarak değerlendirir. En çok kafa karışıklığı yaşanan alanlar şunlardır:

  • E-Tablolar'daki saat ve tarihler, Apps Komut Dosyası'nda Tarih nesneleri haline gelir. E-tablo ve komut dosyası farklı saat dilimleri kullanıyorsa (nadir görülen bir sorun) özel işlevin bunu telafi etmesi gerekir.
  • E-Tablolar'daki süre değerleri de Date nesneleri haline gelir ancak bu değerlerle çalışmak karmaşık olabilir.
  • E-Tablolar'daki yüzde değerleri, Apps Komut Dosyası'nda ondalık sayılara dönüşür. Örneğin, 10% değerine sahip bir hücre Apps Komut Dosyası'nda 0.1 haline gelir.

Otomatik tamamlama

Google E-Tablolar, yerleşik işlevlere çok benzer şekilde özel işlevler için otomatik tamamlamayı destekler. Bir hücreye işlev adı girerken, girdiğiniz adla eşleşen yerleşik ve özel işlevlerin listesini görürsünüz.

Özel işlevler, aşağıdaki DOUBLE() örneğinde olduğu gibi komut dosyaları JsDoc @customfunction etiketi içeriyorsa bu listede görünür.

/**
 * Multiplies the input value by 2.
 *
 * @param {number} input The value to multiply.
 * @return The input multiplied by 2.
 * @customfunction
 */
function DOUBLE(input) {
  return input * 2;
}

Gelişmiş

Google Apps Komut Dosyası hizmetlerini kullanma

Özel işlevler, daha karmaşık görevleri gerçekleştirmek için belirli Google Apps Komut Dosyası hizmetlerini çağırabilir. Örneğin, özel bir işlev İngilizce bir ifadeyi İspanyolcaya çevirmek için Language hizmetini çağırabilir.

Diğer Apps Komut Dosyası türlerinin çoğundan farklı olarak özel işlevler hiçbir zaman kullanıcılardan kişisel verilere erişimi yetkilendirmelerini istemez. Sonuç olarak, yalnızca kişisel verilere erişimi olmayan hizmetleri arayabilirler. Buna özellikle de aşağıdakiler dahildir:

Desteklenen hizmetler Notlar
Önbellek Çalışır ancak özel işlevlerde pek faydalı değildir
HTML HTML oluşturabilir, ancak görüntüleyemez (nadiren faydalıdır)
JDBC
Dil
Kilitle Çalışır ancak özel işlevlerde pek faydalı değildir
Maps Yol tariflerini hesaplayabilir, ancak haritaları görüntüleyemez
Mülkler getUserProperties(), yalnızca e-tablo sahibinin özelliklerini alır. E-tablo düzenleyicileri, özel bir işlevde kullanıcı özellikleri ayarlayamaz.
E-tablo Salt okunur (çoğu get*() yöntemini kullanabilir ancak set*() yöntemini kullanamaz).
Diğer e-tabloları (SpreadsheetApp.openById() veya SpreadsheetApp.openByUrl()) açamazsınız.
URL Getirme
Yardımcı programlar
XML

Özel işleviniz You do not have permission to call X service. hata mesajını verirse hizmet, kullanıcı yetkilendirmesi gerektirir ve bu nedenle özel bir işlevde kullanılamaz.

Yukarıda listelenenler dışında bir hizmet kullanmak için özel işlev yazmak yerine Apps Komut Dosyası işlevini çalıştıran özel menü oluşturun. Menüden tetiklenen bir işlev, gerekirse kullanıcıdan yetkilendirme ister ve sonuç olarak tüm Apps Komut Dosyası hizmetlerini kullanabilir.

Paylaşılıyor

Özel işlevler, oluşturuldukları e-tabloya bağlı şekilde başlar. Bu, bir e-tabloda yazılan özel işlevin, aşağıdaki yöntemlerden birini kullanmadığınız sürece diğer e-tablolarda kullanılamayacağı anlamına gelir:

  • Komut dosyası düzenleyiciyi açmak için Uzantılar > Apps Komut Dosyası'nı tıklayın. Ardından, orijinal e-tablodan komut dosyası metnini kopyalayıp başka bir e-tablonun komut dosyası düzenleyicisine yapıştırın.
  • Dosya > Kopya oluştur'u tıklayarak özel işlevi içeren e-tablonun bir kopyasını oluşturun. Bir e-tablo kopyalandığında, e-tabloya ekli komut dosyaları da kopyalanır. E-tabloya erişimi olan herkes komut dosyasını kopyalayabilir. (Yalnızca görüntüleme erişimi olan ortak çalışanlar, orijinal e-tablodaki komut dosyası düzenleyiciyi açamaz. Ancak, bir kopya oluşturduğunda kopyanın sahibi olur ve komut dosyasını görebilir.)
  • Komut dosyasını Google E-Tablolar Düzenleyici Eklentisi olarak yayınlayın.

Optimizasyon

Bir e-tabloda özel işlev her kullanıldığında, Google E-Tablolar Apps Komut Dosyası sunucusuna ayrı bir çağrıda bulunur. E-tablonuz onlarca (veya yüzlerce, hatta binlerce) özel işlev çağrısı içeriyorsa bu işlem oldukça yavaş olabilir.

Sonuç olarak, özel bir işlevi geniş bir veri aralığında birden çok kez kullanmayı planlıyorsanız işlevi, iki boyutlu dizi biçimindeki girdi olarak bir aralığı kabul edecek ve daha sonra uygun hücrelere taşabilecek iki boyutlu bir dizi döndürecek şekilde değiştirebilirsiniz.

Örneğin, yukarıda gösterilen DOUBLE() işlevi, tek bir hücreyi veya hücre aralığını kabul etmek için aşağıdaki gibi yeniden yazılabilir:

/**
 * Multiplies the input value by 2.
 *
 * @param {number|Array<Array<number>>} input The value or range of cells
 *     to multiply.
 * @return The input multiplied by 2.
 * @customfunction
 */
function DOUBLE(input) {
  return Array.isArray(input) ?
      input.map(row => row.map(cell => cell * 2)) :
      input * 2;
}

Yukarıdaki yaklaşım, iki boyutlu hücre dizisindeki her değerde DOUBLE öğesini yinelemeli olarak çağırmak için JavaScript'in Array nesnesinin map yöntemini kullanır. Sonuçları içeren iki boyutlu bir dizi döndürür. Bu şekilde, DOUBLE öğesini yalnızca bir kez çağırıp aşağıdaki ekran görüntüsünde gösterildiği gibi aynı anda çok sayıda hücre için hesaplamasını sağlayabilirsiniz. (Aynı şeyi map çağrısı yerine iç içe yerleştirilmiş if ifadeleriyle de yapabilirsiniz.)

Benzer şekilde, aşağıdaki özel işlev internetten canlı içeriği verimli bir şekilde getirir ve yalnızca tek bir işlev çağrısıyla iki sonuç sütununu görüntülemek için iki boyutlu bir dizi kullanır. Her hücre kendi işlev çağrısına ihtiyaç duyduğunda, Apps Komut Dosyası sunucusunun her defasında XML feed'ini indirip ayrıştırması gerektiği için işlem çok daha fazla zaman alacaktır.

/**
 * Show the title and date for the first page of posts on the
 * Developer blog.
 *
 * @return Two columns of data representing posts on the
 *     Developer blog.
 * @customfunction
 */
function getBlogPosts() {
  var array = [];
  var url = 'https://gsuite-developers.googleblog.com/atom.xml';
  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');
  var entries = document.getRootElement().getChildren('entry', atom);
  for (var i = 0; i < entries.length; i++) {
    var title = entries[i].getChild('title', atom).getText();
    var date = entries[i].getChild('published', atom).getValue();
    array.push([title, date]);
  }
  return array;
}

Bu teknikler, e-tablo boyunca tekrarlı olarak kullanılan neredeyse tüm özel işlevlere uygulanabilir. Ancak uygulama ayrıntıları, işlevin davranışına bağlı olarak farklılık gösterir.