การแก้ปัญหา

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

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

เมื่อสคริปต์ของคุณพบข้อผิดพลาด ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น ข้อความจะมีหมายเลขบรรทัดที่ใช้ในการแก้ปัญหาปรากฏอยู่ด้วย ข้อผิดพลาดพื้นฐานที่แสดงในลักษณะนี้มีอยู่ 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 เนื่องจากอีเมลนี้ไม่ใช่อีเมลที่ถูกต้อง ข้อผิดพลาดต่อไปนี้จะเกิดขึ้นเมื่อเรียกใช้สคริปต์

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

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

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

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

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

ข้อผิดพลาดนี้แสดงว่าคุณใช้การทำงานเกินโควต้าต่อวันแล้ว เช่น คุณอาจพบข้อผิดพลาดนี้หากส่งอีเมลมากเกินไปใน 1 วัน โควต้าจะมีการกำหนดในระดับที่แตกต่างกันสำหรับบัญชีผู้ใช้ทั่วไป โดเมน และบัญชีพรีเมียร์ และอาจเปลี่ยนแปลงได้ตลอดเวลาโดยไม่ต้องประกาศจาก 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 ในสคริปต์ต้นฉบับเป็นไลบรารีใหม่แทนไลบรารีสาธารณะ

เกิดข้อผิดพลาดเนื่องจากไม่มีเวอร์ชันไลบรารีหรือเวอร์ชันการทำให้ใช้งานได้ รหัสข้อผิดพลาด Not_Found

ข้อความแสดงข้อผิดพลาดนี้จะระบุถึงข้อใดข้อหนึ่งต่อไปนี้

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

Error 400: invalid_scope เมื่อเรียกใช้ Google Chat API กับบริการขั้นสูง

หากเห็น Error 400: invalid_scope พร้อมข้อความแสดงข้อผิดพลาด Some requested scopes cannot be shown หมายความว่าคุณไม่ได้ระบุขอบเขตการให้สิทธิ์ในไฟล์ appsscript.json ของโปรเจ็กต์ Apps Script ในกรณีส่วนใหญ่ Apps Script จะกำหนดขอบเขตที่สคริปต์ต้องการโดยอัตโนมัติ แต่เมื่อคุณใช้บริการขั้นสูงของ Chat คุณต้องเพิ่มขอบเขตการให้สิทธิ์ที่สคริปต์ใช้ลงในไฟล์ Manifest ของโปรเจ็กต์ Apps Script ด้วยตนเอง ดู การตั้งค่าขอบเขตที่ชัดเจน

หากต้องการแก้ไขข้อผิดพลาด ให้เพิ่มขอบเขตการให้สิทธิ์ที่เหมาะสมลงในไฟล์ appsscript.json ของโปรเจ็กต์ Apps Script โดยเป็นส่วนหนึ่งของอาร์เรย์ oauthScopes เช่น หากต้องการเรียกใช้เมธอด spaces.messages.create ให้เพิ่มโค้ดต่อไปนี้

"oauthScopes": [
  "https://www.googleapis.com/auth/chat.messages.create"
]

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

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

Logging

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

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

Error Reporting

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

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

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

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

หากต้องการดูการดำเนินการของสคริปต์ในโปรเจ็กต์ 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 ที่มีส่วนเสริมหรือเว็บแอปที่คุณต้องการเข้าถึง

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

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