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 (jangan sampai tertukar dengan Layanan Drive di Apps Script).

Misalnya, developer dapat menulis kode Apps Script baru di mesin 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 pada versi lokal dan disinkronkan ke project Apps Script menggunakan Google Drive API. Project yang ada dapat didownload (diekspor) dari Google Drive ke mesin lokal.

Fitur dan Batasan

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

  1. File skrip sisi server diharapkan diakhiri dengan ".gs". Anda dapat 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". Hal ini mencakup file .html, .js, atau .css sisi klien. Sekali lagi, Anda dapat mengembangkan secara lokal menggunakan ekstensi lain, tetapi penting untuk memiliki ekstensi .html sebelum mengimpor 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 sebagian teks; seluruh file harus diperbarui.
  4. File skrip sisi server harus berisi JavaScript yang valid. Jika ada error dalam file .js server Anda, panggilan update Google Drive API akan gagal dengan error 5xx. Anda dapat mencegah hal ini dengan melakukan linting 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 ke penampung tidak dapat diakses melalui Google Drive API.
  7. Hanya kode sumber yang dapat diimpor atau diekspor. Resource seperti properti atau log project juga tidak diekspos melalui Google Drive API. Tindakan seperti pembuatan versi skrip, memublikasikan, atau menjalankan 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 mempermudah pengembangan. Semua file server dimuat ke dalam namespace global yang sama, jadi gunakan class JavaScript jika Anda ingin menyediakan 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 mengetahui dokumentasi dan panduan memulai cepat yang mendetail.

Panduan ini akan berfokus pada pencantuman dan pemindahan file dengan resource File menggunakan panggilan berikut:

Otorisasi

Semua permintaan ke Google Drive API harus diizinkan oleh pengguna terautentikasi melalui protokol OAuth 2.0. Untuk mengetahui 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

Mencantumkan project yang ada

Untuk mencantumkan semua project Apps Script di Drive Anda, 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 contoh permintaan dan respons yang menampilkan 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 mengambilnya secara langsung dengan panggilan API berikut:

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

Mengekspor project dari Drive

Setelah Anda mendapatkan 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 OAuth Bearer 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 HTML Service. Perhatikan bahwa Anda akan mendapatkan kembali array Files, yang masing-masing memiliki 4 properti berikut:

id ID internal file dalam project, yang diperlukan untuk mereferensikan file ini selama pembaruan.
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 dan terdapat dalam file.

Mengimpor project ke Drive

Untuk mengupdate project yang ada, lakukan panggilan HTTP PUT ke file update API dengan fileId yang sesuai. Contoh di bawah ini 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 project

Untuk membuat file baru dalam project, kirim permintaan PUT untuk file tanpa properti id. Jika Anda menyertakan file dengan ID yang tidak diketahui, 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 upaya untuk mengubah ke type.

Buat project baru

Untuk membuat project baru, kirim permintaan POST ke file insert API. Sama seperti 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 "Tanpa Judul" di Drive Anda. Parameter convertdi 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"
    }
  ]
}