การแก้ปัญหา

แม้แต่นักพัฒนาซอฟต์แวร์ที่มีประสบการณ์มากที่สุดก็แทบไม่ได้เขียนโค้ดที่ถูกต้องในครั้งแรก จึงทําให้การแก้ปัญหาเป็นส่วนสําคัญของกระบวนการพัฒนา ในส่วนนี้ เราจะพูดถึงเทคนิคที่สามารถช่วยคุณค้นหา ทําความเข้าใจ และแก้ไขข้อบกพร่องของสคริปต์

ข้อความแสดงข้อผิดพลาด

เมื่อสคริปต์พบข้อผิดพลาด ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น ข้อความจะตามด้วยหมายเลขที่ใช้สําหรับแก้ปัญหา ข้อผิดพลาดพื้นฐานที่แสดงด้วยวิธีนี้มี 2 ประเภท ได้แก่ ข้อผิดพลาดเกี่ยวกับไวยากรณ์และข้อผิดพลาดรันไทม์

ข้อผิดพลาดทางไวยากรณ์

ข้อผิดพลาดทางไวยากรณ์เกิดจากการเขียนโค้ดที่ไม่เป็นไปตามไวยากรณ์ JavaScript และจะตรวจพบข้อผิดพลาดทันทีที่คุณพยายามบันทึกสคริปต์ ตัวอย่างเช่น ข้อมูลโค้ดต่อไปนี้มีข้อผิดพลาดด้านไวยากรณ์

function emailDataRow(rowNumber) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var rowData = data[rowNumber-1].join(" ";
  MailApp.sendEmail('john@example.com',
                    'Data in row ' + rowNumber,
                    rowData);
}

ปัญหาไวยากรณ์ที่นี่ไม่มีอักขระ ) ในตอนท้ายของบรรทัดที่ 4 เมื่อพยายามบันทึกสคริปต์ คุณจะได้รับข้อผิดพลาดต่อไปนี้

ไม่มี ) หลังจากรายการอาร์กิวเมนต์ (บรรทัดที่ 4)

ข้อผิดพลาดประเภทนี้มักแก้ไขได้ง่าย เนื่องจากข้อผิดพลาดเหล่านี้ค้นพบได้ในทันทีและมักมีสาเหตุง่ายๆ คุณบันทึกไฟล์ที่มีข้อผิดพลาดด้านไวยากรณ์ไม่ได้ ซึ่งหมายความว่าระบบจะบันทึกเฉพาะโค้ดที่ถูกต้องลงในโปรเจ็กต์

ข้อผิดพลาดเกี่ยวกับรันไทม์

ข้อผิดพลาดเหล่านี้เกิดจากการใช้ฟังก์ชันหรือคลาสไม่ถูกต้อง และตรวจพบได้เมื่อเรียกใช้สคริปต์แล้วเท่านั้น ตัวอย่างเช่น โค้ดต่อไปนี้ทําให้เกิดข้อผิดพลาดเกี่ยวกับรันไทม์

function emailDataRow(rowNumber) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var rowData = data[rowNumber-1].join(" ");
  MailApp.sendEmail('john',
                    'Data in row ' + rowNumber,
                    rowData);
}

โค้ดอยู่ในรูปแบบที่ถูกต้องแล้ว แต่เรากําลังส่งค่า "john" สําหรับอีเมลเมื่อเรียกใช้ MailApp.sendEmail เนื่องจากไม่ใช่อีเมลที่ถูกต้อง ข้อผิดพลาดต่อไปนี้จึงจะถูกเรียกใช้เมื่อเรียกใช้สคริปต์

อีเมลไม่ถูกต้อง: จอห์น (บรรทัดที่ 5)

สิ่งที่ทําให้ข้อผิดพลาดเหล่านี้แก้ปัญหาได้ยากขึ้นก็คือ ข้อมูลที่คุณกําลังจะส่งเข้าไปในฟังก์ชันไม่ได้ถูกเขียนไว้ในโค้ด แต่จะดึงมาจากสเปรดชีต แบบฟอร์ม หรือแหล่งข้อมูลภายนอกอื่นๆ การใช้เทคนิคการแก้ไขข้อบกพร่องด้านล่างช่วยให้คุณระบุสาเหตุของข้อผิดพลาดเหล่านี้ได้

ข้อผิดพลาดที่พบบ่อย

ด้านล่างนี้คือรายการข้อผิดพลาดที่พบบ่อยและสาเหตุ

มีการเรียกใช้บริการหลายครั้งเกินไป: <action name>

ข้อผิดพลาดนี้แสดงว่าคุณเกินโควต้ารายวันสําหรับการดําเนินการที่ระบุ เช่น คุณอาจพบข้อผิดพลาดนี้หากส่งอีเมลมากเกินไปในวันเดียว โควต้าจะกําหนดไว้หลายระดับสําหรับบัญชีผู้ใช้ทั่วไป โดเมน และวิดีโอพรีเมียร์ และอาจมีการเปลี่ยนแปลงได้ทุกเมื่อโดยไม่มีประกาศจาก Google ก่อน คุณดูขีดจํากัดโควต้าสําหรับการดําเนินการต่างๆ ได้ในเอกสารประกอบของโควต้า Apps Script

เซิร์ฟเวอร์ไม่พร้อมใช้งานหรือเกิดข้อผิดพลาดเกี่ยวกับเซิร์ฟเวอร์ โปรดลองอีกครั้ง

ซึ่งสาเหตุที่เป็นไปได้มีดังนี้

  • เซิร์ฟเวอร์หรือระบบของ Google ไม่พร้อมใช้งานชั่วคราว รอสักครู่แล้วลองเรียกใช้สคริปต์อีกครั้ง
  • มีข้อผิดพลาดในสคริปต์ที่ไม่มีข้อความแสดงข้อผิดพลาดที่เกี่ยวข้อง ลองแก้ไขข้อบกพร่องของสคริปต์และดูว่าคุณจะแยกปัญหาได้หรือไม่
  • มีข้อบกพร่องใน Google Apps Script ที่ทําให้เกิดข้อผิดพลาดนี้ ดูวิธีการค้นหาและการยื่นรายงานข้อบกพร่องได้ที่ข้อบกพร่อง ก่อนรายงานข้อบกพร่องใหม่ ให้ค้นหาว่ามีผู้อื่นรายงานแล้วหรือยัง

จําเป็นต้องให้สิทธิ์เพื่อดําเนินการดังกล่าว

ข้อผิดพลาดนี้บ่งบอกว่าสคริปต์ขาดการให้สิทธิ์ที่จําเป็นในการเรียกใช้ เมื่อเรียกใช้สคริปต์ในเครื่องมือแก้ไขสคริปต์หรือจากรายการเมนูที่กําหนดเอง กล่องโต้ตอบการให้สิทธิ์จะแสดงให้ผู้ใช้เห็น อย่างไรก็ตาม เมื่อเรียกใช้สคริปต์จากทริกเกอร์ ฝังไว้กับหน้า Google Sites หรือเรียกใช้เป็นบริการ กล่องโต้ตอบจะแสดงไม่ได้และข้อผิดพลาดนี้จะแสดงขึ้น

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

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

  1. คลิกทริกเกอร์ ทางด้านซ้ายของโปรเจ็กต์ Apps Script
  2. คลิกเพิ่มเติม > ลบทริกเกอร์ที่ด้านขวาของทริกเกอร์ที่ต้องการนําออก

นอกจากนี้ คุณยังนําทริกเกอร์ส่วนเสริมที่มีปัญหาออกได้โดยถอนการติดตั้งส่วนเสริม

การเข้าถึงถูกปฏิเสธ: DriveApp หรือนโยบายโดเมนปิดใช้แอปไดรฟ์ของบุคคลที่สาม

ผู้ดูแลระบบของโดเมน Google Workspace สามารถปิดใช้ Drive API สําหรับโดเมนได้ ซึ่งทําให้ผู้ใช้ติดตั้งและใช้แอป Google ไดรฟ์ไม่ได้ การตั้งค่านี้ยังป้องกันไม่ให้ผู้ใช้ใช้ส่วนเสริม Apps Script ที่ใช้บริการไดรฟ์หรือบริการไดรฟ์ขั้นสูง (แม้ว่าสคริปต์จะได้รับอนุญาตก่อนที่ผู้ดูแลระบบจะปิดใช้ Drive API)

แต่หากมีการเผยแพร่เว็บแอปหรือเว็บแอปที่ใช้บริการไดรฟ์สําหรับการติดตั้งทั่วทั้งโดเมน และผู้ดูแลระบบติดตั้งให้กับผู้ใช้บางคนหรือทุกคนในโดเมน สคริปต์ก็จะทําหน้าที่เหล่านั้นให้กับผู้ใช้ แม้ว่าจะปิดใช้ Drive API ในโดเมนแล้วก็ตาม

สคริปต์ไม่มีสิทธิ์รับข้อมูลประจําตัวของผู้ใช้ที่ใช้งานอยู่

ระบุว่าไม่มีข้อมูลระบุตัวตนและอีเมลของผู้ใช้ที่ใช้งานอยู่ในสคริปต์ คําเตือนนี้เป็นผลมาจากการโทรไปที่ Session.getActiveUser() ซึ่งอาจเกิดจากการเรียกไปยัง Session.getEffectiveUser() หากสคริปต์ทํางานในโหมดการให้สิทธิ์อื่นที่ไม่ใช่ AuthMode.FULL หากมีการระบุคําเตือนนี้ การเรียก User.getEmail() ครั้งต่อๆ ไปจะส่งกลับเฉพาะ ""

การแก้ปัญหาคําเตือนนี้ทําได้หลายวิธี โดยขึ้นอยู่กับโหมดการให้สิทธิ์ที่สคริปต์ทํางานอยู่ โหมดการให้สิทธิ์จะแสดงในฟังก์ชันที่ทริกเกอร์เป็นพร็อพเพอร์ตี้ authMode ของe พารามิเตอร์เหตุการณ์

  • ใน AuthMode.FULL ให้ลองใช้ Session.getEffectiveUser() แทน
  • ใน AuthMode.LIMITED ให้ตรวจสอบว่าเจ้าของได้ให้สิทธิ์สคริปต์แล้ว
  • ในโหมดการให้สิทธิ์อื่นๆ ให้หลีกเลี่ยงการเรียกใช้ด้วยวิธีใดวิธีหนึ่ง
  • หากคุณเป็น Google Workspace ลูกค้าที่เพิ่งเห็นคําเตือนนี้จากทริกเกอร์ที่ติดตั้งได้ ให้ตรวจสอบว่าทริกเกอร์ทํางานอยู่ในฐานะผู้ใช้ภายในองค์กร

คลังหายไป

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

  • คัดลอกและวางโค้ดของไลบรารีลงในสคริปต์ แล้วนําทรัพยากร Dependency ของไลบรารีออก
  • คัดลอกสคริปต์ไลบรารีแล้วทําให้ใช้งานได้เป็นไลบรารีจากบัญชีของคุณ โปรดอัปเดตทรัพยากร Dependency ในสคริปต์ต้นฉบับเป็นไลบรารีใหม่แทนไลบรารีสาธารณะ

การแก้ไขข้อบกพร่อง

อย่างไรก็ตาม ข้อผิดพลาดบางอย่างอาจทําให้ข้อความแสดงข้อผิดพลาดปรากฏขึ้น อาจเกิดข้อผิดพลาดที่ละเอียดยิ่งขึ้นว่าโค้ดถูกต้องในทางเทคนิคและดําเนินการได้ แต่ผลลัพธ์ไม่เป็นไปตามที่คุณคาดหวัง ต่อไปนี้เป็นกลยุทธ์ในการจัดการสถานการณ์ดังกล่าว และตรวจสอบสคริปต์ที่ไม่ได้ทํางานตามที่คุณคาดไว้

Logging

ขณะแก้ไขข้อบกพร่อง การบันทึกข้อมูลเป็นโปรเจ็กต์สคริปต์ก็มีประโยชน์เช่นกัน Google Apps Script มี 2 วิธีสําหรับการบันทึกข้อมูล ได้แก่ บริการ Cloud Logging และบริการตัวบันทึกและคอนโซลพื้นฐานในตัวเครื่องมือแก้ไข Apps Script

ดูรายละเอียดเพิ่มเติมได้ในคู่มือการบันทึก

Error Reporting

ข้อยกเว้นที่เกิดขึ้นเนื่องจากข้อผิดพลาดรันไทม์จะได้รับการบันทึกไว้โดยอัตโนมัติโดยใช้บริการรายงานข้อผิดพลาดของ Google Cloud บริการนี้ช่วยให้คุณค้นหาและกรองข้อความข้อยกเว้นที่โปรเจ็กต์สคริปต์สร้างขึ้นได้

หากต้องการเข้าถึงการรายงานข้อผิดพลาด โปรดดูหัวข้อดูบันทึก Cloud และรายงานข้อผิดพลาดในคอนโซล Google Cloud Platform

การดำเนินการ

ทุกครั้งที่เรียกใช้สคริปต์ Apps Script จะเก็บบันทึกการดําเนินการ ซึ่งรวมถึงบันทึกของระบบคลาวด์ ระเบียนเหล่านี้ช่วยให้คุณเข้าใจว่าสคริปต์ทําสิ่งใดบ้าง

หากต้องการดูการเรียกใช้สคริปต์ในโปรเจ็กต์ Apps Script ให้คลิกการดําเนินการ ทางด้านซ้าย

กําลังตรวจสอบสถานะบริการ Apps Script

บริการของ Google Workspace (เช่น Gmail หรือไดรฟ์) ที่พบได้ไม่บ่อยนักอาจพบปัญหาชั่วคราวซึ่งอาจทําให้บริการหยุดทํางาน เมื่อเกิดกรณีนี้ขึ้น โปรเจ็กต์ Apps Script ที่โต้ตอบกับบริการเหล่านี้อาจไม่ทํางานตามที่คาดไว้

คุณสามารถตรวจสอบได้ว่าบริการ Google Workspace หยุดทํางานหรือไม่โดยดูที่แดชบอร์ดสถานะของ Google Workspace หากประสบปัญหาการหยุดทํางานในปัจจุบัน คุณสามารถรอให้ระบบแก้ไขหรือขอความช่วยเหลือเพิ่มเติมได้ในศูนย์ช่วยเหลือของ Google Workspace หรือเอกสารประกอบปัญหาที่ทราบของ Google Workspace

ใช้โปรแกรมแก้ไขข้อบกพร่องและจุดพัก

หากต้องการค้นหาปัญหาในสคริปต์ คุณสามารถเรียกใช้ในโหมดแก้ไขข้อบกพร่องได้ เมื่อเรียกใช้ในโหมดแก้ไขข้อบกพร่อง สคริปต์จะหยุดชั่วคราวเมื่อถึงขีดจํากัดเบรกพอยท์ ซึ่งเป็นบรรทัดที่คุณไฮไลต์ในสคริปต์ที่คุณคิดว่าอาจมีปัญหา เมื่อสคริปต์หยุดชั่วคราว ระบบจะแสดงค่าของตัวแปรแต่ละรายการ ณ ขณะนั้น ทําให้คุณสามารถตรวจสอบการทํางานภายในของสคริปต์ได้โดยไม่ต้องเพิ่มคําสั่งการบันทึกจํานวนมาก

เพิ่มเบรกพอยท์

หากต้องการเพิ่มเบรกพอยท์ ให้วางเมาส์เหนือหมายเลขบรรทัดของบรรทัดที่ต้องการเพิ่มเบรกพอยท์ คลิกวงกลมทางด้านซ้ายของหมายเลขเส้น รูปภาพด้านล่างแสดงตัวอย่างเบรกพอยท์ที่เพิ่มลงในสคริปต์

เพิ่มเบรกพอยท์

เรียกใช้สคริปต์ในโหมดแก้ไขข้อบกพร่อง

หากต้องการเรียกใช้สคริปต์ในโหมดแก้ไขข้อบกพร่อง ให้คลิกแก้ไขข้อบกพร่องที่ด้านบนของเครื่องมือแก้ไข

ก่อนที่สคริปต์จะเรียกใช้บรรทัดที่มีเบรกพอยท์ชั่วคราว และแสดงตารางข้อมูลการแก้ไขข้อบกพร่อง คุณใช้ตารางนี้เพื่อตรวจสอบข้อมูล เช่น ค่าของพารามิเตอร์และข้อมูลที่จัดเก็บไว้ในออบเจ็กต์ได้

หากต้องการควบคุมการทํางานของสคริปต์ ให้ใช้ปุ่ม "ขั้นตอนเข้า" "วางเมาส์" และ "เลื่อนออก" ที่ด้านบนของแผงโปรแกรมแก้ไขข้อบกพร่อง ซึ่งช่วยให้คุณเรียกใช้สคริปต์ทีละบรรทัดและตรวจสอบการเปลี่ยนแปลงค่าเมื่อเวลาผ่านไปได้

ปัญหาเกี่ยวกับบัญชี Google หลายบัญชี

หากลงชื่อเข้าใช้บัญชี Google หลายบัญชีพร้อมกัน คุณอาจประสบปัญหาในการเข้าถึงส่วนเสริมและเว็บแอป ระบบไม่รองรับการเข้าสู่ระบบหรือการดึงเข้าสู่ระบบหลายบัญชี Google หลายบัญชีพร้อมกันสําหรับ Apps Script, ส่วนเสริม หรือเว็บแอป

  • หากเปิดเครื่องมือแก้ไข Apps Script ขณะลงชื่อเข้าสู่ระบบมากกว่า 1 บัญชี Google จะแจ้งให้คุณเลือกบัญชีที่ต้องการดําเนินการต่อ

  • หากคุณเปิดเว็บแอปหรือส่วนเสริมและพบปัญหาในการเข้าสู่ระบบหลายรายการ ให้ลองใช้วิธีแก้ปัญหาวิธีใดวิธีหนึ่งต่อไปนี้

    • ออกจากระบบบัญชี Google ทั้งหมดและลงชื่อเข้าสู่ระบบเฉพาะบัญชีที่มีส่วนเสริมหรือเว็บแอปที่คุณต้องการเข้าถึง
    • เปิดหน้าต่างที่ไม่ระบุตัวตนใน Google Chrome หรือหน้าต่างการเรียกดูแบบส่วนตัวที่เทียบเท่า และลงชื่อเข้าสู่ระบบบัญชี Google ที่มีส่วนเสริมหรือเว็บแอปที่ต้องการเข้าถึง

การขอความช่วยเหลือ

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