it-swarm.asia

Google Apps Komut Dosyası hata ayıklama (aka Logger.log nerede oturum açar?)

Google E-Tablolar’da bazı komut dosyası işlevselliği ekleyebilirsiniz. onEdit olayı için bir şeyler ekliyorum, ancak işe yarayıp yaramadığını söyleyemem. Söyleyebildiğim kadarıyla, Google E-Tablolar’dan canlı bir etkinliği hata ayıklayamazsınız, bu nedenle hata ayıklayıcısından yapmanız gerekir; bu, onEdit() işlevime geçirdiğim olay argümanı tanımsız olacağı için anlamsızdır. Script Editor.

Böylece, onEdit işlevi çağrıldığında bazı verileri günlüğe kaydetmek için Logger.log yöntemini kullanmaya çalışıyordum, ancak bu da sadece Script Editor dosyasından çalıştırıldığında çalıştığı gibi görünüyor. Script Editor adresinden çalıştırdığımda, günlükleri View->Logs... adresine giderek görüntüleyebilirim

Olay gerçekten gerçekleştiği zamandan gelen kayıtları görebileceğimi umuyordum, ancak çözemiyorum.

Bu şeylerde nasıl hata ayıklayabilirim?

91
Markus Orreilly

UPDATE: 

This answer dilinde yazıldığı gibi 


Logger.log ya komut dosyalarınızda meydana gelen hataların bir e-postasını (sonunda) gönderir ya da, Script Editor adresinden bir şey çalıştırıyorsanız, günlüğü en son çalıştırma işlevinden View->Logs (hala komut dosyası düzenleyicisine) giderek görüntüleyebilirsiniz. . Yine, bu size yalnızca içinden koştuğunuz son işlevden Script Editor ile girilen her şeyi gösterir.

Çalışmaya çalıştığım komut dosyası, elektronik tablolarla ilgiliydi - Öğeleri önceliklere göre sıralayan bir elektronik tablo yapılacak kontrol listesi türü yaptım.

Bu komut dosyası için yüklediğim tek tetikleyici onOpen ve onEdit tetikleyicileriydi. OnEdit tetikleyicisini hata ayıklamak, en zor olanı bulmaktı, çünkü onEdit işlevimde bir kesme noktası ayarlarsam, elektronik tabloyu açtığımı, bir hücreyi düzenlediğimi, kesme noktamın tetikleneceğini düşündüm. Durum bu değil.

Bir hücreyi düzenlediğimi simüle etmek için, ben yaptım, gerçekte elektronik tabloda bir şeyler yapmak zorunda kaldı. Tek yaptığım, "düzenlenmiş" olarak değerlendirilmesini istediğim hücrenin seçildiğinden emin olmaktı, sonra Script Editor'da Run->onEdit 'a giderdim. O zaman benim kırılma noktam vurulacaktı.

Ancak, onEdit işlevine iletilen olay argümanını kullanmayı bırakmak zorunda kaldım - Run->onEdit yaparak bunu simüle edemezsiniz. Elektronik tablodan ihtiyaç duyduğum herhangi bir bilgi, hangi hücrenin seçildiğini, vb. Manuel olarak çözmem gerekiyordu.

Neyse, uzun cevap, ama sonunda anladım.


DÜZENLE:

Yaptığım yapılacak kontrol listesini görmek istiyorsanız, buradan kontrol edebilirsiniz

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

Senaryoyu da görmene izin vereceğini umuyordum. Orada göremediğiniz için 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();
};
67
Markus Orreilly

Söyleyebileceğim kadarıyla, google docs’lardan gelen canlı bir etkinliği hata ayıklayamazsınız, bu nedenle hata ayıklayıcısından bunu yapmanız gerekir; bu, onEdit () işlevine iletilen olay bağımsız değişkeninin her zaman tanımsız olacağı için anlamsızdır Script Editor'dan.

Doğru - bu nedenle olay argümanını hata ayıklama için tanımlayın. Bkz. GAZ'da tetik işlevini nasıl test edebilirim?

OnEdit işlevi çağrıldığında bazı verileri günlüğe kaydetmek için Logger.log yöntemini kullanmaya çalışıyordum, ancak bu da yalnızca Komut Dosyası Düzenleyicisi'nden çalıştırıldığında çalıştığı gibi görünüyor. Script Editor'dan çalıştırdığımda, View-> Logs ... 'a giderek günlükleri görüntüleyebilirim.

Yine doğru, ama yardım var. Peter Hermann'ın BetterLog kütüphanesi tüm günlükleri bir elektronik tabloya yönlendirecek ve editör/hata ayıklayıcı örneğine eklenmemiş olan koddan bile günlük kaydı yapabilecek. 

Örneğin, elektronik sayfa içeren bir komut dosyasında kodlama yapıyorsanız, komut dosyası dosyanızın başına yalnızca bir satır ekleyebilirsiniz; tüm günlükler, elektronik tabloda "Günlükler" sayfasına gider. Başka bir kod gerekmez, genellikle kullanacağınız gibi Logger.log() işlevini kullanın:

Logger = BetterLog.useSpreadsheet();
29
Mogsdad

2017 Güncellemesi:Stackdriver Logging artık Google Apps Komut Dosyası için kullanılabilir. Betik düzenleyicideki menü çubuğundan, günlükleri görüntülemek veya yayınlamak için goto: View > Stackdriver Logging.

console.log ()DEBUG level mesajlarını yazacaktır

Örnek onEdit() günlüğü:

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ısını görmek için Stackdriver UI labeled onEdit() Event Object içindeki günlükleri kontrol edin

11
random-parts

Komut dosyası düzenleyicisini açtıysanız, Günlükleri Görünüm-> Günlükler altında görürsünüz. Komut dosyanızın bir onedit tetikleyicisi varsa, ikinci bir sekmede açılan komut düzenleyicisiyle işlevi tetiklemesi gereken elektronik tabloda değişiklik yapın. Sonra script editörü 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. Başka bir yerde dosyada başka birisinin olup olmadığını göstermeyecektir.

5
Karl_S

Biraz taklit ediciyim ama "konsol" adında bir dizi yarattım, ve her ne zaman konsola çıktı vermek istediğimde diziye zorladım. Sonra ne zaman gerçek çıktısını görmek istediğimde, daha önce döndüğüm şey yerine console işlevini döndürdüm.

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

Aynı sorunu yaşıyorum, aşağıdaki web üzerinde bir yerde buldum ....

Dokümanlar'daki olay işleyicileri biraz zor olsa da. Dokümanlar, birden fazla kullanıcı tarafından aynı anda birden çok düzenlemeyi işleyebildiği için, olay işleyicileri sunucu tarafında ele alınır. Bu yapı ile ilgili ana sorun, bir olay tetikleyici komut dosyası başarısız olduğunda sunucuda başarısız olmasıdır. Hata ayıklama bilgisini görmek istiyorsanız, olay başarısız olduğunda size hata ayıklama bilgisini e-postayla gönderen tetikleyiciler menüsünde açık bir tetikleyici kurmanız gerekir, aksi takdirde sessizce başarısız olur.

3
Angus Keenan

Zarif olmaktan çok uzak, ancak hata ayıklama sırasında, genellikle Logger’a giriş yapıyorum ve ardından getLog () komutunu içeriğini almak için kullanıyorum. O zaman ben de:

  • sonuçları bir değişkene kaydedin (bu, Google Scripts hata ayıklayıcısında incelenebilir) - bu, bazı kodlarda bir kesme noktası belirleyemediğim durumlarda çalışır, ancak daha sonra çalıştırılacak kodda can ayarlayabilirim)
  • bazı geçici DOM öğelerine yaz
  • uyarısında

Temel olarak, sadece bir JavaScript çıktısı sorunu olur.

Modern console.log() uygulamalarının işlevselliğini fena halde görmezden geliyor, ancak Logger Google Script’lerin hatalarını gidermeye yardımcı oluyor.

1
Michael Scheper

Şu anda kabın içinde, dokümanlardaki komut dosyalarını kullanmanın doğası sınırlıdır. Dokümanların dışında yeni bir komut dosyası oluşturursanız, bilgileri bir Google e-tabloya dışa aktarabilir ve bir günlük 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 yazıp kayıt tutabiliyorum.

0
JForgie

Sadece bir haber olarak. Elektronik tablom için bir test işlevi yaptım. Onogledit (e) fonksiyonunda google throw değişkenini kullanıyorum (bunu e olarak adlandırdım). Sonra bö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 sınama işlevini çağırmak, elektronik tablodaki bir olayı yaptığınız gibi tüm kodu çalıştırır. Ben sadece düzenlediğim hücrenin sahipliğini koydum, beni beklenmedik bir sonuç verdi, değeri hücreye koyduğum değer olarak belirledim. OBS! daha fazla değişken için googles işlevi buraya getirir: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

0

Dev konsolu, uygulama betiği tarafından atılan hataları kaydeder, böylece normal bir konsol.log olarak kaydedilmesini sağlamak için bir hata atabilirsiniz. Yürütmeyi durduracak, ancak adım adım hata ayıklama için yararlı olabilir.

throw Error('hello world!');

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

0
qwerty

e-tablo kodunuzu şu şekilde ayıklayın:

...
throw whatAmI;
...

şunun gibi gösterir:

 enter image description here

0
Toskan