การพิมพ์ไปยังคอนโซลใน Google Apps Script หรือไม่


89

ฉันยังใหม่กับการเขียนโปรแกรมมาก (เคยเรียนหลักสูตร JS บางหลักสูตรใน Codecademy) ฉันพยายามสร้างสคริปต์ง่ายๆเพื่อพิจารณาว่าหากได้รับสเปรดชีตพร้อมผลลัพธ์จากเกมโป๊กเกอร์ใครควรจ่ายเงินให้ใคร ฉันเปิด Google Apps Script และเขียนสิ่งต่อไปนี้เพื่อเริ่มต้น:

function addplayerstoArray(numplayers) {

  var playerArray = [];

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

addplayerstoArray(7);

console.log(playerArray[3])

แนวคิดคือการสร้างอาร์เรย์ที่มีจำนวนผู้เล่นทั้งหมดในนั้น ตอนรันโค้ดฉันคิดว่ามันจะพิมพ์ "3" ไปที่คอนโซล แต่ไม่มีอะไรเกิดขึ้น. มันกล่าวว่า

"ReferenceError:" console "ไม่ได้กำหนดไว้"

ก) ฉันไม่เข้าใจอะไรเกี่ยวกับการทำงานของคอนโซล Google Apps Script เกี่ยวกับการพิมพ์เพื่อที่ฉันจะได้ดูว่าโค้ดของฉันบรรลุตามที่ฉันต้องการหรือไม่

B) มีปัญหากับรหัสหรือไม่?

คำตอบ:


144

คอนโซลไม่พร้อมใช้งานเนื่องจากโค้ดกำลังทำงานในคลาวด์ไม่ใช่ในเบราว์เซอร์ของคุณ ให้ใช้คลาสLogger ที่ GAS จัดหาให้แทน:

Logger.log(playerArray[3])

จากนั้นดูผลลัพธ์ใน IDE ภายใต้ View> Logs ...

นี่เอกสารบางอย่างเกี่ยวกับเรื่องการเข้าสู่ระบบด้วยก๊าซ

แก้ไข: 2017-07-20 ตอนนี้สคริปต์ Apps มีStackdriver Loggingด้วย ดูบันทึกเหล่านี้ในโปรแกรมแก้ไขสคริปต์ภายใต้ View - Console Logs


28
สิ่งนี้ทำได้อย่างไรเมื่อเขียนฟังก์ชันสำหรับสเปรดชีต ฉันไม่พบว่าเอาต์พุตการบันทึกไปที่ใด
TechplexEngineer

4
มีประโยชน์มาก ขอขอบคุณ! ตอนนี้หากมีเพียงบันทึกเท่านั้นที่อัปเดตแบบสดและอยู่ในตำแหน่งที่ไม่อยู่ในสถานที่สำหรับการทดสอบอย่างรวดเร็ว
kevincoleman

1
แล้วในเทมเพลต HTML ล่ะ?
Trevor

1
ในสเปรดชีตคุณสามารถใส่ผลลัพธ์ลงในป๊อปอัปด้วย MsgBox หรือในแถบด้านข้างที่มีแถบด้านข้าง คุณยังสามารถวางไว้ในแผ่นงานได้
vinnief

สำหรับการบันทึกสเปรดชีตที่นี่เหมาะกับห้องสมุด BetterLog
Igor Savinkin

17

เพียงเพื่อสร้างโซลูชันแฮ็กกี้ของ vinnief ด้านบนฉันใช้ MsgBox ดังนี้:

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

และมันทำหน้าที่เหมือนจุดพักหยุดสคริปต์และส่งออกสตริงที่คุณต้องการไปยังกล่องป๊อปอัป ฉันพบว่าโดยเฉพาะอย่างยิ่งในชีตซึ่งฉันมีปัญหากับ Logger.log ซึ่งเป็นวิธีแก้ปัญหาที่เพียงพอเกือบทุกครั้ง


12

แม้ว่าในLogger.log()ทางเทคนิคจะเป็นวิธีที่ถูกต้องในการส่งออกบางสิ่งไปยังคอนโซล แต่ก็มีสิ่งที่น่ารำคาญเล็กน้อย:

  1. ผลลัพธ์อาจเป็นระเบียบที่ไม่มีโครงสร้างและย่อยได้ยากอย่างรวดเร็ว
  2. คุณต้องเรียกใช้สคริปต์ก่อนจากนั้นคลิก View / Logs ซึ่งเป็นการคลิกพิเศษสองครั้ง (หนึ่งคลิกหากคุณจำแป้นพิมพ์ลัด Ctrl + Enter)
  3. คุณต้องแทรกLogger.log(playerArray)จากนั้นหลังจากแก้ไขข้อบกพร่องแล้วคุณอาจต้องการลบออกLogger.log(playerArray)ดังนั้นจึงต้องเพิ่มอีก 1-2 ขั้นตอน
  4. คุณต้องคลิกที่ตกลงเพื่อปิดการวางซ้อน (คลิกพิเศษอีกครั้ง)

เมื่อใดก็ตามที่ฉันต้องการแก้ไขข้อบกพร่องบางอย่างฉันจะเพิ่มเบรกพอยต์ (คลิกที่หมายเลขบรรทัด) และกดปุ่ม Debug (ไอคอนจุดบกพร่อง) เบรกพอยต์ทำงานได้ดีเมื่อคุณกำหนดบางอย่างให้กับตัวแปร แต่ไม่ดีนักเมื่อคุณเริ่มต้นตัวแปรและต้องการดูภายในของตัวแปรในภายหลังซึ่งคล้ายกับสิ่งที่ฝ่ายปฏิบัติการพยายามทำ ในกรณีนี้ฉันจะบังคับเงื่อนไขการแตกหักโดยการป้อน "x" (x ทำเครื่องหมายจุด!) เพื่อส่งข้อผิดพลาดรันไทม์:

ป้อนคำอธิบายภาพที่นี่

เปรียบเทียบกับการดูบันทึก:

ป้อนคำอธิบายภาพที่นี่

คอนโซลดีบักมีข้อมูลเพิ่มเติมและอ่านง่ายกว่าการวางซ้อนบันทึก ประโยชน์เล็กน้อยอย่างหนึ่งของวิธีนี้คือคุณไม่ต้องกังวลกับการทำให้โค้ดของคุณเป็นมลพิษด้วยคำสั่งการบันทึกจำนวนมากหากการรักษารหัสที่สะอาดเป็นสิ่งที่คุณต้องการ แม้ว่าคุณจะป้อน "x" แต่คุณต้องจำไว้ว่าให้ลบออกโดยเป็นส่วนหนึ่งของกระบวนการดีบักมิฉะนั้นโค้ดของคุณจะไม่ทำงาน (มาตรการล้างข้อมูลในตัวใช่)


1
การเพิ่มxจะเป็นฟังก์ชันเดียวกับการเพิ่มdebugger;
JSDBroughton

เห็นด้วยอย่างสิ้นเชิง. Logger.log ไม่มีประโยชน์เมื่อเทียบกับ Debug
Steve Gon

10

ตอบคำถาม OP

ก) ฉันไม่เข้าใจอะไรเกี่ยวกับการทำงานของคอนโซล Google Apps Script เกี่ยวกับการพิมพ์เพื่อที่ฉันจะได้ดูว่าโค้ดของฉันบรรลุตามที่ฉันต้องการหรือไม่

โค้ดบนไฟล์. gs ของโครงการ Google Apps Script ทำงานบนเซิร์ฟเวอร์แทนที่จะเป็นบนเว็บเบราว์เซอร์ วิธีการบันทึกข้อความที่จะใช้ชั้น Logger

B) มีปัญหากับรหัสหรือไม่?

ตามที่ข้อความแสดงข้อผิดพลาดกล่าวว่าปัญหานั้นconsoleไม่ได้ถูกกำหนด แต่ในปัจจุบันรหัสเดียวกันจะทำให้เกิดข้อผิดพลาดอื่น ๆ :

ReferenceError: "playerArray" ไม่ได้กำหนดไว้ (บรรทัดที่ 12 ไฟล์ "รหัส")

นั่นเป็นเพราะ playerArray ถูกกำหนดให้เป็นตัวแปรท้องถิ่น การเลื่อนบรรทัดออกจากฟังก์ชันจะช่วยแก้ปัญหานี้ได้

var playerArray = [];

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

addplayerstoArray(7);

console.log(playerArray[3])

ตอนนี้โค้ดดำเนินการโดยไม่มีข้อผิดพลาดแทนที่จะดูที่คอนโซลเบราว์เซอร์เราควรดู Stackdriver Logging จากแก้ไข UI ของ Google Apps Script คลิกดู> Stackdriver เข้าสู่ระบบ

ภาคผนวก

ในปี 2017 Google ได้เปิดตัวสคริปต์ทั้งหมด Stackdriver Logging และเพิ่ม Class Console ดังนั้นการรวมบางอย่างเช่นconsole.log('Hello world!')จะไม่ทำให้เกิดข้อผิดพลาด แต่บันทึกจะอยู่ใน Stackdriver Logging Service ของ Google Cloud Platform แทนคอนโซลเบราว์เซอร์

จากบันทึกประจำรุ่นของ Google Apps Script 2017

23 มิถุนายน 2560

Stackdriver Loggingถูกย้ายออกจาก Early Access แล้ว ขณะนี้สคริปต์ทั้งหมดสามารถเข้าถึงการบันทึก Stackdriver ได้แล้ว

จากLogging> Stackdriver logging

ตัวอย่างต่อไปนี้แสดงวิธีใช้บริการคอนโซลเพื่อบันทึกข้อมูลใน 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.
}

6

ในโครงการสคริปต์ของ Google คุณสามารถสร้างไฟล์ html (ตัวอย่าง: index.html) หรือไฟล์ gs (ตัวอย่าง: code.gs) ไฟล์. gs ถูกเรียกใช้งานบนเซิร์ฟเวอร์และคุณสามารถใช้ Logger.log ตามที่ @Peter Herrman อธิบาย อย่างไรก็ตามหากฟังก์ชันถูกสร้างขึ้นในไฟล์. html ฟังก์ชันจะถูกเรียกใช้งานบนเบราว์เซอร์ของผู้ใช้และคุณสามารถใช้ console.log คอนโซลเบราว์เซอร์ Chrome สามารถดูได้โดย Ctrl Shift J บน Windows / Linux หรือ Cmd Opt J บน Mac

หากคุณต้องการใช้ Logger.log บนไฟล์ html คุณสามารถใช้scriptletเพื่อเรียกใช้ฟังก์ชัน Logger.log จากไฟล์ html ในการทำเช่นนั้นคุณจะแทรก<? Logger.log (บางอย่าง)?>แทนที่บางสิ่งด้วยสิ่งที่คุณต้องการบันทึก Standard scriptlets ซึ่งใช้ไวยากรณ์ <? ... ?> รันโค้ดโดยไม่แสดงเนื้อหาไปยังเพจอย่างชัดเจน


2

อัปเดตสำหรับปี 2020

ในเดือนกุมภาพันธ์ของปี 2020 Google ประกาศรุ่นใหญ่ไปในตัวของ Google Apps Script IDE และตอนนี้console.log สนับสนุน () ดังนั้นตอนนี้คุณสามารถใช้ทั้งสองอย่าง:

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

ขอให้สนุกกับการเขียนโค้ด!


console.logได้รับการสนับสนุนก่อนการอัพเกรดที่อ้างถึง (ดูคำตอบของฉัน )
Rubén
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.