Khắc phục sự cố

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 trong lần đầ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. Phần này trình bày các kỹ thuật để 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 kèm theo số dòng. Có hai loại lỗi cơ bản: lỗi cú pháplỗi thời gian chạy.

Lỗi cú pháp

Lỗi cú pháp xảy ra khi mã không tuân theo ngữ pháp JavaScript và được phát hiện khi bạn 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 đề là thiếu ký tự ) ở cuối dòng 4. Khi bạn lưu tập lệnh, lỗi sau đây sẽ xuất hiện:

Thiếu ) sau danh sách đối số. (dòng 4)

Những lỗi này được tìm thấy ngay lập tức, giúp bạn dễ dàng khắc phục sự cố. Chỉ mã hợp lệ mới được lưu vào dự án.

Lỗi thời gian chạy

Lỗi thời gian chạy xảy ra khi một hàm hoặc lớp được sử dụng không đúng cách và được phát hiện khi tập lệnh chạy. Ví dụ: đoạn 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 dù mã được định dạng đúng cách, nhưng "john" là một địa chỉ email không hợp lệ. Lỗi sau đây sẽ được gửi:

Email không hợp lệ: john (dòng 5)

Những lỗi này rất khó khắc phục vì dữ liệu thường được lấy từ các nguồn bên ngoài như trang tính hoặc biểu mẫu. Hãy sử dụng các kỹ thuật gỡ lỗi để xác định nguyên nhân.

Lỗi thường gặp

Sau đâ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, chẳng hạn như gửi quá nhiều email. Hạn mức thay đổi tuỳ theo loại tài khoản và có thể thay đổi. Xem các giới hạn 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ác nguyên nhân có thể bao gồm:

  • Một máy chủ của Google tạm thời không hoạt động. Hãy đợi rồi thử lại.
  • Lỗi trong tập lệnh của bạn thiếu thông báo tương ứng. Hãy thử gỡ lỗi để xác định vấn đề.
  • Có một lỗi trong Google Apps Script. Tìm và gửi báo cáo lỗi trong Bugs.

Cần được cho phép để thực hiện tác vụ đó.

Tập lệnh thiếu quyền cần thiết để chạy. Khi một tập lệnh chạy từ một điều kiện kích hoạt hoặc dưới dạng dịch vụ, hộp thoại uỷ quyền không thể 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 và chạy bất kỳ hàm nào. Nếu tập lệnh sử dụng 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 đó.

Các điều kiện kích hoạt hoạt động trước khi uỷ quyền hoặc sau khi hết hạn thường gây ra lỗi này. Nếu một tiện ích bổ sung gây ra lỗi này, hãy sử dụng lại tiện ích bổ sung đó để uỷ quyền lại. Xoá các điều kiện kích hoạt có vấn đề:

  1. Trong dự án Apps Script, hãy nhấp vào Triggers (Điều kiện kích hoạt).
  2. Bên cạnh điều kiện kích hoạt, hãy nhấp vào biểu tượng More > Delete trigger.

Ngoài ra, bạn có thể gỡ cài đặt tiện ích bổ sung.

Quyền chi tiết cũng có thể gây ra những lỗi này. Hãy xem trang phạm vi uỷ quyền để bảo vệ quá trình thực thi điều kiện kích hoạt.

Access denied: DriveApp (Quyền truy cập bị từ chối: DriveApp) hoặc The domain policy has disabled third-party Drive apps (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 Google Workspace có thể tắt Drive API cho miền của họ, ngăn người dùng sử dụng các ứng dụng Drive hoặc tiện ích bổ sung Apps Script sử dụng dịch vụ Drive.

Nếu một tiện ích bổ sung hoặc ứng dụng web được xuất bản để cài đặt trên toàn miền và được quản trị viên cài đặt, thì các hàm tập lệnh sẽ hoạt động ngay cả khi API Drive bị tắt.

The script does not have permission to get the active user's identity. (Tập lệnh không có quyền lấy thông tin nhận dạng của người dùng đang hoạt động.)

Không có thông tin nhận dạng và email của người dùng đang hoạt động. Điều này là do các lệnh gọi đến Session.getActiveUser() hoặc Session.getEffectiveUser() ở các chế độ uỷ quyền khác AuthMode.FULL. Nếu tập lệnh chạy trên một điều kiện kích hoạt, bạn có thể tìm thấy chế độ uỷ quyền trong thuộc tính authMode của đối tượng sự kiện Apps Script.

Khắc phục sự cố này dựa trên chế độ uỷ quyền:

  • Trong AuthMode.FULL, hãy cân nhắc sử dụng Session.getEffectiveUser() thay thế.
  • Trong AuthMode.LIMITED, hãy đảm bảo rằng chủ sở hữu đã uỷ quyền cho tập lệnh.
  • Ở các chế độ uỷ quyền khác, hãy tránh gọi một trong hai phương thức.
  • Nếu bạn là khách hàng Google Workspace mới gặp phải cảnh báo này từ một điều kiện kích hoạt có thể cài đặt, hãy đảm bảo rằng điều kiện kích hoạt đang chạy dưới dạng người dùng trong tổ chức của bạn.

Library is missing (Thiếu thư viện)

Một thư viện có thể được báo cáo là bị thiếu nếu có quá nhiều người truy cập vào thư viện đó cùng lúc. Cách giải quyết:

  • Sao chép trực tiếp mã của thư viện vào tập lệnh.
  • Sao chép và triển khai thư viện từ tài khoản của riêng bạn.
  • Nếu không cần thư viện để tập lệnh hoạt động, hãy xoá thư viện đó khỏi dự án tập lệnh.

Error occurred due to a missing library version or a deployment version. Error code Not_Found (Đã 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:

  • Phiên bản tập lệnh do một bản triển khai sử dụng đã bị xoá. Để giải quyết vấn đề này, hãy chỉnh sửa bản triển khai và chọn một phiên bản tập lệnh khác.
  • Phiên bản thư viện do tập lệnh sử dụng đã bị xoá. Để giải quyết vấn đề này, trong trình chỉnh sửa tập lệnh ở mục "Libraries" (Thư viện), hãy tìm thư viện rồi cập nhật lên một phiên bản khác hoặc xoá thư viện đó. Để cập nhật, hãy nhấp vào số phiên bản rồi chọn một phiên bản khác. Để xoá, hãy nhấp vào biểu tượng Tuỳ chọn khác > Remove (Xoá).
  • Một thư viện bao gồm một thư viện khác và phiên bản của thư viện đó đã bị xoá. Để giải quyết vấn đề này, hãy liên hệ với tác giả của thư viện hoặc sử dụng một phiên bản khác của thư viện mà tập lệnh của bạn sử dụng.

Error 400: invalid_scope when calling Google Chat API with the advanced service (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 phải Error 400: invalid_scope với thông báo lỗi Some requested scopes cannot be shown (Không thể hiển thị một số phạm vi được yêu cầu), thì có nghĩa 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 phạm vi mà một tập lệnh cần, nhưng khi bạn sử dụng dịch vụ nâng cao của Chat, bạn phải thêm 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 theo cách thủ công. 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 như 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ể sử dụng danh sách cho phép để kiểm soát quyền truy cập vào miền bên ngoài. Hãy liên hệ với quản trị viên của bạn để thêm URL vào danh sách cho phép.

Vi phạm chính sách về quyền

Lỗi này xảy ra khi một ứng dụng sử dụng HTMLService cố gắng thực thi các Web API yêu cầu quyền nhạy cảm, chẳng hạn như navigator.mediaDevices.getUserMedia() để truy cập vào máy ảnh hoặc micrô. Môi trường hộp cát Apps Script hạn chế các tính năng này để bảo vệ tính bảo mật của người dùng.

Lưu trữ chức năng yêu cầu các quyền này trên một miền riêng biệt (bên ngoài Apps Script) và mở chức năng đó trong một cửa sổ hoặc thẻ mới. Sau đó, bạn có thể đăng dữ liệu hoặc phản hồi đã thu thập lại vào ứng dụng Apps Script như trong ví dụ này.

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>

Gỡ lỗi

Một số lỗi rất tinh vi và không kích hoạt thông báo. Ví dụ: mã của bạn có thể thực thi, nhưng kết quả lại không như mong đợi. Hãy sử dụng các chiến lược sau đây để điều tra các tập lệnh hoạt động không như mong đợi.

Ghi nhật ký

Ghi lại thông tin khi tập lệnh thực thi bằng dịch vụ ghi nhật ký Cloud hoặc các dịch vụ Logger và bảng điều khiển trong trình chỉnh sửa tập lệnh.

Error Reporting

Để sử dụng Error Reporting (Báo cáo lỗi) trong Google Cloud, hãy sử dụng một dự án tiêu chuẩn do người dùng quản lý thay vì một dự án mặc định.

Khi bạn sử dụng một dự án tiêu chuẩn, các lỗi thời gian chạy sẽ tự động được ghi lại trong Error Reporting của Google Cloud. Xem nhật ký Cloud và báo cáo lỗi trong bảng điều khiển Cloud của Google.

Thực thi

Google Apps Script ghi lại mọi hoạt động thực thi, bao gồm cả nhật ký Cloud. Để xem các hoạt động thực thi, hãy nhấp vào biểu tượng Executions .

Kiểm tra trạng thái dịch vụ

Kiểm tra tình trạng ngừng hoạt động của dịch vụ Google Workspace trên Trang tổng quan trạng thái 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, tập lệnh sẽ tạm dừng khi gặp một điểm ngắt. Đây là một dòng mà bạn đã đánh dấu trong tập lệnh và bạn cho rằng có thể có 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 điểm ngắt, hãy di chuột qua 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:

Thêm điểm ngắt

Chạy tập lệnh ở chế độ gỡ lỗi

Để chạy tập lệnh ở chế độ gỡ lỗi, ở đầu trình chỉnh sửa, hãy nhấp vào Debug (Gỡ lỗi).

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ể sử dụng bảng này để kiểm tra dữ liệu như các giá trị của 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 nút 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.

Error (Lỗi): Source code for the current line is not available (Không có mã nguồn cho dòng hiện tạ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ợ 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()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 bạn bước 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 bao gồm một nhận xét //# 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, tập lệnh đó 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 tiếp tục bước vào, bước ra hoặc tiếp tục thực thi. Tuy nhiên, lỗi này sẽ 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 chuyển ra khỏi tập lệnh động, quá trình gỡ lỗi sẽ tiếp tục mà không có 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, thì bạn có thể gặp sự cố khi truy cập vào các 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 tập lệnh 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 mà 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 phải 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

Hãy truy cập vào trang Hỗ trợ của chúng tôi để đặt câu hỏi hoặc gửi báo cáo lỗi.