Nhập và xuất dự án

Vì các dự án Apps Script nằm trên Google Drive, nên nhà phát triển có thể nhập và xuất mã nguồn Apps Script bằng API Google Drive (không nên nhầm lẫn với Dịch vụ Drive trong Apps Script).

Ví dụ: nhà phát triển có thể tạo mã Apps Script mới trên máy cục bộ bằng trình soạn thảo mã yêu thích của mình, đồng thời sử dụng một hệ thống quản lý phiên bản như Git để cộng tác với các nhà phát triển khác. Sau khi hoàn tất một phiên bản, cô ấy có thể tải (nhập) các tệp lên Google Drive bằng REST API. Tại đây, bạn có thể sử dụng các tệp đó như mọi dự án Apps Script khác.

Bạn có thể thực hiện thay đổi mã trên các phiên bản cục bộ và đồng bộ hoá với dự án Apps Script bằng cách sử dụng API Google Drive. Bạn có thể tải (xuất) các dự án hiện có xuống (xuất) từ Google Drive xuống một máy cục bộ.

Tính năng và hạn chế

Nếu bạn muốn sử dụng API Google Drive để nhập hoặc xuất dự án, hãy lưu ý những điều sau:

  1. Tệp tập lệnh phía máy chủ dự kiến có đuôi ".gs". Bạn có thể muốn phát triển cục bộ bằng cách sử dụng tệp .js, nhưng hãy nhớ đổi tên để bao gồm phần mở rộng .gs trước khi nhập vào Google Drive.
  2. Tệp tập lệnh phía máy khách cần phải kết thúc bằng ".html". Tệp này bao gồm các tệp .html, .js hoặc .css phía máy khách. Xin nhắc lại, bạn có thể phát triển cục bộ bằng cách sử dụng các tiện ích khác, nhưng điều quan trọng là phải có phần mở rộng .html trước khi nhập vào Google Drive.
  3. Khi bạn nhập tệp dự án vào Google Drive, tất cả dữ liệu hiện có trong các tệp đó sẽ bị ghi đè. Bạn không thể nối hoặc chèn một phần văn bản; toàn bộ tệp phải được cập nhật.
  4. Tệp tập lệnh phía máy chủ phải chứa JavaScript hợp lệ. Nếu có lỗi trong tệp .js máy chủ, lệnh gọi cập nhật API Google Drive sẽ không thành công kèm theo lỗi 5xx. Bạn có thể ngăn chặn điều này bằng cách tìm lỗi mã nguồn cho mã trước khi nhập.
  5. Không thể nhập tệp trống. Lệnh gọi cập nhật API Google Drive sẽ không thực hiện được kèm theo lỗi 5xx nếu bạn cố tải một tệp trống lên.
  6. Bạn chỉ có thể nhập hoặc xuất các tập lệnh độc lập. Không thể truy cập vào các tập lệnh giới hạn vùng chứa thông qua API Google Drive.
  7. Bạn chỉ có thể nhập hoặc xuất mã nguồn. Các tài nguyên như thuộc tính hoặc nhật ký của dự án cũng không được hiển thị thông qua API Google Drive. Không thể thực hiện các hành động như tạo phiên bản tập lệnh, xuất bản hoặc thực thi tập lệnh thông qua API Google Drive.
  8. Bạn không bị giới hạn ở một tệp Code.gs trên máy chủ. Bạn có thể trải mã máy chủ trên nhiều tệp để dễ phát triển. Tất cả các tệp máy chủ đều được tải vào cùng một không gian tên chung, vì vậy, hãy sử dụng các lớp JavaScript khi bạn muốn đóng gói an toàn.

API Drive

API Google Drive cho phép nhà phát triển truy cập vào tệp trong Google Drive theo phương thức lập trình. API này sử dụng GET để tải tệp xuống và PUT/POST để tải tệp lên. Vui lòng tham khảo trang Tổng quan về API Google Drive để biết các tài liệu chi tiết và cách bắt đầu nhanh.

Hướng dẫn này sẽ tập trung vào việc liệt kê và di chuyển các tệp cùng với tài nguyên Tệp thông qua các lệnh gọi sau:

Ủy quyền

Tất cả các yêu cầu gửi đến API Google Drive phải được một người dùng đã xác thực ủy quyền thông qua giao thức OAuth 2.0. Để biết thêm chi tiết, vui lòng tham khảo Tài liệu cấp phép API Google Drive.

Ngoài các phạm vi khác mà một ứng dụng có thể cần (chẳng hạn như https://www.googleapis.com/auth/drive), tất cả ứng dụng muốn nhập hoặc xuất dự án Google Apps Script đều phải yêu cầu phạm vi đặc biệt:

https://www.googleapis.com/auth/drive.scripts

Liệt kê các dự án hiện có

Để liệt kê tất cả dự án Apps Script trong Drive của bạn, hãy sử dụng tài nguyên Tệp để truy vấn các tệp có loại MIME là application/vnd.google-apps.script. Để lọc phản hồi nhằm chỉ bao gồm các tệp mà bạn sở hữu, hãy thêm tham số tìm kiếm 'me' in owners.

Dưới đây là yêu cầu và phản hồi mẫu cho thấy một loạt dự án Apps Script được trả về thông qua phản hồi JSON.

GET https://www.googleapis.com/drive/v2/files?q=mimeType%3D'application%2Fvnd.google-apps.script'+and+'me'+in+owners
Authorization:  Bearer ya29.fakebearerstring
{
 "kind": "drive#fileList",
 "etag": "\"kjsas92/f3zGUXczKMxEB_9ZTMRFOF3d1ZU\"",
 "selfLink": "https://www.googleapis.com/drive/v2/files?q=mimeType%3D'application/vnd.google-apps.script'+and+'me'+in+owners",
 "items": [
  {
   "kind": "drive#file",
   "id": "1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D",
   "etag": "\"kjsas92/MTM3MDk3ODY5ODQyNg\"",
   "selfLink": "https://www.googleapis.com/drive/v2/files/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D",
   "alternateLink": "https://script.google.com/a/google.com/d/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D/edit?usp=drivesdk",
   "iconLink": "https://ssl.gstatic.com/docs/doclist/images/icon_11_script_list.png",
   "title": "Mail merge",
   "mimeType": "application/vnd.google-apps.script",
   "description": "",
   "labels": {
    "starred": false,
    "hidden": false,
    "trashed": true,
    "restricted": false,
    "viewed": true
   },
   "createdDate": "2013-06-11T19:24:45.188Z",
   "modifiedDate": "2013-06-11T19:24:58.426Z",
   "modifiedByMeDate": "2013-06-11T19:24:58.426Z",
   "lastViewedByMeDate": "2013-06-11T19:24:58.426Z",
   "parents": [
    {
     "kind": "drive#parentReference",
     "id": "0APdyIOzo7bWDUk9PVA",
     "selfLink": "https://www.googleapis.com/drive/v2/files/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D/parents/0APdyIOzo7bWDUk9PVA",
     "parentLink": "https://www.googleapis.com/drive/v2/files/0APdyIOzo7bWDUk9PVA",
     "isRoot": true
    }
   ],
   "exportLinks": {
    "application/json": "https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json"
   },
   "userPermission": {
    "kind": "drive#permission",
    "etag": "\"kjsas92/259X2r5DVstv1CcIQTjt_RQPSW8\"",
    "id": "me",
    "selfLink": "https://www.googleapis.com/drive/v2/files/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D/permissions/me",
    "role": "owner",
    "type": "user"
   },
   "quotaBytesUsed": "0",
   "ownerNames": [
    "John Doe"
   ],
   "owners": [
    {
     "kind": "drive#user",
     "displayName": "John Doe",
     "picture": {
      "url": "https://lh4.googleusercontent.com/-yd1rIb6Pe2Y/AAAAAAAAAAI/AAAAAAAAAGs/PP5vTuZonik/s64/photo.jpg"
     },
     "isAuthenticatedUser": true,
     "permissionId": "1234566789"
    }
   ],
   "lastModifyingUserName": "John Doe",
   "lastModifyingUser": {
    "kind": "drive#user",
    "displayName": "John Doe",
    "picture": {
     "url": "https://lh4.googleusercontent.com/-yd1rIb6Pe2Y/AAAAAAAAAAI/AAAAAAAAAGs/PP5vTuZonik/s64/photo.jpg"
    },
    "isAuthenticatedUser": true,
    "permissionId": "1234566789"
   },
   "editable": true,
   "writersCanShare": true,
   "shared": false,
   "explicitlyTrashed": true,
   "appDataContents": false
  }
 ]
}

Nếu biết mã nhận dạng tệp của một dự án Apps Script, bạn có thể trực tiếp tìm nạp mã này bằng lệnh gọi API sau:

GET https://www.googleapis.com/drive/v2/files/1234567890abcefghijklmnopqrstuvwxyz
Authorization:  Bearer ya29.fakebearerstring

Xuất dự án từ Drive

Sau khi bạn nhận lại tài nguyên File từ API, thuộc tính exportLinks sẽ chứa một URL cần tìm nạp để lấy nội dung của dự án dưới dạng dữ liệu JSON. Dưới đây là một ví dụ về hình thức của URL này:

https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json

Gửi yêu cầu đến URL này để truy xuất nội dung của chính dự án. Đảm bảo rằng bạn đưa vào tiêu đề Authorization có cùng một mã thông báo OAuth Bearer

Dưới đây là yêu cầu và phản hồi mẫu:

GET https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json
Authorization:  Bearer ya29.fakebearerstring
{
  "files": [
    {
      "id":"9basdfbd-749a-4as9b-b9d1-d64basdf803",
      "name":"Code",
      "type":"server_js",
      "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
    },
    {
      "id":"3asf7c0d-1afb-4a9-8431-5asdfc79e7ae",
      "name":"index",
      "type":"html",
      "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    Hello, world!\n  \u003c/body\u003e\n\u003c/html\u003e"
    }
  ]
}

Ví dụ trên bao gồm mã cho một ứng dụng web đơn giản trong hướng dẫn Dịch vụ HTML. Xin lưu ý rằng bạn sẽ nhận lại một mảng Files, mỗi mảng có 4 thuộc tính sau:

id Giá trị nhận dạng nội bộ của một tệp trong dự án, cần dùng để tham chiếu tệp này trong quá trình cập nhật.
name Tên của tệp không có đuôi, như hiển thị trong Trình chỉnh sửa tập lệnh.
type Có hai loại tệp là server_js và html.
source Mã nguồn được mã hoá có trong tệp.

Nhập dự án vào Drive

Để cập nhật một dự án hiện có, hãy thực hiện lệnh gọi HTTP PUT tới tệp update API bằng fileId thích hợp. Ví dụ bên dưới cho thấy một giao dịch mẫu cho phần tải nội dung nghe nhìn lên. Bằng cách sử dụng một trong các thư viện ứng dụng, ứng dụng của bạn có thể dễ dàng đưa siêu dữ liệu và nội dung đa phương tiện vào cùng một lệnh gọi tải lên. Xin lưu ý rằng tiêu đề Content-Type chỉ định loại nội dung được tải lên trong trường hợp này.

PUT https://www.googleapis.com/upload/drive/v2/files/1234567890abcefghijklmnopqrstuvwxyz
Authorization:  Bearer ya29.fakebearerestring
Content-Type:  application/vnd.google-apps.script+json
{
  "files": [
    {
      "id":"9basdfbd-749a-4as9b-b9d1-d64basdf803",
      "name":"Code",
      "type":"server_js",
      "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
    },
    {
      "id":"3asf7c0d-1afb-4a9-8431-5asdfc79e7ae",
      "name":"index",
      "type":"html",
      "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    New message!!\n  \u003c/body\u003e\n\u003c/html\u003e"
    }
  ]
}

Tạo tệp mới trong dự án

Để tạo tệp mới trong dự án, hãy gửi yêu cầu PUT cho một tệp không có thuộc tính id. Nếu bạn đưa một tệp có giá trị nhận dạng không xác định, hệ thống sẽ gửi một thông báo lỗi.

Xoá tệp trong dự án

Để xoá một tệp khỏi dự án, hãy gửi yêu cầu PUT không bao gồm tệp đó (nhưng bao gồm mọi tệp khác trong dự án). Mọi tệp không được gửi lại trong quá trình nhập sẽ bị xoá khỏi máy chủ.

Đổi tên tệp trong dự án

Để đổi tên tệp trong dự án, hãy gửi yêu cầu PUT bằng id hiện có nhưng là name mới. Lưu ý rằng máy chủ sẽ bỏ qua mọi nỗ lực thay đổi thành type.

Tạo dự án mới

Để tạo một dự án mới, hãy gửi yêu cầu POST tới tệp insert API. Tương tự như lệnh gọi update, bạn có thể sử dụng thư viện ứng dụng để thêm siêu dữ liệu như tên dự án và nội dung mô tả.

Dưới đây là giao dịch mẫu về việc tải nội dung nghe nhìn lên. Thao tác này sẽ tạo một dự án có tên là "Không có tiêu đề" trong Drive của bạn. Bắt buộc phải có tham số convert trong URL. Tương tự như với lệnh gọi update, bạn bắt buộc phải có tiêu đề Content-Type.

POST https://www.googleapis.com/upload/drive/v2/files?convert=true
Authorization:  Bearer ya29.fakebearerestring
Content-Type:  application/vnd.google-apps.script+json
{
  "files": [
    {
      "name":"Code",
      "type":"server_js",
      "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
    },
    {
      "name":"index",
      "type":"html",
      "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    Hello, world!!\n  \u003c/body\u003e\n\u003c/html\u003e"
    }
  ]
}