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ıza yetmiyorsa Google Apps Komut Dosyası'nı kullanarak özel işlevler yazabilirsiniz (ör. metreleri mil olarak dönüştürmek veya İnternet'ten canlı içerik almak). Ardından bu işlevleri Google E-Tablolar'da yerleşik işlevler gibi kullanabilirsiniz.

Başlarken

Özel işlevler standart JavaScript kullanılarak oluşturulur. JavaScript'te yeniyseniz Codecademy'nin yeni başlayanlar için mükemmel bir kursu var. (Not: Bu kurs Google tarafından geliştirilmemiştir ve Google ile ilişkili değildir.)

Giriş değerini 2 ile çarpan DOUBLE adlı basit bir özel işlev aşağıda verilmiştir:

/**
 * 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'i nasıl yazacağınızı bilmiyorsanız ve öğrenmek için zamanınız yoksa ihtiyacınız olan özel işlevi başka birinin oluşturup oluşturmadığını görmek için eklenti mağazasını kontrol edin.

Özel işlev oluşturma

Özel işlev yazmak için:

  1. Google E-Tablolar'da bir e-tablo oluşturun veya açın.
  2. Uzantılar > Apps Komut Dosyası menü öğesini seçin.
  3. Komut dosyası düzenleyicideki tüm 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 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 bir e-tablo oluşturun veya açın.
  2. Üstte eklentiler > Eklenti al'ı tıklayın.
  3. açıldıktan sonra sağ üst köşedeki arama kutusunu tıklayın.
  4. "Özel işlev" yazıp 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. Eklentinin yetkilendirme gerektirdiğini belirten bir iletişim kutusu görebilirsiniz. Bu durumda, bildirimi dikkatlice okuyup İ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 veya'ten yükledikten sonra, yerleşik işlevler kadar kolay kullanılır:

  1. İşlevi kullanmak istediğiniz hücreyi tıklayın.
  2. Eşittir işareti (=) ve ardından işlev adını ve herhangi bir giriş değerini (ör. =DOUBLE(A1)) yazıp Enter tuşuna basın.
  3. Hücre kısa bir süre Loading... gösterir, ardından sonucu döndürür.

Ö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ğıdakileri de göz önünde bulundurun:

  • Ö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 işlevi belirten alt çizgiyle (_) bitemez.
  • Özel işlevlerin adı var myFunction = new Function() değil function myFunction() söz diziyle tanımlanmalıdır.
  • E-tablo işlevlerinin adları genellikle büyük harflerle yazılsa da büyük/küçük harf kullanımı önemli değildir.

Bağımsız değişkenler

Yerleşik işlevler gibi özel işlevler de giriş değerleri olarak bağımsız değişkenler alabilir:

  • İşlevinizi bağımsız değişken olarak tek bir hücreye referans vererek çağırırsanız (=DOUBLE(A1) gibi) bağımsız değişken, hücrenin değeri olur.
  • İşlevinizi bağımsız değişken olarak bir hücre aralığına referans vererek çağırırsanız (=DOUBLE(A1:B10) gibi) 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 yorumlanır. DOUBLE Yukarıdaki örnek kodun, giriş olarak bir dizi 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 hesaplamalarında farklı bir sonuç döndüren yerleşik e-tablo işlevlerine (ör. NOW() veya RAND()) özel işlev bağımsız değişkenleri olarak izin verilmez. Bir özel işlev, bu değişken yerleşik işlevlerden birine göre bir değer döndürmeye çalışırsa süresiz olarak Loading... gösterilir.

Döndürülen değerler

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

  • Özel bir işlev bir değer döndürürse değer, işlevin çağrıldığı hücrede gösterilir.
  • Bir özel işlev iki boyutlu bir değer dizisi döndürürse değerler, boş oldukları sürece bitişik hücrelere taşacaktır. Bu işlem, dizinin mevcut hücre içeriklerinin üzerine yazmasına neden olursa özel işlev bunun yerine 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 hücreler dışındaki hücreleri etkileyemez. Başka bir deyişle, özel işlevler rastgele hücreleri düzenleyemez. Yalnızca çağrıldıkları hücreleri ve bitişik hücreleri düzenleyebilirler. İsteğe bağlı hücreleri düzenlemek için 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ücrede #ERROR! gösterilir ve hücre notu Exceeded maximum execution time (line 0). olur.

Veri türleri

Google E-Tablolar, verilerin türüne bağlı olarak verileri farklı biçimlerde saklar. Bu değerler özel işlevlerde kullanıldığında Apps Script bunları JavaScript'teki uygun veri türü olarak değerlendirir. En sık karıştırılan konular şunlardır:

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

Otomatik tamamlama

Google E-Tablolar, yerleşik işlevler için olduğu gibi özel işlevlerde de otomatik tamamlamayı destekler. Bir hücreye işlev adı yazarken, girdiğinizle eşleşen yerleşik ve özel işlevlerin listesini görürsünüz.

Komut dosyalarında JsDoc @customfunction etiketi bulunan özel işlevler bu listede gösterilir (aşağıdaki DOUBLE() örneğinde gösterildiği gibi).

/**
 * 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, bir özel işlev, İngilizce bir ifadeyi İspanyolcaya çevirmek için Language hizmetini çağırabilir.

Diğer çoğu Apps Komut Dosyası türünün aksine, özel işlevler kullanıcılardan kişisel verilere erişim izni vermesini hiçbir zaman istemez. Bu nedenle, yalnızca kişisel verilere erişimi olmayan hizmetleri, özellikle aşağıdakileri çağırabilirler:

Desteklenen hizmetler Notlar
Önbellek Çalışır ancak özel işlevlerde özellikle yararlı değildir.
HTML HTML oluşturabilir ancak görüntüleyemez (nadiren kullanışlıdır)
JDBC
Dil
Kilitle Çalışır ancak özel işlevlerde özellikle yararlı değildir.
Haritalar 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 işlevlerde kullanıcı özelliklerini ayarlayamaz.
E-tablo Salt okuma (get*() yöntemlerinin çoğunu kullanabilir ancak set*() yöntemini kullanamaz).
Diğer e-tabloları (SpreadsheetApp.openById() veya SpreadsheetApp.openByUrl()) açamaz.
URL Getirme
Yardımcı programlar
XML

Özel işleviniz You do not have permission to call X service. hata mesajı gösteriyorsa hizmet kullanıcı yetkilendirmesi gerektiriyor demektir ve bu nedenle özel işlevde kullanılamaz.

Yukarıda listelenenler dışında bir hizmeti kullanmak için özel işlev yazmak yerine Apps Komut Dosyası işlevi çalıştıran bir özel menü oluşturun. Bir menüden tetiklenen işlev, gerekirse kullanıcıdan yetkilendirme ister ve ardından tüm Apps Script hizmetlerini kullanabilir.

Paylaşım

Özel işlevler, oluşturuldukları e-tabloya bağlı olarak başlar. Bu, aşağıdaki yöntemlerden birini kullanmadığınız sürece bir e-tabloda yazılmış özel işlevin 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-tablodaki 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, ona eklenmiş tüm 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-tabloda komut dosyası düzenleyiciyi açamaz. Ancak kopya oluşturduklarında kopyanın sahibi olurlar ve komut dosyasını görebilirler.)
  • Komut dosyasını Google E-Tablolar Düzenleyici Eklentisi olarak yayınlayın.

Optimizasyon

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

Bu nedenle, özel bir işlevi büyük bir veri aralığında birden çok kez kullanmayı planlıyorsanız işlevi, iki boyutlu dizi biçiminde giriş olarak bir aralık kabul edecek ve ardından uygun hücrelere taşabilecek iki boyutlu bir dizi döndürecek şekilde değiştirmeyi düşünebilirsiniz.

Örneğin, yukarıda gösterilen DOUBLE() işlevi, tek bir hücreyi veya hücre aralığını kabul edecek şekilde 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 işlevini 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 işlevini yalnızca bir kez çağırabilirsiniz ancak işlevin aynı anda çok sayıda hücre için hesaplama yapmasını sağlayabilirsiniz (aşağıdaki ekran görüntüsünde gösterildiği gibi). (Aynı işlemi 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çerikleri verimli bir şekilde getirir ve yalnızca tek bir işlev çağrısıyla iki sütunluk sonuç görüntülemek için iki boyutlu bir dizi kullanır. Her hücrenin kendi işlev çağrısını gerektirmesi durumunda, Apps Script sunucusunun her seferinde XML feed'ini indirip ayrıştırması gerektiğinden işlem çok daha uzun sürer.

/**
 * 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, bir e-tabloda tekrar tekrar kullanılan hemen hemen her özel işleve uygulanabilir. Ancak uygulama ayrıntıları, işlevin davranışına bağlı olarak değişir.