Ngay cả nhà phát triển giàu kinh nghiệm nhất cũng hiếm khi viết mã chính xác ngay từ lần thử đầu tiên, vì vậy, việc khắc phục sự cố là một phần quan trọng trong quy trình phát triển. Trong phần này, chúng ta sẽ đề cập đến một số kỹ thuật có thể giúp bạn tìm, hiểu và gỡ lỗi trong tập lệnh.
Thông báo lỗi
Khi tập lệnh gặp lỗi, một thông báo lỗi sẽ xuất hiện. Thông báo này đi kèm với một số dòng dùng để khắc phục sự cố. Có hai loại lỗi cơ bản được hiển thị theo cách này: lỗi cú pháp và lỗi thời gian chạy.
Lỗi cú pháp
Lỗi cú pháp là do bạn viết mã không tuân theo ngữ pháp JavaScript và lỗi sẽ được phát hiện ngay khi bạn cố gắng lưu tập lệnh. Ví dụ: đoạn mã sau đây chứa một lỗi cú pháp:
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);
}
Vấn đề về cú pháp ở đây là thiếu ký tự )
ở cuối dòng thứ tư. Khi cố gắng lưu tập lệnh, bạn sẽ gặp lỗi sau:
Thiếu dấu ) sau danh sách đối số. (dòng 4)
Bạn thường có thể dễ dàng khắc phục những loại lỗi này vì chúng xuất hiện ngay lập tức và thường có nguyên nhân đơn giản. Bạn không thể lưu tệp chứa lỗi cú pháp, tức là chỉ mã hợp lệ mới được lưu vào dự án của bạn.
Lỗi thời gian chạy
Những lỗi này xảy ra do bạn sử dụng sai một hàm hoặc lớp và chỉ có thể phát hiện được sau khi tập lệnh đã chạy. Ví dụ: mã sau đây gây ra lỗi thời gian chạy:
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);
}
Mã được định dạng chính xác, nhưng chúng ta đang truyền giá trị "john" cho địa chỉ email khi gọi MailApp.sendEmail
. Vì đây không phải là một địa chỉ email hợp lệ, nên lỗi sau sẽ xảy ra khi chạy tập lệnh:
Email không hợp lệ: john (dòng 5)
Điều khiến những lỗi này khó khắc phục hơn là thường thì dữ liệu bạn đang truyền vào một hàm không được ghi trong mã mà thay vào đó được lấy từ bảng tính, biểu mẫu hoặc nguồn dữ liệu bên ngoài khác. Việc sử dụng các kỹ thuật gỡ lỗi dưới đây có thể giúp bạn xác định nguyên nhân gây ra những lỗi này.
Lỗi phổ biến
Dưới đây là danh sách các lỗi thường gặp và nguyên nhân gây ra lỗi.
Dịch vụ bị gọi quá nhiều lần: <action name>
Lỗi này cho biết bạn đã vượt quá hạn mức hằng ngày cho một hành động nhất định. Ví dụ: bạn có thể gặp phải lỗi này nếu gửi quá nhiều email trong một ngày. Hạn mức được đặt ở nhiều cấp độ cho tài khoản người tiêu dùng, tài khoản miền và tài khoản cao cấp, đồng thời có thể thay đổi bất cứ lúc nào mà không cần Google thông báo trước. Bạn có thể xem hạn mức cho nhiều hành động trong tài liệu về hạn mức của Apps Script.
Máy chủ không hoạt động. hoặc Đã xảy ra lỗi máy chủ, vui lòng thử lại.
Có một số nguyên nhân có thể gây ra những lỗi này:
- Một máy chủ hoặc hệ thống của Google tạm thời không hoạt động. Vui lòng đợi một lát rồi thử chạy lại tập lệnh.
- Tập lệnh của bạn có lỗi nhưng không có thông báo lỗi tương ứng. Hãy thử gỡ lỗi tập lệnh và xem bạn có thể tách biệt vấn đề hay không.
- Có một lỗi trong Google Apps Script gây ra lỗi này. Để biết hướng dẫn về cách tìm kiếm và gửi báo cáo lỗi, hãy xem phần Lỗi. Trước khi báo lỗi mới, hãy tìm kiếm để xem những người khác đã báo cáo lỗi đó hay chưa.
Bạn cần được cho phép để thực hiện hành động đó.
Lỗi này cho biết tập lệnh thiếu quyền cần thiết để chạy. Khi một tập lệnh được chạy trong Trình chỉnh sửa tập lệnh hoặc từ một mục trong trình đơn tuỳ chỉnh, hộp thoại uỷ quyền sẽ xuất hiện cho người dùng. Tuy nhiên, khi một tập lệnh được chạy từ một trình kích hoạt, được nhúng vào một trang Google Sites hoặc chạy dưới dạng một dịch vụ, hộp thoại sẽ không thể xuất hiện và lỗi này sẽ xuất hiện.
Để uỷ quyền cho tập lệnh, hãy mở Trình chỉnh sửa tập lệnh rồi chạy một hàm bất kỳ. Lời nhắc uỷ quyền sẽ xuất hiện để bạn có thể uỷ quyền cho dự án tập lệnh. Nếu tập lệnh chứa các dịch vụ mới chưa được uỷ quyền, bạn phải uỷ quyền lại cho tập lệnh.
Lỗi này thường xảy ra do các điều kiện kích hoạt đang kích hoạt trước khi người dùng cho phép. Nếu không có quyền truy cập vào dự án tập lệnh (ví dụ: vì lỗi xảy ra đối với một tiện ích bổ sung mà bạn sử dụng), thì bạn thường có thể uỷ quyền cho tập lệnh bằng cách sử dụng lại tiện ích bổ sung. Nếu một điều kiện kích hoạt tiếp tục kích hoạt và gây ra lỗi này, bạn có thể xoá các điều kiện kích hoạt bằng cách làm như sau:
- Ở bên trái dự án Apps Script, hãy nhấp vào Điều kiện kích hoạt .
- Ở bên phải điều kiện kích hoạt mà bạn muốn xoá, hãy nhấp vào biểu tượng Tuỳ chọn khác > Xoá điều kiện kích hoạt.
Bạn cũng có thể xoá các điều kiện kích hoạt tiện ích bổ sung gây ra vấn đề bằng cách gỡ cài đặt tiện ích bổ sung.
Bị từ chối truy cập: DriveApp hoặc Chính sách miền đã tắt các ứng dụng Drive của bên thứ ba
Quản trị viên của các miền Google Workspace có thể tắt Drive API cho miền của họ. Việc này sẽ ngăn người dùng cài đặt và sử dụng các ứng dụng Google Drive. Chế độ cài đặt này cũng ngăn người dùng sử dụng các tiện ích bổ sung Apps Script dùng dịch vụ Drive hoặc Dịch vụ Drive nâng cao (ngay cả khi tập lệnh được uỷ quyền trước khi quản trị viên vô hiệu hoá Drive API).
Tuy nhiên, nếu một tiện ích bổ sung hoặc ứng dụng web sử dụng dịch vụ Drive được xuất bản để cài đặt trên toàn miền và được quản trị viên cài đặt cho một số hoặc tất cả người dùng trong miền, thì các hàm tập lệnh sẽ hoạt động đối với những người dùng đó ngay cả khi API Drive bị vô hiệu hoá trong miền.
Tập lệnh không có quyền lấy danh tính của người dùng đang hoạt động.
Cho biết rằng tập lệnh không có thông tin về danh tính và email của người dùng đang hoạt động. Cảnh báo này là kết quả của một lệnh gọi đến Session.getActiveUser()
.
Lỗi này cũng có thể xảy ra khi gọi Session.getEffectiveUser()
nếu tập lệnh đang chạy ở chế độ uỷ quyền khác với AuthMode.FULL
.
Nếu cảnh báo này được báo hiệu, các lệnh gọi tiếp theo đến User.getEmail()
sẽ chỉ trả về "".
Có một số cách để khắc phục cảnh báo này, tuỳ thuộc vào chế độ uỷ quyền mà tập lệnh đang chạy. Chế độ uỷ quyền được hiển thị trong các hàm được kích hoạt dưới dạng thuộc tính authMode
của tham số sự kiện e
.
- Trong
AuthMode.FULL
, hãy cân nhắc sử dụngSession.getEffectiveUser()
. - Trong
AuthMode.LIMITED
, hãy đảm bảo rằng chủ sở hữu đã cho phép tập lệnh. - Trong các chế độ uỷ quyền khác, hãy tránh gọi một trong hai phương thức này.
- Nếu bạn là Google Workspace khách hàng mới gặp phải cảnh báo này từ một trình kích hoạt có thể cài đặt, hãy đảm bảo rằng trình kích hoạt đang chạy dưới dạng người dùng trong tổ chức của bạn.
Thiếu thư viện
Nếu thêm một thư viện phổ biến vào tập lệnh, bạn có thể nhận được thông báo lỗi cho biết thư viện đó bị thiếu, mặc dù thư viện này được liệt kê là một phần phụ thuộc cho tập lệnh của bạn. Lý do có thể là do có quá nhiều người truy cập vào thư viện cùng một lúc. Để tránh lỗi này, hãy thử một trong những giải pháp sau:
- Sao chép và dán mã của thư viện vào tập lệnh, rồi xoá phần phụ thuộc của thư viện.
- Sao chép tập lệnh thư viện và triển khai tập lệnh đó dưới dạng một thư viện trong tài khoản của bạn. Hãy nhớ cập nhật phần phụ thuộc trong tập lệnh gốc của bạn thành thư viện mới thay vì thư viện công khai.
Đã xảy ra lỗi do thiếu một phiên bản thư viện hoặc phiên bản triển khai. Mã lỗi Not_Found
Thông báo lỗi này cho biết một trong những điều sau:
- Đã xoá phiên bản tập lệnh được triển khai. Để cập nhật phiên bản đã triển khai của tập lệnh, hãy xem bài viết Chỉnh sửa bản triển khai có đánh dấu phiên bản.
- Phiên bản của một thư viện mà tập lệnh sử dụng đã bị xoá. Để kiểm tra thư viện nào bị thiếu, bên cạnh tên thư viện, hãy nhấp vào > Mở trong thẻ mới. Thư viện bị thiếu sẽ đưa ra một thông báo lỗi. Sau khi tìm thấy thư viện cần cập nhật, hãy thực hiện một trong các thao tác sau:
- Cập nhật thư viện để sử dụng một phiên bản khác. Xem phần Cập nhật thư viện.
- Xoá thư viện đã bị xoá khỏi dự án tập lệnh và mã của bạn. Xem phần Xoá thư viện.
Tuỳ chọn khác
- Tập lệnh của một thư viện mà tập lệnh của bạn sử dụng có chứa một thư viện khác sử dụng phiên bản đã bị xoá. Thực hiện một trong các thao tác sau:
- Nếu bạn có quyền chỉnh sửa thư viện mà tập lệnh của bạn sử dụng, hãy cập nhật thư viện phụ trong tập lệnh đó thành một phiên bản hiện có.
- Cập nhật thư viện để sử dụng một phiên bản khác. Xem phần Cập nhật thư viện.
- Xoá thư viện khỏi dự án tập lệnh và mã của bạn. Xem phần Xoá thư viện.
Lỗi 400: invalid_scope khi gọi Google Chat API bằng dịch vụ nâng cao
Nếu bạn gặp Error 400: invalid_scope
với thông báo lỗi Some requested scopes cannot be shown
, tức là bạn chưa chỉ định phạm vi uỷ quyền nào trong tệp appsscript.json
của dự án Apps Script. Trong hầu hết các trường hợp, Apps Script sẽ tự động xác định những phạm vi mà một tập lệnh cần, nhưng khi sử dụng dịch vụ nâng cao của Chat, bạn phải thêm thủ công các phạm vi uỷ quyền mà tập lệnh sử dụng vào tệp kê khai của dự án Apps Script. Xem phần Đặt phạm vi rõ ràng.
Để giải quyết lỗi này, hãy thêm các phạm vi uỷ quyền thích hợp vào tệp appsscript.json
của dự án Apps Script trong mảng oauthScopes
. Ví dụ: để gọi phương thức spaces.messages.create
, hãy thêm nội dung sau:
"oauthScopes": [
"https://www.googleapis.com/auth/chat.messages.create"
]
Quản trị viên của bạn không cho phép thực hiện các lệnh gọi UrlFetch đến <URL>
Quản trị viên Google Workspace có thể bật danh sách cho phép trong bảng điều khiển dành cho quản trị viên để kiểm soát những miền bên ngoài mà bạn có thể truy cập thông qua Apps Script.
Để giải quyết lỗi này, hãy liên hệ với quản trị viên để yêu cầu họ thêm URL vào danh sách cho phép.
Gỡ lỗi
Không phải lỗi nào cũng khiến thông báo lỗi xuất hiện. Có thể có một lỗi tinh vi hơn, trong đó mã này về mặt kỹ thuật là chính xác và có thể thực thi, nhưng kết quả không như bạn mong đợi. Sau đây là một số chiến lược để xử lý những tình huống như vậy và điều tra thêm về một tập lệnh không chạy theo cách bạn mong đợi.
Ghi nhật ký
Trong quá trình gỡ lỗi, việc ghi lại thông tin khi dự án tập lệnh thực thi thường rất hữu ích. Google Apps Script có hai phương thức ghi nhật ký thông tin: Dịch vụ ghi nhật ký trên đám mây và Dịch vụ Logger và console cơ bản hơn được tích hợp vào trình chỉnh sửa Apps Script.
Hãy xem hướng dẫn về tính năng ghi nhật ký để biết thêm thông tin chi tiết.
Error Reporting
Các trường hợp ngoại lệ xảy ra do lỗi thời gian chạy sẽ tự động được ghi lại bằng dịch vụ Báo cáo lỗi của Google Cloud. Dịch vụ này cho phép bạn tìm kiếm và lọc các thông báo ngoại lệ mà dự án tập lệnh của bạn tạo ra.
Để truy cập vào tính năng Báo cáo lỗi, hãy xem phần Xem nhật ký và báo cáo lỗi trên Cloud trong bảng điều khiển Google Cloud Platform.
Thực thi
Mỗi khi bạn chạy một tập lệnh, Apps Script sẽ ghi lại quá trình thực thi, bao gồm cả nhật ký trên đám mây. Những bản ghi này có thể giúp bạn hiểu được những hành động mà tập lệnh đã thực hiện.
Để xem các lần thực thi tập lệnh trong dự án Apps Script, ở bên trái, hãy nhấp vào Lần thực thi
.Kiểm tra trạng thái dịch vụ Apps Script
Mặc dù hiếm gặp, nhưng đôi khi các dịch vụ cụ thể của Google Workspace (chẳng hạn như Gmail hoặc Drive) gặp phải các vấn đề tạm thời có thể dẫn đến tình trạng ngừng dịch vụ. Khi điều này xảy ra, những dự án Apps Script tương tác với các dịch vụ này có thể không hoạt động như mong đợi.
Bạn có thể kiểm tra xem có dịch vụ Google Workspace nào bị ngừng hoạt động hay không bằng cách xem Trang tổng quan trạng thái Google Workspace. Nếu đang gặp phải tình trạng ngừng hoạt động, bạn có thể đợi cho đến khi vấn đề được giải quyết hoặc tìm kiếm thêm thông tin trợ giúp trong Trung tâm trợ giúp của Google Workspace hoặc tài liệu Các sự cố đã biết của Google Workspace.
Sử dụng trình gỡ lỗi và điểm ngắt
Để xác định vị trí các vấn đề trong tập lệnh, bạn có thể chạy tập lệnh ở chế độ gỡ lỗi. Khi chạy ở chế độ gỡ lỗi, một tập lệnh sẽ tạm dừng khi gặp điểm ngắt. Đây là dòng mà bạn đã đánh dấu trong tập lệnh và cho rằng có thể gặp vấn đề. Khi một tập lệnh tạm dừng, tập lệnh đó sẽ hiển thị giá trị của từng biến tại thời điểm đó, cho phép bạn kiểm tra hoạt động bên trong của một tập lệnh mà không cần thêm nhiều câu lệnh ghi nhật ký.
Thêm điểm ngắt
Để thêm một điểm ngắt, hãy di chuột lên số dòng của dòng mà bạn muốn thêm điểm ngắt. Ở bên trái số dòng, hãy nhấp vào vòng tròn. Hình ảnh bên dưới cho thấy ví dụ về một điểm ngắt được thêm vào tập lệnh:
Chạy tập lệnh ở chế độ gỡ lỗi
Để chạy tập lệnh ở chế độ gỡ lỗi, hãy nhấp vào Gỡ lỗi ở đầu trình chỉnh sửa.
Trước khi tập lệnh chạy dòng có điểm ngắt, tập lệnh sẽ tạm dừng và hiển thị một bảng thông tin gỡ lỗi. Bạn có thể dùng bảng này để kiểm tra dữ liệu như giá trị của các tham số và thông tin được lưu trữ trong các đối tượng.
Để kiểm soát cách chạy tập lệnh, ở đầu bảng điều khiển Trình gỡ lỗi, hãy sử dụng các nút "Step in" (Bước vào), "Step over" (Bước qua) và "Step out" (Bước ra). Các tuỳ chọn này cho phép bạn chạy tập lệnh từng dòng một và kiểm tra cách các giá trị thay đổi theo thời gian.
Lỗi: Không có mã nguồn cho dòng hiện tại
Lỗi này xuất hiện khi không có tệp gỡ lỗi đang hoạt động.
Google Apps Script không hỗ trợ việc hiển thị các tập lệnh JavaScript (JS) được tạo động trong trình chỉnh sửa tập lệnh, chẳng hạn như các tập lệnh được tạo bằng eval()
và new Function()
. Các tập lệnh này được tạo và thực thi trong công cụ V8 nhưng không được biểu thị dưới dạng các tệp độc lập trong trình chỉnh sửa.
Nếu đi vào các tập lệnh này, bạn sẽ gặp phải lỗi này.
Ví dụ: hãy xem xét đoạn mã sau:
function myFunction() {
eval('a=2');
}
Khi eval()
được gọi, đối số của nó sẽ được coi là mã JS và chạy dưới dạng một tập lệnh được tạo động bên trong công cụ V8. Nếu bạn bước vào eval()
, lỗi này sẽ xuất hiện. Nếu tập lệnh có chú thích //# sourceURL
, tên của tập lệnh sẽ xuất hiện trong ngăn xếp lệnh gọi. Nếu không, mục này sẽ xuất hiện dưới dạng một mục không có tên.
Mặc dù có thông báo lỗi, nhưng phiên gỡ lỗi vẫn hoạt động và quá trình thực thi có thể tiếp tục. Để tiếp tục, hãy chuyển sang bước vào, bước ra hoặc tiếp tục thực thi. Tuy nhiên, lỗi này vẫn tiếp tục xuất hiện miễn là quá trình thực thi vẫn nằm trong phạm vi của tập lệnh động. Sau khi quá trình thực thi thoát khỏi tập lệnh động, quá trình gỡ lỗi sẽ tiếp tục mà không gặp lỗi này.
Vấn đề khi đăng nhập vào nhiều Tài khoản Google
Nếu đăng nhập vào nhiều Tài khoản Google cùng lúc, bạn có thể gặp sự cố khi truy cập vào tiện ích bổ sung và ứng dụng web. Tính năng đăng nhập nhiều tài khoản, hay đăng nhập vào nhiều Tài khoản Google cùng lúc, không được hỗ trợ đối với Apps Script, tiện ích bổ sung hoặc ứng dụng web.
Nếu bạn mở trình chỉnh sửa Apps Script trong khi đăng nhập vào nhiều tài khoản, Google sẽ nhắc bạn chọn tài khoản bạn muốn tiếp tục.
Nếu bạn mở một ứng dụng web hoặc tiện ích bổ sung và gặp vấn đề khi đăng nhập nhiều tài khoản, hãy thử một trong các giải pháp sau:
- Đăng xuất khỏi tất cả Tài khoản Google của bạn và chỉ đăng nhập vào tài khoản có tiện ích bổ sung hoặc ứng dụng web mà bạn muốn truy cập.
- Mở một cửa sổ ẩn danh trong Google Chrome hoặc một cửa sổ duyệt web ở chế độ riêng tư tương đương, rồi đăng nhập vào Tài khoản Google có tiện ích bổ sung hoặc ứng dụng web mà bạn muốn truy cập.
Nhận trợ giúp
Gỡ lỗi bằng các công cụ và kỹ thuật nêu trên có thể giải quyết nhiều vấn đề, nhưng có thể bạn sẽ gặp phải những vấn đề cần thêm sự trợ giúp để giải quyết. Hãy xem trang Hỗ trợ của chúng tôi để biết thông tin về nơi đặt câu hỏi và báo cáo lỗi.