Google Apps Komut Dosyasında nasıl hata ayıklanır (diğer bir deyişle, Logger.log nereye giriş yapar?)


129

Google E-Tablolar'da bazı komut dosyası işlevlerini ekleyebilirsiniz. onEditEtkinlik için bir şeyler ekliyorum ama işe yarayıp yaramadığını anlayamıyorum. Anlayabildiğim kadarıyla, Google E-Tablolar'dan canlı bir olayda hata ayıklayamazsınız, bu yüzden bunu hata ayıklayıcıdan yapmanız gerekir, bu anlamsızdır çünkü işlevime iletilen olay argümanı onEdit(), eğer onu Script Editor.

Bu yüzden, işlev Logger.logher onEditçağrıldığında bazı verileri kaydetmek için yöntemi kullanmaya çalışıyordum , ancak bu da yalnızca Script Editor. Şuradan çalıştırdığımda Script Editor, günlükleri şu adrese giderek görüntüleyebiliyorum:View->Logs...

Olay gerçekten yürütüldüğünde günlükleri görebileceğimi umuyordum, ancak çözemiyorum.

Bu şeylerde nasıl hata ayıklayabilirim?


3
Burada da aynı sorun var - kabul edilen cevap yanıt vermiyor ancak pek çok açık yanlış bilgi veriyor.
Hippyjim

Görünüşe göre bunu şimdi düzelttiler. E-tablonuzdan Komut Dosyası Düzenleyicisi'ni açtığınız sürece, Sayfanızdaki öğeleri çalıştırdığınızda bu sekmeyi açık bırakın. Ardından komut dosyası sekmesine geri dönün ve içinde Günlük bilgisi bulunacaktır.
phreakhead

2
TLDR; kopyala, yapıştır ve çalıştırLogger.log('firstLog');MailApp.sendEmail({to:'yourEmailAddressHere@someone.com',subject: "subject here ^_^",body: Logger.getLog()});
Coty Embry

Maby, kabul edilen cevabı değiştirmeli veya Stackdriver Logging'in mevcut olduğuna dair bir not eklemelisiniz.
botenvouwer

Yanıtlar:


83

GÜNCELLEME:

Bu cevapta yazıldığı gibi ,


Logger.logya size komut dosyalarınızda meydana gelen hataların bir e-postasını (en sonunda) gönderir ya da bir şeyler Script Editorçalıştırıyorsanız, son çalıştırılan işlevin günlüğünü View->Logs(hala komut dosyası düzenleyicide) seçeneğine giderek görüntüleyebilirsiniz . Yine, bu size yalnızca içeridenScript Editor çalıştırdığınız son işlevden kaydedilen her şeyi gösterecektir .

Çalışmaya çalıştığım komut dosyası elektronik tablolarla ilgiliydi - öğeleri önceliklere ve benzerlerine göre sıralayan bir elektronik tablo yapılacaklar listesi türü bir şey yaptım.

Bu komut dosyası için yüklediğim tek tetikleyiciler onOpen ve onEdit tetikleyicileriydi. OnEdit tetikleyicisinin hatalarını ayıklamak, anlaşılması en zor olanıydı, çünkü onEdit işlevimde bir kesme noktası belirlersem, elektronik tabloyu açarsam, bir hücreyi düzenlersem, kesme noktamın tetikleneceğini düşünmeye devam ettim. Olay bu değil.

Bir hücreyi düzenlenebilir olan simüle etmek için, ben yaptım gerçi gerçek elektronik tabloda bir şey yapmak zorunda sonunda. Tek yaptığım, onu "düzenlenmiş" olarak değerlendirmesini istediğim hücrenin seçildiğinden emin olmaktı, sonra Script Editoriçeri girecektim Run->onEdit. O zaman kesme noktam vurulacak.

Ancak, onEdit işlevine aktarılan olay bağımsız değişkenini kullanmayı bırakmak zorunda kaldım - bunu yaparak bunu simüle edemezsiniz Run->onEdit. Elektronik tablodan ihtiyacım olan herhangi bir bilgi, örneğin hangi hücrenin seçildiği vb. Manuel olarak çözmem gerekiyordu.

Her neyse, uzun cevap, ama sonunda anladım.


DÜZENLEME :

Yaptığım yapılacaklar listesini görmek isterseniz buradan kontrol edebilirsiniz.

(evet, herkesin düzenleyebileceğini biliyorum - paylaşmanın amacı bu!)

Senaryoyu da görmene izin vereceğini umuyordum. Orada göremediğiniz için, işte burada:

function onOpen() {
  setCheckboxes();
};

function setCheckboxes() {
  var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
  var checklist_data_range = checklist.getDataRange();
  var checklist_num_rows = checklist_data_range.getNumRows();
  Logger.log("checklist num rows: " + checklist_num_rows);

  var coredata = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
  var coredata_data_range = coredata.getDataRange();

  for(var i = 0 ; i < checklist_num_rows-1; i++) {
    var split = checklist_data_range.getCell(i+2, 3).getValue().split(" || ");
    var item_id = split[split.length - 1];
    if(item_id != "") {
      item_id = parseInt(item_id);
      Logger.log("setting value at ("+(i+2)+",2) to " + coredata_data_range.getCell(item_id+1, 3).getValue());
      checklist_data_range.getCell(i+2,2).setValue(coredata_data_range.getCell(item_id+1, 3).getValue());
    }
  }
}

function onEdit() {
  Logger.log("TESTING TESTING ON EDIT");
  var active_sheet = SpreadsheetApp.getActiveSheet();
  if(active_sheet.getName() == "checklist") {
    var active_range = SpreadsheetApp.getActiveSheet().getActiveRange();
    Logger.log("active_range: " + active_range);
    Logger.log("active range col: " + active_range.getColumn() + "active range row: " + active_range.getRow());
    Logger.log("active_range.value: " + active_range.getCell(1, 1).getValue());
    Logger.log("active_range. colidx: " + active_range.getColumnIndex());
    if(active_range.getCell(1,1).getValue() == "?" || active_range.getCell(1,1).getValue() == "?") {
      Logger.log("made it!");
      var next_cell = active_sheet.getRange(active_range.getRow(), active_range.getColumn()+1, 1, 1).getCell(1,1);
      var val = next_cell.getValue();
      Logger.log("val: " + val);
      var splits = val.split(" || ");
      var item_id = splits[splits.length-1];
      Logger.log("item_id: " + item_id);

      var core_data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
      var sheet_data_range = core_data.getDataRange();
      var num_rows = sheet_data_range.getNumRows();
      var sheet_values = sheet_data_range.getValues();
      Logger.log("num_rows: " + num_rows);

      for(var i = 0; i < num_rows; i++) {
        Logger.log("sheet_values[" + (i) + "][" + (8) + "] = " + sheet_values[i][8]);
        if(sheet_values[i][8] == item_id) {
          Logger.log("found it! tyring to set it...");
          sheet_data_range.getCell(i+1, 2+1).setValue(active_range.getCell(1,1).getValue());
        }
      }

    }
  }

  setCheckboxes();
};

Pff, günlük kaydı yalnızca postada görünecek mi? Bu tür, tüm bu hata ayıklama ve günlüğe kaydetme özelliklerini işe yaramaz hale getirir, çünkü elektronik tablodaki gerçek verileri etkili bir şekilde kullanamayız.
MrFox

Hayır. Yazarın dediği gibi, günlük kaydı günlükte mevcuttur (Komut Dosyası Düzenleyici, Görünüm, Günlük veya Ctrl-Enter)
rainabba

9
@rainabba Evet, günlük kaydı Komut Dosyası Düzenleyicisinde mevcuttur. Bununla birlikte, bir komut dosyası olay bağımsız değişkenine bağlı olduğunda ve olay bağımsız değişkeni Komut Dosyası Düzenleyicisi'nde bulunmadığında, bu, bu tür komut dosyalarını geliştirenlerin günlüklere gerçek zamanlı erişim yollarının olmadığı anlamına gelir.
Jeff

1
Daha önce yorum yapamadım, bu yüzden aşağıda bir cevap verdim, ancak: Komut dosyası düzenleyicisini açarsanız ve açık elektronik tabloda bir olay tetiklerseniz, komut dosyası düzenleyici tarayıcı örneğine geri dönebilir ve Günlüklerde bilgileri görebilirsiniz. . Komut dosyasını açamayan veya oturum açamayacağınız bir kullanıcı altında bir şeyi test etmeniz gerekmediği sürece iyi çalışır.
Karl_S

1
Bu cevap güncel değildir ve kabul edilen cevap olarak görülmemelidir. Stackdriver Logging mevcuttur ve harika çalışır. Rastgele parçalı cevaba bir göz atın!
botenvouwer

34

Anlayabildiğim kadarıyla, google docs'tan canlı bir olayda hata ayıklayamazsınız, bu yüzden bunu hata ayıklayıcıdan yapmanız gerekir, bu anlamsızdır çünkü onEdit () fonksiyonuma iletilen olay argümanı çalıştırırsam her zaman tanımsız olacaktır. Komut Dosyası Düzenleyiciden.

Doğru - bu nedenle hata ayıklama için olay bağımsız değişkenini kendiniz tanımlayın. Bkz . GAS'ta bir tetikleme işlevini nasıl test edebilirim?

OnEdit işlevi her çağrıldığında bazı verileri kaydetmek için Logger.log yöntemini kullanmaya çalışıyordum, ancak bu da yalnızca Script Editor'dan çalıştırıldığında çalışıyor gibi görünüyor. Komut Dosyası Düzenleyiciden çalıştırdığımda, Günlükleri Görüntüle-> Günlükler ... seçeneğine giderek görüntüleyebiliyorum.

Yine doğru, ama yardım var. Peter Hermann'ın BetterLog kütüphanesi , tüm günlükleri bir elektronik tabloya yönlendirerek, düzenleyicinin / hata ayıklayıcının bir örneğine eklenmemiş koddan bile günlüğe kaydetmeyi mümkün kılar .

Örneğin, elektronik tablo içeren bir komut dosyasında kodlama yapıyorsanız, komut dosyası dosyanızın en üstüne yalnızca bu bir satırı ekleyebilirsiniz ve tüm günlükler elektronik tablodaki "Günlükler" sayfasına gider. Başka bir kod gerekmez, yalnızca Logger.log()normalde yaptığınız gibi kullanın :

Logger = BetterLog.useSpreadsheet();

1
Demode. console.log()şimdi en iyi cevap olmalı
TheMaster

22

2017 Güncellemesi: Stackdriver Logging artık Google Apps Komut Dosyası için kullanılabilir. Komut dosyası düzenleyicideki menü çubuğundan View > Stackdriver Logging, günlükleri görüntülemek veya akışa almak için gidin:.

console.log ()DEBUG seviye mesajları yazacak

Örnek onEdit()günlük kaydı:

function onEdit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    range:  e.range.getA1Notation(),    
    source:  e.source.getId(),
    user:  e.user,   
    value:  e.value,
    oldValue: e. oldValue
  }

  console.log({message: 'onEdit() Event Object', eventObject: debug_e});
}

Ardından çıktıyı görmek için Stackdriver UI etiketli günlükleri kontrol edinonEdit() Event Object


Orijinal soru özellikle soruyor Logger.log. Bunun kullandığınızdan ne farkı var console.log? Aletler konusunda çok yeniyim, bu yüzden sadece her şeyin ne olduğunu anlamaya çalışıyorum.
AnnanFay

5

Biraz karmaşık ama "konsol" adında bir dizi oluşturdum ve konsola çıktı vermek istediğimde diziye gönderdim. Sonra ne zaman gerçek çıktıyı görmek istesem, daha önce döndüğüm şey consoleyerine geri döndüm .

    //return 'console' //uncomment to output console
    return "actual output";
}

in js console.log('smth')mükemmel çalışıyor, peki ya GAS'ta?
Igor Savinkin

1
console.log basitçe çalışmaz çünkü GAS, elektronik tablonuzla aynı web sayfasında çalışan komut dosyaları değildir, bunlar Google'ın uygulama motoru tarafından yönetilen komut dosyalarıdır, bu nedenle onların kullanışsız Logger.log hata ayıklayıcısını izlemeniz veya benimki gibi bir hack kullanmanız gerekir
woojoo666

'konsol' dizinize ne dersiniz? Ne zaman I just returned consolenasılsın çıktı bunu yapmak?
Igor Savinkin

2
Maalesef çok iyi açıklamadım, ancak esasen elektronik tablo işlevleri değeri hücreye döndürür, bu nedenle "konsolunuzu" döndürürseniz, elektronik tablo hücrenizde oturum açtığınız her şeyi göreceksiniz
woojoo666

5

Komut dosyası düzenleyiciniz açıksa, günlükleri Görünüm-> Günlükler altında göreceksiniz. Komut dosyanızın bir düzenleme tetikleyicisi varsa, ikinci bir sekmede açılan komut dosyası düzenleyicisi ile işlevi tetiklemesi gereken elektronik tabloda bir değişiklik yapın. Ardından komut dosyası düzenleyici sekmesine gidin ve günlüğü açın. Fonksiyonunuzun kaydediciye ne geçtiğini göreceksiniz.

Temel olarak komut dosyası düzenleyicisi açık olduğu sürece, olay günlüğe yazacak ve sizin için gösterecektir. Dosyada başka birinin olup olmadığı gösterilmez.


5

Bu gönderileri inceledim ve bir şekilde basit bir cevap buldum, kısa ve tatlı çözümler isteyenler için buraya gönderiyorum:

  1. console.log("Hello World")Senaryonuzda kullanın .
  2. Https://script.google.com/home/my adresine gidin ve eklentinizi seçin.
  3. Proje Ayrıntıları üzerindeki üç nokta menüsüne tıklayın, Yürütmeler'i seçin.

görüntü açıklamasını buraya girin

  1. En son uygulamanın başlığına tıklayın ve günlüğü okuyun.

görüntü açıklamasını buraya girin


Bu, Nisan 2019'dan sonra oluşturulan Google Apps Komut Dosyaları için temel "Stackdriver günlük kaydı" dır (bu, Apps Komut Dosyalarının arkasındaki "otomatik" projeler için Google Cloud Projesine erişim imkansız hale geldiğinde). Bir Apps Komut Dosyası projesi için GCP'yi değiştirirseniz normal Stackdriver günlük kaydı yanıtları geçerli olur.
tehhowch

1
Burada yalnızca doğrudan yürütmeleri görüyorum (yani komut dosyası düzenleyicide "çalıştır" ı tıkladığım), ancak sayfadaki veri değişikliğinin neden olduğu yürütmeleri görmüyorum. Bunlarda nasıl hata ayıklarım?
Cris70

Bunu denemedim üzgünüm. Sayfadaki bir değişiklik bir işlevi tetiklediğinde ve işlevin bir günlüğü varsa, günlüğün birlikte gösterileceğini hayal ediyorum. Değişiklikler her zaman kullanıcı kaynaklı olacaktır, değil mi?
Benjamin

1
Evet, bunu ben de hayal ederdim. Ne yazık ki böyle olmuyor :-( Verilerdeki değişiklikler işlevimi tetikliyor, ancak console.log () mesajları Stackdriver günlüğünde gösterilmiyor. Bir değişiklik üzerine etkinleştirici eklemeyi denedim, ancak bu, işlevimi parametresiz olarak çağırıyor: - (
Cris70

4

Ben de aynı sorunu yaşıyorum, aşağıdakileri internette bir yerde buldum ....

Yine de Dokümanlar'daki olay işleyicileri biraz yanıltıcıdır. Dokümanlar, birden çok kullanıcı tarafından aynı anda yapılan birden çok düzenlemeyi işleyebildiğinden, olay işleyicileri sunucu tarafında işlenir. Bu yapıyla ilgili en büyük sorun, bir olay tetikleyici komut dosyası başarısız olduğunda sunucuda başarısız olmasıdır. Hata ayıklama bilgilerini görmek istiyorsanız, tetikleyiciler menüsü altında, olay başarısız olduğunda hata ayıklama bilgilerini size e-postayla gönderen açık bir tetikleyici kurmanız gerekir, aksi takdirde sessizce başarısız olur.


Hmm, evet, bununla karşılaştım - ertesi sabah senaryomdaki bir sürü hatayı bana e-postayla gönderdi. Yine de
çözmeyi başardım (

1

Zarif olmaktan uzaktır, ancak hata ayıklama sırasında genellikle Logger'da oturum açarım ve ardından içeriğini getirmek için getLog () kullanırım. Sonra ben de:

  • Bir değişkene sonuçları kaydetmek (Google Scripts kontrol edilebilir bazı kodunda bir kesme noktası ayarlayamıyor durumlarda etrafında eserler bu-ayıklayıcı ama olabilir sonra işletilirse kodda birini ayarlayın)
  • bunu geçici bir DOM öğesine yazın
  • bir uyarıda göster

Esasen, sadece bir JavaScript çıktı sorunu haline gelir .

Modern console.log()uygulamaların işlevselliğinden büyük ölçüde yoksundur , ancak Logger yine de Google Script'lerde hata ayıklamaya yardımcı olur.


1

Sadece bir ihbar olarak. Elektronik tablom için bir test işlevi yaptım. OnEdit (e) işlevinde google atar değişkenini kullanıyorum (ben buna e adını verdim). Sonra şöyle bir test işlevi yaptım:

function test(){
var testRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,7)
var testObject = {
    range:testRange,
    value:"someValue"
}
onEdit(testObject)
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,6).setValue(Logger.getLog())
}

Bu test işlevinin çağrılması, tüm kodun elektronik tabloda bir olay olduğu gibi çalışmasını sağlar. Düzenlediğim hücrenin zilyedini koydum ve bana beklenmedik bir sonuç verdi, hücreye koyduğum değer olarak değeri belirledim. OBS! Google'ın işleve verdiği daha fazla değişken için buraya gidin: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events


0

Şu anda, dokümanlar içinde komut dosyası kullanmanın kapsayıcıya bağlı doğasıyla sınırlısınız. Dokümanların dışında yeni bir komut dosyası oluşturursanız, bilgileri bir Google elektronik tablosuna aktarabilir ve bir günlük kaydı aracı gibi kullanabilirsiniz.

Örneğin ilk kod bloğunuzda

function setCheckboxes() {

    // Add your spreadsheet data
    var errorSheet = SpreadsheetApp.openById('EnterSpreadSheetIDHere').getSheetByName('EnterSheetNameHere');
    var cell = errorSheet.getRange('A1').offset(errorSheet.getLastRow(),0);

    // existing code
    var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
    var checklist_data_range = checklist.getDataRange();
    var checklist_num_rows = checklist_data_range.getNumRows();

    // existing logger
    Logger.log("checklist num rows: " + checklist_num_rows);

   //We can pass the information to the sheet using cell.setValue()
    cell.setValue(new Date() + "Checklist num rows: " + checklist_num_rows);

GAS ile çalışırken, biri GAS ortamını, diğeri SS'yi içeren iki monitörüm var (iki pencere kullanabilirsiniz), böylece bilgi yazabilir ve kayıt yapabilirim.


0

Geliştirici konsolu, uygulama komut dosyası tarafından atılan hataları günlüğe kaydeder, böylece normal bir console.log olarak günlüğe kaydedilmesi için bir hata atabilirsiniz. Yürütmeyi durduracak, ancak yine de adım adım hata ayıklama için yararlı olabilir.

throw Error('hello world!');

konsolda benzer şekilde görünecek console.log('hello world')


0

e-tablo kodunuzda şu şekilde hata ayıklayın:

...
throw whatAmI;
...

şunun gibi gösterir:

görüntü açıklamasını buraya girin


Sanırım görüntünün özel bir işlevin nasıl bir hata gösterdiğini gösterdiğinden bahsetmelisiniz, ancak OP, basit bir tetikleyici ( onEdit) kullandığından bahsediyor
Rubén
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.