Mengimpor dan Mengekspor Project

Karena project Apps Script berada di Google Drive, developer dapat mengimpor dan mengekspor kode sumber Apps Script menggunakan Google Drive API (berbeda dengan Drive Service di Apps Script).

Misalnya, developer dapat menulis kode Apps Script baru di komputer lokalnya dengan editor kode favoritnya dan menggunakan sistem kontrol versi seperti Git untuk berkolaborasi dengan developer lain. Setelah versi diselesaikan, dia dapat mengupload (mengimpor) file ke Google Drive menggunakan REST API, tempat file tersebut dapat digunakan seperti project Apps Script lainnya.

Perubahan kode dapat dilakukan di versi lokal dan disinkronkan ke project Apps Script menggunakan Google Drive API. Project yang sudah ada dapat didownload (diekspor) dari Google Drive ke komputer lokal.

Fitur dan Batasan

Jika Anda ingin menggunakan Google Drive API untuk mengimpor atau mengekspor project, perhatikan hal-hal berikut:

  1. File skrip sisi server diharapkan berakhir dengan ".gs". Anda mungkin ingin mengembangkan secara lokal menggunakan file .js, tetapi pastikan untuk mengganti namanya agar menyertakan ekstensi .gs sebelum mengimpor ke Google Drive.
  2. File skrip sisi klien harus diakhiri dengan ".html". Ini mencakup file .html, .js, atau .css sisi klien. Sekali lagi, Anda dapat melakukan pengembangan secara lokal menggunakan ekstensi lain, tetapi Anda harus memiliki ekstensi .html sebelum mengimpornya ke Google Drive.
  3. Saat Anda mengimpor file project ke Google Drive, semua data yang ada dalam file tersebut akan ditimpa. Anda tidak dapat menambahkan atau menyisipkan teks sebagian; seluruh file harus diperbarui.
  4. File skrip sisi server harus berisi JavaScript yang valid. Jika terjadi error pada file .js server Anda, panggilan update Google Drive API akan gagal dengan error 5xx. Anda dapat mencegah hal ini dengan melakukan analisis lint pada kode sebelum mengimpor.
  5. File kosong tidak dapat diimpor. Panggilan update Google Drive API akan gagal dengan error 5xx jika Anda mencoba mengupload file kosong.
  6. Hanya skrip mandiri yang dapat diimpor atau diekspor. Skrip terikat container tidak dapat diakses melalui Google Drive API.
  7. Hanya kode sumber yang dapat diimpor atau diekspor. Resource seperti properti project atau log juga tidak ditampilkan melalui Google Drive API. Tindakan seperti pembuatan versi skrip, publikasi, atau eksekusi skrip tidak dapat dilakukan melalui Google Drive API.
  8. Anda tidak dibatasi pada satu file Code.gs server. Anda dapat menyebarkan kode server di beberapa file untuk memudahkan pengembangan. Semua file server dimuat ke namespace global yang sama, jadi gunakan class JavaScript jika Anda ingin memberikan enkapsulasi yang aman.

Drive API

Google Drive API memungkinkan developer mengakses file di Google Drive secara terprogram. API ini menggunakan GET untuk mendownload file dan PUT/POST untuk mengupload file. Lihat halaman Ringkasan Google Drive API untuk mendapatkan dokumentasi dan panduan memulai mendetail.

Panduan ini akan berfokus pada mencantumkan dan memindahkan file dengan resource Files menggunakan panggilan berikut:

Otorisasi

Semua permintaan ke Google Drive API harus diizinkan oleh pengguna yang diautentikasi melalui protokol OAuth 2.0. Untuk detail selengkapnya, lihat dokumentasi otorisasi Google Drive API.

Selain cakupan lain yang mungkin diperlukan aplikasi (seperti https://www.googleapis.com/auth/drive), semua aplikasi yang mencoba mengimpor atau mengekspor project Google Apps Script harus meminta cakupan khusus:

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

Menampilkan daftar project yang sudah ada

Untuk mencantumkan semua project Apps Script di Drive, gunakan resource File untuk membuat kueri file dengan jenis MIME application/vnd.google-apps.script. Untuk memfilter respons agar hanya menyertakan file yang Anda miliki, sertakan parameter penelusuran 'me' in owners.

Berikut adalah contoh permintaan dan respons yang menunjukkan array project Apps Script yang ditampilkan melalui respons 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
  }
 ]
}

Jika mengetahui ID file project Apps Script, Anda dapat langsung mengambilnya dengan panggilan API berikut:

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

Mengekspor project dari Drive

Setelah Anda mendapatkan kembali resource File dari API, properti exportLinks akan berisi URL yang akan diambil untuk mendapatkan konten project sebagai data JSON. Berikut contoh tampilan URL ini:

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

Buat permintaan ke URL ini untuk mengambil konten project itu sendiri. Pastikan Anda menyertakan header Authorization dengan token Bearer OAuth yang sama

Berikut adalah contoh permintaan dan respons:

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"
    }
  ]
}

Contoh di atas menyertakan kode untuk aplikasi web sederhana dari panduan Layanan HTML. Perhatikan bahwa Anda mendapatkan kembali array Files, masing-masing dengan 4 properti berikut:

id ID internal file dalam project, diperlukan untuk mereferensikan file ini selama update.
name Nama file tanpa ekstensi, seperti yang ditampilkan di Editor Skrip.
type Dua jenis file adalah server_js dan html.
source Kode sumber yang dienkode yang terdapat dalam file.

Mengimpor project ke Drive

Untuk mengupdate project yang ada, lakukan panggilan PUT HTTP ke file update API dengan fileId yang sesuai. Contoh di bawah menunjukkan contoh transaksi untuk bagian upload media. Dengan menggunakan salah satu library klien, aplikasi Anda dapat dengan mudah menyertakan metadata dan media dalam panggilan upload yang sama. Perhatikan bahwa header Content-Type menentukan jenis konten yang diupload dalam kasus ini.

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"
    }
  ]
}

Membuat file baru dalam sebuah project

Untuk membuat file baru dalam project, kirim permintaan PUT untuk file tanpa properti id. Jika Anda menyertakan file dengan ID yang tidak dikenal, sistem akan menampilkan pesan error.

Menghapus file dalam project

Untuk menghapus file dari project, kirim permintaan PUT yang tidak menyertakan file tersebut (tetapi menyertakan semua file lain dalam project). File apa pun yang tidak dikirim kembali selama proses impor akan dihapus dari server.

Mengganti nama file dalam project

Untuk mengganti nama file dalam project, kirim permintaan PUT dengan id yang ada, tetapi name baru. Perhatikan bahwa server mengabaikan setiap upaya untuk mengubah ke type.

Buat project baru

Untuk membuat project baru, kirim permintaan POST ke file insert API. Mirip dengan panggilan update, Anda dapat menggunakan library klien untuk menyertakan metadata seperti nama dan deskripsi project.

Berikut adalah contoh transaksi upload media. Tindakan ini akan membuat project bernama "Untitled" di Drive Anda. Parameter convert di URL wajib diisi. Seperti panggilan update, header Content-Type diperlukan.

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"
    }
  ]
}