Google Apps Komut Dosyasında konsola mı yazdırıyorsunuz?


89

Programlamada çok yeniyim (Codecademy'deki JS derslerinden bazılarını aldım). Bir poker oyununun sonuçlarını içeren bir elektronik tablo verilirse, kimin kime ödeme yapması gerektiğini belirlemek için basit bir komut dosyası oluşturmaya çalışıyorum. Google Apps Komut Dosyasını açtım ve başlamak için şunları yazdım:

function addplayerstoArray(numplayers) {

  var playerArray = [];

  for (i=0; i<numplayers; i++) {
    playerArray.push(i);
  }
}  

addplayerstoArray(7);

console.log(playerArray[3])

Fikir, içindeki toplam oyuncu sayısıyla bir dizi oluşturmaktır. Kodu çalıştırırken konsola "3" yazacağını düşündüm. Ama hiçbir şey olmadı. O dedi

"ReferenceError:" konsol "tanımlı değil."

A) Google Apps Komut Dosyası konsolunun yazdırmayla ilgili olarak nasıl çalıştığı konusunda neyi anlamıyorum, böylece kodumun istediğimi gerçekleştirip gerçekleştirmediğini görebilir miyim?

B) Kodla ilgili bir sorun mu var?

Yanıtlar:


144

Kod tarayıcınızda değil bulutta çalıştığı için konsol kullanılamıyor. Bunun yerine, GAS tarafından sağlanan Logger sınıfını kullanın :

Logger.log(playerArray[3])

ve ardından IDE'de Görünüm> Günlükler ... altında sonuçları görüntüleyin.

GAS ile oturum açmayla ilgili bazı belgeler .

Düzenleme: 2017-07-20 Apps komut dosyası artık Stackdriver Logging de sağlıyor . Bu günlükleri, komut dosyası düzenleyicisinde Görünüm - Konsol Günlükleri altında görüntüleyin.


28
Elektronik tablolar için işlev yazarken bu nasıl yapılır? Günlük çıktısının nereye gittiğini bulamıyorum.
TechplexEngineer

4
Çok yardımcı oldu. Teşekkür ederim! Şimdi, yalnızca günlük canlı güncelleme ise ve hızlı test için kullanılmayan bir konumdaysa.
kevincoleman

1
Peki ya bir HTML şablonunda?
Trevor

1
Elektronik tablolarda, çıktıyı MsgBox ile bir açılır pencereye veya Kenar Çubuğu ile bir kenar çubuğuna yerleştirebilirsiniz. Ayrıca onu yolun dışında bir yere de koyabilirsiniz.
vinnief

Burada oturum açma elektronik tablolar için BetterLog kitaplığına
Igor Savinkin

17

Sadece vinnief'in yukarıdaki hacky çözümünü geliştirmek için MsgBox'ı şu şekilde kullanıyorum:

Browser.msgBox('BorderoToMatriz', Browser.Buttons.OK_CANCEL);

ve bir tür kırılma noktası gibi davranır, betiği durdurur ve ihtiyacınız olan dizeyi bir açılır kutuya çıkarır. Özellikle Logger.log ile sorun yaşadığım E-Tablolar'da bu çoğu zaman yeterli bir geçici çözüm sağlıyor.


12

Logger.log()Teknik olarak konsola bir şey göndermenin doğru yolu olsa da , birkaç sıkıntısı var:

  1. Çıktı yapılandırılmamış bir karışıklık olabilir ve hızlı bir şekilde sindirilmesi zor olabilir.
  2. Önce komut dosyasını çalıştırmanız, ardından fazladan iki tıklama olan Görüntüle / Günlükleri tıklamanız gerekir (Ctrl + Enter klavye kısayolunu hatırlarsanız bir tane).
  3. Eklemelisiniz Logger.log(playerArray)ve ardından hata ayıkladıktan sonra muhtemelen kaldırmak isteyeceksinizLogger.log(playerArray)Eklemeniz , dolayısıyla ek 1-2 adım daha.
  4. Kaplamayı kapatmak için Tamam'a tıklamanız gerekir (yine bir ekstra tıklama).

Bunun yerine, bir şeyde hata ayıklamak istediğimde kesme noktaları ekliyorum (satır numarasına tıklayın) ve Hata Ayıkla düğmesine (hata simgesi) basıyorum. Kesme noktaları, bir değişkene bir şey atadığınızda iyi çalışır, ancak bir değişkeni başlattığınızda ve daha sonraki bir noktada onun içine bakmak istediğinizde çok iyi değildir, bu işlemin yapmaya çalıştığı şeye benzer. Bu durumda, bir çalışma zamanı hatası atmak için "x" (x noktayı işaretler!) Girerek bir kırılma koşulunu zorlardım:

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

Günlükleri görüntülemekle karşılaştırın:

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

Hata Ayıklama konsolu daha fazla bilgi içerir ve Günlükleri yer paylaşımına göre okunması çok daha kolaydır. Bu yöntemin küçük bir avantajı, kodunuzu temiz tutmak sizin işinizse, kodunuzu bir dizi günlük komutuyla kirletme konusunda asla endişelenmenize gerek kalmamasıdır. "X" girseniz bile, hata ayıklama işleminin bir parçası olarak onu kaldırmayı hatırlamak zorunda kalırsınız, aksi takdirde kodunuz çalışmaz (yerleşik temizleme ölçüsü, yay).


1
eklemek x, eklemeyle aynı işlevsellik olacaktırdebugger;
JSDBroughton

Tamamen katılıyorum. Logger.log, Debug ile karşılaştırıldığında kullanışlı değildir.
Steve Gon

10

OP sorularını cevaplamak

A) Google Apps Komut Dosyası konsolunun yazdırmayla ilgili olarak nasıl çalıştığı konusunda neyi anlamıyorum, böylece kodumun istediğimi gerçekleştirip gerçekleştirmediğini görebilir miyim?

Bir Google Apps Komut Dosyası projesinin .gs dosyalarındaki kod, web tarayıcısı yerine sunucuda çalışır. Mesajları günlüğe kaydetmenin yolu Class Logger'ı kullanmaktı .

B) Kodla ilgili bir sorun mu var?

Hata mesajının dediği gibi, sorun consoletanımlanmamıştı, ancak günümüzde aynı kod başka bir hatayı atacak:

ReferenceError: "playerArray" tanımlı değil. (satır 12, dosya "Kod")

Bunun nedeni playerArray'in yerel değişken olarak tanımlanmasıdır. Satırı işlevin dışına taşımak bunu çözecektir.

var playerArray = [];

function addplayerstoArray(numplayers) {
  for (i=0; i<numplayers; i++) {
    playerArray.push(i);
  }
}  

addplayerstoArray(7);

console.log(playerArray[3])

Artık kod hata vermeden yürütüldüğüne göre, tarayıcı konsoluna bakmak yerine Stackdriver Logging'e bakmalıyız. Google Apps Komut Dosyası düzenleyici kullanıcı arayüzünden Görünüm> Stackdriver Logging'i tıklayın. .

Ek

2017'de Google, Stackdriver Logging'i tüm komut dosyalarına yayınladı ve Sınıf Konsolu'nu ekledi. console.log('Hello world!') bir hata vermeyecek ancak günlük, tarayıcı konsolu yerine Google Cloud Platform Stackdriver Logging Hizmeti'nde olacak.

Gönderen Google Apps Komut Sürüm Notları 2017

23 Haziran 2017

Stackdriver Logging , Erken Erişim'den çıkarıldı. Artık tüm komut dosyalarının Stackdriver günlük kaydına erişimi var.

Gönderen Günlüğü> Stackdriver günlüğü

Aşağıdaki örnek, Stackdriver'daki bilgileri günlüğe kaydetmek için konsol hizmetinin nasıl kullanılacağını gösterir .

function measuringExecutionTime() {
  // A simple INFO log message, using sprintf() formatting.
  console.info('Timing the %s function (%d arguments)', 'myFunction', 1);

  // Log a JSON object at a DEBUG level. The log is labeled
  // with the message string in the log viewer, and the JSON content
  // is displayed in the expanded log structure under "structPayload".
  var parameters = {
      isValid: true,
      content: 'some string',
      timestamp: new Date()
  };
  console.log({message: 'Function Input', initialData: parameters});

  var label = 'myFunction() time';  // Labels the timing log entry.
  console.time(label);              // Starts the timer.
  try {
    myFunction(parameters);         // Function to time.
  } catch (e) {
    // Logs an ERROR message.
    console.error('myFunction() yielded an error: ' + e);
  }
  console.timeEnd(label);      // Stops the timer, logs execution duration.
}

6

Bir google komut dosyası projesinde html dosyaları (örnek: index.html) veya gs dosyaları (örnek: code.gs) oluşturabilirsiniz. .Gs dosyaları sunucuda yürütülür ve @Peter Herrman'ın tanımladığı gibi Logger.log'u kullanabilirsiniz. Ancak işlev bir .html dosyasında oluşturulursa, kullanıcının tarayıcısında yürütülür ve console.log'u kullanabilirsiniz. Chrome tarayıcı konsolu görüntülenebilir Mac, Windows / Linux veya Cmd Opt J Ctrl Shift J tarafından

Bir html dosyası üzerinde Logger.log kullanmak istiyorsanız bir kullanabilirsiniz scriptlet html dosyasından Logger.log işlevi çağırmak için. Bunu yapmak için <? Logger.log (bir şey)?> Bir şeyi günlüğe kaydetmek istediğiniz şeyle değiştirmek. <? Sözdizimini kullanan standart komut dosyaları ...?>, sayfaya açıkça içerik çıktısı vermeden kodu yürütü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.