แม้แต่นักพัฒนาแอปที่มีประสบการณ์มากที่สุดก็แทบจะไม่เคยเขียนโค้ดได้อย่างถูกต้องตั้งแต่ครั้งแรก การลองผิดลองถูกจึงเป็นส่วนสำคัญในกระบวนการพัฒนา ส่วนนี้จะครอบคลุมเทคนิคในการค้นหา ทำความเข้าใจ และแก้ไขข้อบกพร่องในสคริปต์
ข้อความแสดงข้อผิดพลาด
เมื่อสคริปต์พบข้อผิดพลาด ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้นพร้อมหมายเลขบรรทัด ข้อผิดพลาดพื้นฐานมี 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" ก็เป็นอีเมลที่ไม่ถูกต้อง ระบบจะแสดงข้อผิดพลาดต่อไปนี้
อีเมลไม่ถูกต้อง: john (บรรทัดที่ 5)
ข้อผิดพลาดเหล่านี้แก้ไขได้ยากเนื่องจากมักดึงข้อมูลจากแหล่งข้อมูลภายนอก เช่น สเปรดชีตหรือแบบฟอร์ม ใช้เทคนิคการแก้ไขข้อบกพร่องเพื่อระบุสาเหตุ
ข้อผิดพลาดที่พบบ่อย
ต่อไปนี้คือรายการข้อผิดพลาดที่พบบ่อยและสาเหตุ
มีการเรียกใช้บริการหลายครั้งเกินไป: <action name>
ข้อผิดพลาดนี้บ่งบอกว่าคุณใช้โควต้ารายวันสำหรับการดำเนินการเกินแล้ว เช่น ส่งอีเมลมากเกินไป โควต้าจะแตกต่างกันไปตามประเภทบัญชีและอาจมีการเปลี่ยนแปลง ดูขีดจำกัดได้ในเอกสารประกอบเกี่ยวกับโควต้าของ Apps Script
เซิร์ฟเวอร์ไม่พร้อมใช้งานหรือเกิดข้อผิดพลาดเกี่ยวกับเซิร์ฟเวอร์ โปรดลองอีกครั้ง
โดยอาจเกิดจากสาเหตุต่อไปนี้
- เซิร์ฟเวอร์ของ Google ไม่พร้อมใช้งานชั่วคราว โปรดรอแล้วลองอีกครั้ง
- ข้อผิดพลาดในสคริปต์ไม่มีข้อความที่เกี่ยวข้อง ลองแก้ไขข้อบกพร่องเพื่อ แยกปัญหา
- มีข้อบกพร่องใน Google Apps Script ค้นหาและส่งรายงานข้อบกพร่องในส่วนข้อบกพร่อง
ต้องมีการตรวจสอบสิทธิ์เพื่อที่จะดำเนินการนั้น
สคริปต์ไม่มีการให้สิทธิ์ที่จำเป็นต่อการเรียกใช้ เมื่อสคริปต์ทำงานจากทริกเกอร์หรือเป็นบริการ จะแสดงกล่องโต้ตอบการให้สิทธิ์ไม่ได้
หากต้องการให้สิทธิ์สคริปต์ ให้เปิดเครื่องมือแก้ไขสคริปต์แล้วเรียกใช้ฟังก์ชันใดก็ได้ หากสคริปต์ใช้บริการใหม่ที่ไม่ได้รับอนุญาต คุณจะต้องให้สิทธิ์อีกครั้ง
ทริกเกอร์ที่เริ่มทำงานก่อนการให้สิทธิ์หรือหลังการหมดอายุมักทำให้เกิดข้อผิดพลาดนี้ หากส่วนเสริมเป็นสาเหตุของปัญหานี้ ให้ใช้ส่วนเสริมอีกครั้งเพื่อให้สิทธิ์อีกครั้ง นำทริกเกอร์ที่มีปัญหาออก
- ในโปรเจ็กต์ Apps Script ให้คลิกทริกเกอร์
- คลิกเพิ่มเติม > ลบทริกเกอร์ข้างทริกเกอร์
หรือจะถอนการติดตั้งส่วนเสริมก็ได้
สิทธิ์แบบละเอียดอาจทำให้เกิดข้อผิดพลาดเหล่านี้ได้เช่นกัน ดูหน้าขอบเขตการให้สิทธิ์ เพื่อป้องกันการเรียกใช้ทริกเกอร์
ถูกปฏิเสธการเข้าถึง: DriveApp หรือ นโยบายโดเมนได้ปิดใช้งานแอปไดรฟ์ของบุคคลที่สาม
ผู้ดูแลระบบ Google Workspace สามารถปิดใช้ Drive API สำหรับโดเมนของตนได้ ซึ่งจะป้องกันไม่ให้ผู้ใช้ใช้แอปไดรฟ์หรือส่วนเสริม Apps Script ที่ใช้บริการไดรฟ์
หากเผยแพร่ส่วนเสริมหรือเว็บแอปสำหรับการติดตั้งทั่วทั้งโดเมน และผู้ดูแลระบบเป็นผู้ติดตั้ง สคริปต์จะทำงานได้แม้ว่าจะปิดใช้ Drive API อยู่ก็ตาม
สคริปต์ไม่มีสิทธิ์รับข้อมูลระบุตัวตนของผู้ใช้ที่ใช้งานอยู่
ข้อมูลประจำตัวและอีเมลของผู้ใช้ที่ใช้งานอยู่ไม่พร้อมใช้งาน ซึ่งเกิดจากการเรียกใช้Session.getActiveUser()
หรือ Session.getEffectiveUser()
ในโหมดการให้สิทธิ์อื่นๆ นอกเหนือจาก AuthMode.FULL
หากสคริปต์ทำงานในทริกเกอร์ คุณจะดูโหมดการให้สิทธิ์ได้ในพร็อพเพอร์ตี้
authMode ของออบเจ็กต์เหตุการณ์ Apps Script
แก้ปัญหานี้ตามโหมดการให้สิทธิ์
- ใน
AuthMode.FULLให้ลองใช้Session.getEffectiveUser()แทน - ใน
AuthMode.LIMITEDให้ตรวจสอบว่า เจ้าของได้ให้สิทธิ์สคริปต์แล้ว - ในโหมดการให้สิทธิ์อื่นๆ ให้หลีกเลี่ยงการเรียกใช้ทั้ง 2 วิธี
- หากคุณเป็นลูกค้า Google Workspace ที่เพิ่งได้รับคำเตือนนี้จากทริกเกอร์ที่ติดตั้งได้ โปรดตรวจสอบว่าทริกเกอร์ทำงานในฐานะผู้ใช้ภายในองค์กร
ไม่มีคลัง
ระบบอาจรายงานว่าไม่มีคลังหากมีผู้เข้าถึงคลังพร้อมกันมากเกินไป วิธีแก้ไขปัญหามีดังนี้
- คัดลอกโค้ดของไลบรารีลงในสคริปต์โดยตรง
- คัดลอกและติดตั้งใช้งานไลบรารีจากบัญชีของคุณเอง
- หากสคริปต์ไม่จำเป็นต้องใช้ไลบรารีในการทำงาน ให้นำไลบรารีออกจากโปรเจ็กต์สคริปต์
เกิดข้อผิดพลาดเนื่องจากไม่มีเวอร์ชันไลบรารีหรือเวอร์ชันการทำให้ใช้งานได้ รหัสข้อผิดพลาด Not_Found
ข้อความแสดงข้อผิดพลาดนี้บ่งบอกถึงสาเหตุอย่างใดอย่างหนึ่งต่อไปนี้
- ระบบลบเวอร์ชันสคริปต์ที่การติดตั้งใช้งานใช้แล้ว หากต้องการแก้ไขปัญหานี้ ให้ แก้ไขการติดตั้งใช้งาน แล้วเลือกสคริปต์เวอร์ชันอื่น
- มีการลบเวอร์ชันไลบรารีที่สคริปต์ใช้ หากต้องการแก้ไขปัญหานี้ ให้ค้นหาไลบรารีในโปรแกรมแก้ไขสคริปต์ในส่วน "ไลบรารี" แล้วอัปเดตเป็นเวอร์ชันอื่นหรือนำไลบรารีออก หากต้องการอัปเดต ให้คลิกหมายเลขเวอร์ชัน แล้วเลือกเวอร์ชันอื่น หากต้องการนำออก ให้คลิกเพิ่มเติม > นำออก
- ไลบรารีมีไลบรารีอื่น และเวอร์ชันของไลบรารีนั้นถูกลบไปแล้ว หากต้องการแก้ไขปัญหานี้ ให้ติดต่อผู้เขียนไลบรารีหรือใช้ไลบรารีเวอร์ชันอื่นที่สคริปต์ของคุณใช้
ข้อผิดพลาด 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"
]
ผู้ดูแลระบบไม่อนุญาตให้ UrlFetch ทำการเรียกไปยัง <URL>
ผู้ดูแลระบบ Google Workspace สามารถใช้รายการที่อนุญาตเพื่อควบคุมการเข้าถึงโดเมนภายนอก ได้ โปรดติดต่อผู้ดูแลระบบเพื่อเพิ่ม URL ลงในรายการที่อนุญาต
การละเมิดนโยบายสิทธิ์
ข้อผิดพลาดนี้เกิดขึ้นเมื่อแอปพลิเคชันที่ใช้ HTMLService พยายามเรียกใช้ Web API ที่ต้องใช้สิทธิ์ที่ละเอียดอ่อน เช่น navigator.mediaDevices.getUserMedia() สำหรับสิทธิ์เข้าถึงกล้องหรือไมโครโฟน สภาพแวดล้อมแซนด์บ็อกซ์ของ Apps Script
จำกัดฟีเจอร์เหล่านี้เพื่อปกป้องความปลอดภัยของผู้ใช้
โฮสต์ฟังก์ชันการทำงานที่ต้องใช้สิทธิ์เหล่านี้ในโดเมนแยกต่างหาก (ภายนอก Apps Script) แล้วเปิดในหน้าต่างหรือแท็บใหม่ จากนั้นคุณจะโพสต์ข้อมูลหรือคำตอบที่บันทึกไว้กลับไปยังแอปพลิเคชัน Apps Script ได้ตามที่แสดงในตัวอย่างนี้
Code.gs
function doGet(e) { return HtmlService.createHtmlOutputFromFile('Index') .setTitle('Media Devices Example'); } function processCameraData(data) { Logger.log('Received data from client-side: ' + data); // Process data as needed }
Index.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<button id="open-camera">Open Camera in New Window</button>
<script>
document.getElementById('open-camera').addEventListener('click', function() {
// URL for external domain handling camera access & posting data back.
// External page uses getUserMedia & window.opener.postMessage(...).
var externalUrl = 'https://your-external-domain.com/camera';
window.open(externalUrl, 'cameraWindow', 'width=600,height=400');
});
// Listen for messages from the external window.
window.addEventListener('message', function(event) {
// Check event.origin to ensure message is from the expected source.
if (event.origin !== 'https://your-external-domain.com') {
return;
}
console.log('Data received from external window:', event.data);
// Send data to server-side Apps Script.
google.script.run.processCameraData(event.data);
});
</script>
</body>
</html>การแก้ไขข้อบกพร่อง
ข้อผิดพลาดบางอย่างอาจไม่ชัดเจนและไม่ทำให้เกิดข้อความ เช่น โค้ดอาจเรียกใช้ได้ แต่ผลลัพธ์ที่ได้อาจไม่เป็นไปตามที่คาดไว้ ใช้กลยุทธ์ต่อไปนี้เพื่อตรวจสอบสคริปต์ที่ทำงานไม่เป็นไปตามที่คาดไว้
การบันทึก
บันทึกข้อมูลขณะที่สคริปต์ทำงานโดยใช้บริการ Cloud Logging หรือบริการ Logger และคอนโซลในเครื่องมือแก้ไขสคริปต์
Error Reporting
หากต้องการใช้ Error Reporting ใน Google Cloud ให้ใช้โปรเจ็กต์มาตรฐานที่ผู้ใช้จัดการ แทนโปรเจ็กต์เริ่มต้น
เมื่อใช้โปรเจ็กต์มาตรฐาน ระบบจะบันทึกข้อผิดพลาดขณะรันไทม์โดยอัตโนมัติใน Error Reporting ของ Google Cloud ดูบันทึกของ Cloud และรายงานข้อผิดพลาดในคอนโซล Google Cloud
การดำเนินการ
Google Apps Script จะบันทึกการดำเนินการทุกครั้ง รวมถึงบันทึกของ Cloud หากต้องการดูการดำเนินการ ให้คลิกการดำเนินการ
ตรวจสอบสถานะบริการ
ตรวจสอบการหยุดให้บริการของ Google Workspace ในแดชบอร์ดสถานะของ Google Workspace
ใช้โปรแกรมแก้ไขข้อบกพร่องและจุดพัก
หากต้องการค้นหาปัญหาในสคริปต์ คุณสามารถดำเนินการในโหมดแก้ไขข้อบกพร่องได้ เมื่อเรียกใช้ใน โหมดแก้ไขข้อบกพร่อง สคริปต์จะหยุดชั่วคราวเมื่อถึงจุดพัก ซึ่งเป็นบรรทัดที่คุณ ไฮไลต์ในสคริปต์ที่คิดว่าอาจมีปัญหา เมื่อสคริปต์หยุดชั่วคราว สคริปต์จะแสดง ค่าของตัวแปรแต่ละตัว ณ จุดนั้น ทำให้คุณตรวจสอบ การทำงานภายในของสคริปต์ได้โดยไม่ต้องเพิ่มคำสั่งบันทึกจำนวนมาก
เพิ่มเบรกพอยท์
หากต้องการเพิ่มเบรกพอยต์ ให้วางเมาส์เหนือหมายเลขบรรทัดของบรรทัดที่ต้องการเพิ่มเบรกพอยต์ คลิกวงกลมทางด้านซ้ายของหมายเลขบรรทัด รูปภาพด้านล่าง แสดงตัวอย่างของเบรกพอยต์ที่เพิ่มลงในสคริปต์

เรียกใช้สคริปต์ในโหมดแก้ไขข้อบกพร่อง
หากต้องการเรียกใช้สคริปต์ในโหมดแก้ไขข้อบกพร่อง ให้คลิกแก้ไขข้อบกพร่องที่ด้านบนของเอดิเตอร์
ก่อนที่สคริปต์จะเรียกใช้บรรทัดที่มีเบรกพอยต์ สคริปต์จะหยุดชั่วคราวและแสดงตารางข้อมูลการแก้ไขข้อบกพร่อง คุณใช้ตารางนี้เพื่อตรวจสอบข้อมูล เช่น ค่าของพารามิเตอร์และข้อมูลที่จัดเก็บไว้ในออบเจ็กต์ได้
หากต้องการควบคุมวิธีเรียกใช้สคริปต์ ให้ใช้ปุ่ม "Step in", "Step over" และ "Step out" ที่ด้านบนของแผงดีบักเกอร์ ซึ่งช่วยให้คุณเรียกใช้สคริปต์ทีละบรรทัดและตรวจสอบว่าค่าต่างๆ เปลี่ยนแปลงไปอย่างไรเมื่อเวลาผ่านไป
ข้อผิดพลาด: ซอร์สโค้ดสำหรับบรรทัดปัจจุบันไม่พร้อมใช้งาน

ข้อผิดพลาดนี้จะปรากฏขึ้นเมื่อไม่มีไฟล์แก้ไขข้อบกพร่องที่ใช้งานอยู่
Google Apps Script ไม่รองรับการแสดงสคริปต์ JavaScript (JS) ที่สร้างขึ้นแบบไดนามิกในเครื่องมือแก้ไขสคริปต์ เช่น สคริปต์ที่สร้างขึ้นโดยใช้ eval() และ new Function() สคริปต์เหล่านี้สร้างและดำเนินการ
ภายในเครื่องมือ V8 แต่ไม่ได้แสดงเป็นไฟล์แบบสแตนด์อโลนในเครื่องมือแก้ไข
หากคุณก้าวเข้าสู่สคริปต์เหล่านี้ คุณจะพบข้อผิดพลาดนี้
ตัวอย่างเช่น ลองพิจารณาโค้ดต่อไปนี้
function myFunction() {
eval('a=2');
}
เมื่อเรียกใช้ eval() ระบบจะถือว่าอาร์กิวเมนต์เป็นโค้ด JS และเรียกใช้เป็น
สคริปต์ที่สร้างขึ้นแบบไดนามิกภายในเครื่องมือ V8 หากคุณก้าวเข้าสู่ eval() ข้อผิดพลาดนี้จะปรากฏขึ้น
หากสคริปต์มีความคิดเห็น //# sourceURL ชื่อของความคิดเห็นจะแสดงในสแต็กการเรียกใช้ ไม่เช่นนั้น จะปรากฏเป็นรายการที่ไม่มีชื่อ
แม้จะมีข้อความแสดงข้อผิดพลาด แต่เซสชันการแก้ไขข้อบกพร่องจะยังคงใช้งานได้ และการดำเนินการ จะดำเนินต่อไปได้ หากต้องการดำเนินการต่อ ให้ไปที่ขั้นตอนการเข้า การออก หรือการดำเนินการต่อ อย่างไรก็ตาม ข้อผิดพลาดนี้จะยังคงปรากฏตราบใดที่การดำเนินการ ยังคงอยู่ในขอบเขตของสคริปต์แบบไดนามิก หลังจากที่การดำเนินการออกจาก สคริปต์แบบไดนามิก การแก้ไขข้อบกพร่องจะดำเนินต่อไปโดยไม่มีข้อผิดพลาดนี้
ปัญหาเกี่ยวกับบัญชี Google หลายบัญชี
หากลงชื่อเข้าใช้บัญชี Google หลายบัญชีพร้อมกัน คุณอาจประสบปัญหาในการเข้าถึงส่วนเสริมและเว็บแอป ระบบไม่รองรับการเข้าสู่ระบบหลายบัญชีหรือการดึงเข้าสู่ระบบหลายบัญชี Google พร้อมกันสําหรับ Apps Script, ส่วนเสริม หรือเว็บแอป
หากคุณเปิดเครื่องมือแก้ไขสคริปต์ Apps Script ขณะเข้าสู่ระบบมากกว่า 1 บัญชี Google Prompt จะแจ้งให้คุณเลือกบัญชีที่ต้องการใช้ดำเนินการต่อ
หากคุณเปิดเว็บแอปหรือส่วนเสริมแล้วพบปัญหาเกี่ยวกับการเข้าสู่ระบบหลายบัญชี ให้ลองใช้วิธีแก้ปัญหาต่อไปนี้
- ออกจากระบบบัญชี Google ทั้งหมด แล้วลงชื่อเข้าใช้เฉพาะบัญชีที่มีส่วนเสริมหรือเว็บแอปที่ต้องการเข้าถึง
- เปิดหน้าต่างที่ไม่ระบุตัวตนใน Google Chrome หรือหน้าต่างการท่องเว็บแบบส่วนตัวที่เทียบเท่า แล้วเข้าสู่ระบบบัญชี Google ที่มีส่วนเสริมหรือเว็บแอปที่คุณต้องการเข้าถึง
การขอความช่วยเหลือ
โปรดไปที่หน้าการสนับสนุนเพื่อถามคำถามหรือรายงานข้อบกพร่อง