it-swarm.asia

Google Apps Komut Dosyasında özel bir işlevin hatalarını ayıklama

Apps Komut Dosyasında bir Google E-tablosu için ilk özel işlevimi oluşturmaya çalışıyorum ve hata ayıklayıcıyı kullanmakta zorlanıyorum.

custom function demo code üzerinde çalışıyorum ve Google dokümantasyonundan ve elektronik tablomun bir hücresinde kullanılan drivingDistance(Origin, destination) özel işlevinde bir kesme noktası belirledim. Benim sorunum, hata ayıklayıcının, işleve iletilen parametreleri undefined olarak göstermesidir. Yürütme sırasında oluşturulan diğer değişkenlerin içeriği olsa da doğru şekilde görüntülenir (giriş parametrelerine bağlı olmadıkları sürece).

Komik olan şey, girdi parametreleri tanımsız olarak gösterilmesine rağmen, işlevin hesaplamalarının başarılı olması, bu nedenle hata ayıklayıcı bir sorun gibi görünüyor. Ne yazık ki bu sorun, kendi kodumu oluşturmayı ve hata ayıklamayı başarıyla tamamlamamı engelliyor (karmaşık girdi parametreleriyle çalışmak zorunda kalacağım). 

Problemin Apps Script'in sunucu tarafından yürütülmesine bağlı olduğunu hissediyorum, bu yüzden Logger sınıfını kullanarak giriş parametrelerini kaydetmeye çalıştım ve bu değişkenleri yeni yerel değişkenlere kopyalamaya çalıştım. Ama geldiğim tek şey undefined idi.

Başka bir garip ipucu, parametrelerin typeof__ String değerini döndürür. Ancak bunların uzunluğunu almak bir hata veriyor ve onları başka bir dizeyle birleştirmeye çalışmak "tanımsız" dizesini döndürüyor (ekran dökümü bölümüne bakın).

enter image description here

Burada neler olup bittiğiyle ilgili görüşler arıyorum.

29
Jpsy

Hata ayıklayıcı muhtemelen size yalan söylemiyor - bu işlevi hata ayıklayıcıda başlatırsanız, kendisine hiçbir parametre iletilmeyecek. Endişelenmeyin, yine de, sadece hata ayıklama için kullanılacak değerler aldığınızdan emin olmanız gerekir. Şuna bir göz atın GAZ'da bir tetikleyici işlevini nasıl test edebilirim? , Özel işlevler için uygulanabilecek teknikleri gösterir.

İşleve iletilecek bir olay tanımlamak yerine, parametreler için değerler sağlamak (veya elektronik tablonuzdan almak) isteyeceksiniz.

function test_drivingDistance() {
  // Define a set of test values
  var testSet = [[ 'Washington, DC', 'Seattle, WA' ],
                 [ 'Ottawa, ON', 'Orlando, FL'],
                 [ 'Paris, France', 'Dakar, Senegal']];

  // Run multiple tests
  for (var test in testSet) {
    Logger.log('Test ' + test + ' = ' + drivingDistance(testSet[test][0],testSet[test][1]));
  }

  // Get parameters from sheet
  var TestFromSheet = drivingDistance(ss.getRange('A1').getValue(),ss.getRange('A2').getValue());
}

Kaptın bu işi. Kesme işlevlerini yine de işlevinizin içinde ayarlayabilir veya yürütmeyi duraklatmak için debugger öğesini kullanabilirsiniz.


Düzenleme - değişkenleri inceleme

Bir e-tablodan çağrıldığında özel fonksiyonun aldığı argümanlar nelerdir?

Hata ayıklamak için yapabileceklerinizle sınırlısınız, çünkü hata ayıklayıcı, Sayfalardan çağrıldığında özel işlevinizi incelemek için kullanılamıyor ve özel işlevlerde güvenlik sınırlamaları Günlük kaydını engelliyor. Genel olarak geçen bir argüman anlayışı elde etmek için yeterli olabilir. Javascript işlevleri adlandırılmış parametrelere sahip olsa da, tüm argümanlar arguments adı verilen Array benzeri bir nesne olarak iletilir. Bu özel işlev, alınan argümanları bildiren bir dizi döndürür. Bir e-tablodan çağrıldığında, her argüman, fonksiyona girdiğiniz hücreden başlayarak kendi hücresinde görünecektir:

function testArguments(  ) {
  var argArray = [];
  for (var arg in arguments) {
    argArray.Push("arguments[" + arg + "] = " + JSON.stringify(arguments[arg]))
  }

  return argArray;
}

Screenshot

Javascript'te, int veya float gibi türler yoktur - sadece Number. Bu parametreler üzerlerinde alıntı olmadan görünecek ve rakamlara benzeyecektir. Tarihler Date nesneleri olarak gelir, ancak bu şekilde yazdırıldığında Tarih-y dizeleri olarak görünür. Dizelerin tırnakları vardır.

Özel bir işlev hiçbir zaman bir argüman olarak bir aralık almaz; E-tabloda bir range parametresi sağladığınızda, içeriği bir veya iki boyutlu bir dizide toplanır ve dizi argümandır.

34
Mogsdad

Özel işleve gönderilen argümanların yapısını görmek için bu hack'i kullanabilirsiniz:

function TEST(input) {
  return (JSON.stringify(input));
}

Sonuçlar sayfanızda şöyle görünecek:

 enter image description here

0
Joseph Combs