Mencetak ke konsol di Google Apps Script?

89

Saya sangat baru dalam pemrograman (telah mengambil beberapa kursus JS di Codecademy). Saya mencoba membuat skrip sederhana untuk menentukan, jika diberi spreadsheet dengan hasil dari permainan poker, siapa yang harus membayar siapa. Saya membuka Google Apps Script, dan menulis yang berikut ini untuk memulai:

function addplayerstoArray(numplayers) {

  var playerArray = [];

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

addplayerstoArray(7);

console.log(playerArray[3])

Idenya adalah membuat larik dengan jumlah total pemain di dalamnya. Saat menjalankan kode, saya pikir itu akan mencetak "3" ke konsol. Tetapi tidak ada yang terjadi. Itu berkata

"ReferenceError:" console "tidak ditentukan."

A) Apa yang tidak saya mengerti tentang cara kerja Konsol Skrip Google Apps terkait dengan pencetakan sehingga saya dapat melihat apakah kode saya mencapai apa yang saya inginkan?

B) Apakah ada masalah dengan kode?

jim_shook
sumber

Jawaban:

144

Konsol tidak tersedia karena kode berjalan di awan, bukan di browser Anda. Sebagai gantinya, gunakan kelas Logger yang disediakan oleh GAS:

Logger.log(playerArray[3])

lalu lihat hasilnya di IDE di bawah View> Logs ...

Berikut beberapa dokumentasi tentang logging dengan GAS .

Edit: Skrip Apps 2017-07-20 sekarang juga menyediakan Stackdriver Logging . Lihat log ini di editor skrip di bawah Lihat - Log Konsol.

Peter H.
sumber
28
Bagaimana ini dilakukan saat menulis fungsi untuk spreadsheet? Saya tidak dapat menemukan kemana perginya keluaran logging.
TechplexEngineer
4
Sangat membantu. Terima kasih! Sekarang jika hanya log yang diperbarui secara langsung dan berada di lokasi terpencil untuk pengujian cepat.
kevincoleman
1
Bagaimana dengan template HTML?
Trevor
1
Di spreadsheet, Anda dapat meletakkan hasilnya ke popup dengan MsgBox, atau di sidebar dengan Sidebar. Anda juga bisa meletakkannya di tempat yang tidak terlihat.
vinnief
Untuk pencatatan spreadsheet di sini sesuai dengan perpustakaan BetterLog
Igor Savinkin
17

Hanya untuk membangun solusi hacky vinnief di atas, saya menggunakan MsgBox seperti ini:

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

dan berfungsi seperti break point, menghentikan skrip dan mengeluarkan string apa pun yang Anda butuhkan ke kotak pop-up. Saya menemukan terutama di Sheets, di mana saya mengalami masalah dengan Logger.log, ini memberikan solusi yang memadai hampir setiap kali.

skathan
sumber
12

Meskipun Logger.log()secara teknis adalah cara yang benar untuk mengeluarkan sesuatu ke konsol, ada beberapa gangguan:

  1. Hasilnya bisa berupa kekacauan yang tidak terstruktur dan sulit dicerna dengan cepat.
  2. Anda harus menjalankan skrip terlebih dahulu, lalu klik Lihat / Log, yang merupakan dua klik tambahan (satu jika Anda ingat pintasan keyboard Ctrl + Enter).
  3. Anda harus memasukkan Logger.log(playerArray), dan kemudian setelah debugging Anda mungkin ingin menghapusLogger.log(playerArray) , maka tambahan 1-2 langkah lagi.
  4. Anda harus mengklik OK untuk menutup overlay (klik ekstra lagi).

Sebaliknya, setiap kali saya ingin men-debug sesuatu, saya menambahkan breakpoint (klik pada nomor baris) dan tekan tombol Debug (ikon bug). Breakpoint bekerja dengan baik ketika Anda menetapkan sesuatu ke variabel, tetapi tidak begitu baik ketika Anda memulai variabel dan ingin mengintip ke dalamnya nanti, yang mirip dengan apa yang op coba lakukan. Dalam kasus ini, saya akan memaksa kondisi istirahat dengan memasukkan "x" (x menandai tempat!) Untuk memunculkan kesalahan waktu proses:

masukkan deskripsi gambar di sini

Bandingkan dengan melihat Log:

masukkan deskripsi gambar di sini

Konsol Debug berisi lebih banyak informasi dan jauh lebih mudah dibaca daripada hamparan Log. Satu keuntungan kecil dengan metode ini adalah Anda tidak perlu khawatir mencemari kode Anda dengan banyak perintah logging jika menjaga kode tetap bersih adalah hal Anda. Bahkan jika Anda memasukkan "x", Anda dipaksa untuk mengingat untuk menghapusnya sebagai bagian dari proses debugging atau kode Anda tidak akan berjalan (built-in cleanup measure, yay).

thdoan
sumber
1
menambahkan xakan menjadi fungsi yang sama seperti menambahkandebugger;
JSDBroughton
Setuju. Logger.log tidak berguna dibandingkan dengan Debug.
Steve Gon
10

Menjawab pertanyaan OP

A) Apa yang tidak saya mengerti tentang cara kerja Konsol Skrip Google Apps terkait dengan pencetakan sehingga saya dapat melihat apakah kode saya mencapai apa yang saya inginkan?

Kode pada file .gs dari proyek Skrip Google Apps dijalankan di server, bukan di browser web. Cara untuk mencatat pesan adalah dengan menggunakan Class Logger .

B) Apakah ada masalah dengan kode?

Seperti yang dikatakan pesan kesalahan, masalahnya adalah consoleitu tidak ditentukan tetapi saat ini kode yang sama akan memunculkan kesalahan lain:

ReferenceError: "playerArray" tidak ditentukan. (baris 12, file "Kode")

Itu karena playerArray didefinisikan sebagai variabel lokal. Memindahkan garis keluar dari fungsi akan menyelesaikan masalah ini.

var playerArray = [];

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

addplayerstoArray(7);

console.log(playerArray[3])

Sekarang kode dijalankan tanpa menimbulkan error, sebagai gantinya untuk melihat konsol browser, kita harus melihat Stackdriver Logging. Dari UI editor Google Apps Script, klik Tampilan> Stackdriver Logging .

Tambahan

Pada 2017 Google merilis ke semua skrip Stackdriver Logging dan menambahkan Konsol Kelas, jadi termasuk sesuatu seperti console.log('Hello world!') tidak akan menimbulkan kesalahan tetapi log akan ada di Layanan Logging Stackdriver Google Cloud Platform, bukan konsol browser.

Dari Catatan Rilis Skrip Google Apps 2017

23 Juni 2017

Stackdriver Logging telah dipindahkan dari Akses Awal. Semua skrip sekarang memiliki akses ke Stackdriver logging.

Dari Logging> Stackdriver logging

Contoh berikut menunjukkan cara menggunakan layanan konsol untuk mencatat informasi di Stackdriver.

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.
}
Rubén
sumber
6

Dalam proyek skrip google Anda dapat membuat file html (contoh: index.html) atau file gs (contoh: code.gs). File .gs dijalankan di server dan Anda dapat menggunakan Logger.log seperti yang dijelaskan oleh @Peter Herrman. Namun jika fungsi dibuat dalam file .html, itu sedang dijalankan di browser pengguna dan Anda dapat menggunakan console.log. Konsol browser Chrome dapat dilihat dengan Ctrl Shift J di Windows / Linux atau Cmd Opt J di Mac

Jika Anda ingin menggunakan Logger.log pada file html, Anda dapat menggunakan scriptlet untuk memanggil fungsi Logger.log dari file html. Untuk melakukannya, Anda akan memasukkan <? Logger.log (sesuatu)?> Mengganti sesuatu dengan apapun yang ingin Anda catat. Scriptlet standar, yang menggunakan sintaks <? ...?>, jalankan kode tanpa secara eksplisit mengeluarkan konten ke halaman.

Tanya Gupta
sumber
2

Diperbarui untuk 2020

Pada bulan Februari 2020, Google mengumumkan peningkatan besar - besaran ke Google Apps Script IDE bawaan, dan sekarang mendukung console.log () . Jadi, Anda sekarang dapat menggunakan keduanya:

  1. Logger.log ()
  2. console.log ()

Selamat membuat kode!

Davis Jones
sumber
console.logdidukung sebelum peningkatan yang dirujuk (lihat jawaban saya )
Rubén