การนำเข้าและส่งออกโปรเจ็กต์

เนื่องจากโปรเจ็กต์ Apps Script อยู่ใน Google ไดรฟ์ นักพัฒนาซอฟต์แวร์จึงนําเข้าและส่งออกซอร์สโค้ดของ Apps Script โดยใช้ Google Drive API (อย่าสับสนกับบริการไดรฟ์ใน Apps Script)

เช่น นักพัฒนาซอฟต์แวร์เขียนโค้ด Apps Script ใหม่ในเครื่องของตัวเองโดยใช้ตัวแก้ไขโค้ดที่ชอบ และใช้ระบบควบคุมเวอร์ชันอย่าง Git เพื่อทำงานร่วมกับนักพัฒนาซอฟต์แวร์คนอื่นๆ ได้ เมื่อสรุปเวอร์ชันแล้ว เธอจะอัปโหลด (นำเข้า) ไฟล์ไปยัง Google ไดรฟ์โดยใช้ REST API ซึ่งสามารถนำไปใช้ได้เช่นเดียวกับโปรเจ็กต์ Apps Script อื่นๆ

การเปลี่ยนแปลงโค้ดจะทำได้ในเวอร์ชันในเครื่องและซิงค์กับโปรเจ็กต์ Apps Script โดยใช้ Google Drive API คุณสามารถดาวน์โหลด (ส่งออก) โปรเจ็กต์ที่มีอยู่จาก Google ไดรฟ์ไปยังเครื่องภายในได้

ฟีเจอร์และข้อจำกัด

หากต้องการใช้ Google Drive API เพื่อนำเข้าหรือส่งออกโปรเจ็กต์ โปรดพิจารณาสิ่งต่อไปนี้

  1. ไฟล์สคริปต์ฝั่งเซิร์ฟเวอร์ควรลงท้ายด้วย ".gs" คุณอาจต้องการพัฒนาในเครื่องโดยใช้ไฟล์ .js แต่อย่าลืมเปลี่ยนชื่อให้มีนามสกุล .gs ก่อนที่จะนำเข้าไปยัง Google ไดรฟ์
  2. ไฟล์สคริปต์ฝั่งไคลเอ็นต์ต้องลงท้ายด้วย ".html" ซึ่งรวมถึงไฟล์ .html, .js หรือ .css ฝั่งไคลเอ็นต์ และคุณสามารถพัฒนาโดยใช้ส่วนขยายอื่นๆ ในเครื่องได้ แต่คุณควรมีนามสกุล .html ก่อนนำเข้าไปยัง Google ไดรฟ์
  3. เมื่อนำเข้าไฟล์โปรเจ็กต์ไปยัง Google ไดรฟ์ ระบบจะเขียนทับข้อมูลที่มีอยู่ทั้งหมดในไฟล์เหล่านั้น คุณไม่สามารถต่อท้ายหรือแทรกข้อความบางส่วนได้ ต้องอัปเดตทั้งไฟล์
  4. ไฟล์สคริปต์ฝั่งเซิร์ฟเวอร์ต้องมี JavaScript ที่ถูกต้อง หากมีข้อผิดพลาดในไฟล์ .js ของเซิร์ฟเวอร์ การเรียกการอัปเดต Google Drive API จะไม่สำเร็จโดยมีข้อผิดพลาด 5xx คุณป้องกันปัญหานี้ได้ด้วยการลองเรียกใช้โค้ดก่อนนำเข้า
  5. นำเข้าไฟล์ว่างไม่ได้ การเรียกการอัปเดต Google Drive API จะล้มเหลวโดยมีข้อผิดพลาด 5xx หากคุณพยายามอัปโหลดไฟล์ว่าง
  6. นำเข้าหรือส่งออกได้เฉพาะสคริปต์แบบสแตนด์อโลน สคริปต์ที่ผูกกับคอนเทนเนอร์จะเข้าถึงผ่าน Google Drive API ไม่ได้
  7. นำเข้าหรือส่งออกได้เฉพาะซอร์สโค้ดเท่านั้น ทรัพยากร เช่น พร็อพเพอร์ตี้หรือบันทึกของโปรเจ็กต์ก็จะไม่แสดงผ่าน Google Drive API เช่นกัน คุณจะดำเนินการผ่าน Google ไดรฟ์ API ไม่ได้ เช่น การกำหนดเวอร์ชันสคริปต์ การเผยแพร่ หรือการเรียกใช้สคริปต์
  8. คุณมีไฟล์ Code.gs ในเซิร์ฟเวอร์เพียงไฟล์เดียวไม่ได้ คุณกระจายโค้ดของเซิร์ฟเวอร์ไปยังหลายๆ ไฟล์ได้เพื่อการพัฒนาได้ง่าย ไฟล์เซิร์ฟเวอร์ทั้งหมดจะโหลดในเนมสเปซสากลเดียวกัน ดังนั้น ให้ใช้คลาส JavaScript เมื่อต้องการให้การห่อหุ้มที่ปลอดภัย

Drive API

Google Drive API ช่วยให้นักพัฒนาซอฟต์แวร์เข้าถึงไฟล์ใน Google ไดรฟ์โดยใช้โปรแกรมได้ API นี้ใช้ GET ในการดาวน์โหลดไฟล์และ PUT/POST เพื่ออัปโหลดไฟล์ โปรดดูเอกสารโดยละเอียดและการเริ่มต้นใช้งานอย่างรวดเร็วในหน้าภาพรวม Google Drive API

คู่มือนี้จะเน้นการแสดงและการย้ายไฟล์ด้วยทรัพยากรไฟล์โดยใช้การเรียกต่อไปนี้

การให้สิทธิ์

คำขอทั้งหมดที่ส่งไปยัง API ของ Google ไดรฟ์ต้องได้รับอนุญาตจากผู้ใช้ที่ตรวจสอบสิทธิ์แล้วผ่านโปรโตคอล OAuth 2.0 โปรดดูรายละเอียดเพิ่มเติมในเอกสารประกอบการให้สิทธิ์ของ Google Drive API

นอกเหนือจากขอบเขตอื่นๆ ที่แอปพลิเคชันอาจต้องการใช้ (เช่น https://www.googleapis.com/auth/drive) แอปพลิเคชันทั้งหมดที่พยายามนำเข้าหรือส่งออกโครงการ Google Apps Script ต้องขอขอบเขตพิเศษดังนี้

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

แสดงรายการโปรเจ็กต์ที่มีอยู่

หากต้องการแสดงรายการโปรเจ็กต์ Apps Script ทั้งหมดในไดรฟ์ ให้ใช้ทรัพยากร Files เพื่อค้นหาไฟล์ที่มีประเภท MIME เป็น application/vnd.google-apps.script หากต้องการกรองคำตอบให้รวมเฉพาะไฟล์ที่คุณเป็นเจ้าของ ให้ใส่พารามิเตอร์การค้นหา 'me' in owners

ตัวอย่างคำขอและการตอบกลับที่แสดงอาร์เรย์ของโปรเจ็กต์ Apps Script ที่แสดงผลผ่านการตอบกลับ 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
  }
 ]
}

หากคุณทราบรหัสไฟล์ของโครงการ Apps Script คุณจะดึงข้อมูลได้โดยตรงด้วยการเรียก API ต่อไปนี้

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

ส่งออกโปรเจ็กต์จากไดรฟ์

เมื่อได้ทรัพยากร File กลับคืนจาก API แล้ว พร็อพเพอร์ตี้ exportLinks จะมี URL สำหรับดึงข้อมูลเพื่อรับเนื้อหาของโปรเจ็กต์เป็นข้อมูล JSON นี่คือตัวอย่างของ URL ที่อาจมีลักษณะดังนี้

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

ส่งคำขอไปยัง URL นี้เพื่อดึงเนื้อหาของโปรเจ็กต์ ตรวจสอบว่าคุณใส่ส่วนหัว Authorization ที่มีโทเค็น OAuth Bearer เดียวกัน

ตัวอย่างคำขอและคำตอบมีดังนี้

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

ตัวอย่างข้างต้นมีโค้ดสำหรับเว็บแอปอย่างง่ายจากคู่มือ HTML Service ด้วย โปรดทราบว่าคุณจะได้รับอาร์เรย์ Files กลับมา ซึ่งแต่ละรายการมีพร็อพเพอร์ตี้ 4 รายการดังต่อไปนี้

id ตัวระบุภายในของไฟล์ภายในโปรเจ็กต์ จําเป็นสําหรับอ้างอิงไฟล์นี้ในระหว่างการอัปเดต
name ชื่อของไฟล์ที่ไม่มีนามสกุลตามที่แสดงในโปรแกรมแก้ไขสคริปต์
type ไฟล์สองประเภทคือ Server_js และ html
source ซอร์สโค้ดที่เข้ารหัสซึ่งมีอยู่ในไฟล์

นำเข้าโปรเจ็กต์ไปยังไดรฟ์

หากต้องการอัปเดตโปรเจ็กต์ที่มีอยู่ ให้เรียก HTTP PUT ไปยังไฟล์ update API ที่มี fileId ที่เหมาะสม ตัวอย่างด้านล่างแสดงธุรกรรมตัวอย่างสำหรับส่วนการอัปโหลดสื่อ เมื่อใช้ไลบรารีของไคลเอ็นต์รายการใดรายการหนึ่ง แอปพลิเคชันของคุณจะใส่ข้อมูลเมตาและสื่อในการเรียกการอัปโหลดเดียวกันได้อย่างง่ายดาย โปรดทราบว่าส่วนหัว Content-Type จะระบุประเภทเนื้อหาที่อัปโหลดในกรณีนี้

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

สร้างไฟล์ใหม่ภายในโปรเจ็กต์

หากต้องการสร้างไฟล์ใหม่ภายในโปรเจ็กต์ ให้ส่งคำขอ PUT สำหรับไฟล์ที่ไม่มีพร็อพเพอร์ตี้ id ถ้าคุณใส่ไฟล์ที่มีตัวระบุที่ไม่รู้จัก ระบบจะส่งข้อความแสดงข้อผิดพลาด

ลบไฟล์ภายในโปรเจ็กต์

หากต้องการลบไฟล์ออกจากโปรเจ็กต์ ให้ส่งคำขอ PUT ที่ไม่มีไฟล์นั้น (แต่รวมไฟล์อื่นๆ ทั้งหมดในโปรเจ็กต์) ไฟล์ที่ไม่ได้ส่งกลับมาระหว่างกระบวนการนำเข้าจะถูกลบออกจากเซิร์ฟเวอร์

เปลี่ยนชื่อไฟล์ภายในโปรเจ็กต์

หากต้องการเปลี่ยนชื่อไฟล์ภายในโปรเจ็กต์ ให้ส่งคำขอ PUT ด้วย id ที่มีอยู่แต่ใช้ name ใหม่ โปรดทราบว่าเซิร์ฟเวอร์จะไม่พยายามเปลี่ยนเป็น type

สร้างโปรเจ็กต์ใหม่

หากต้องการสร้างโปรเจ็กต์ใหม่ ให้ส่งคำขอ POST ไปยัง API ของ insert คุณใช้ไลบรารีของไคลเอ็นต์เพื่อใส่ข้อมูลเมตา เช่น ชื่อโปรเจ็กต์และคำอธิบายได้ ซึ่งคล้ายกับการเรียก update

ต่อไปนี้คือตัวอย่างธุรกรรมของการอัปโหลดสื่อ การดำเนินการนี้จะสร้างโปรเจ็กต์ชื่อ "ไม่มีชื่อ" ในไดรฟ์ของคุณ ต้องระบุพารามิเตอร์ convert ใน URL ต้องระบุส่วนหัว Content-Type เช่นเดียวกับการเรียก update

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