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

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

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

คุณทำการเปลี่ยนแปลงโค้ดในเวอร์ชันในเครื่องและซิงค์กับโปรเจ็กต์ Apps Script ได้โดยใช้ Google ไดรฟ์ 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 ไดรฟ์ API ด้วย การดำเนินการต่างๆ เช่น การกำหนดเวอร์ชันสคริปต์ การเผยแพร่ หรือการดำเนินการสคริปต์ จะทำผ่าน Google ไดรฟ์ API ไม่ได้
  8. คุณไม่จำเป็นต้องใช้ไฟล์ Code.gs ของเซิร์ฟเวอร์เพียงไฟล์เดียว คุณสามารถกระจายโค้ดเซิร์ฟเวอร์ไปยังหลายไฟล์เพื่อให้พัฒนาได้ง่าย ระบบจะโหลดไฟล์เซิร์ฟเวอร์ทั้งหมดลงในเนมสเปซส่วนกลางเดียวกัน ดังนั้นให้ใช้คลาส JavaScript เมื่อคุณต้องการจัดแพ็กเกจอย่างปลอดภัย

API ไดรฟ์

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

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

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

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

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

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

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

หากต้องการแสดงรายการโปรเจ็กต์ Apps Script ทั้งหมดในไดรฟ์ ให้ใช้ทรัพยากรไฟล์เพื่อค้นหาไฟล์ที่มีประเภท 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 ไฟล์ 2 ประเภทดังกล่าวคือ server_js และ html
source ซอร์สโค้ดที่เข้ารหัสซึ่งมีอยู่ในไฟล์

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

หากต้องการอัปเดตโปรเจ็กต์ที่มีอยู่ ให้เรียกใช้ PUT HTTP ไปยังไฟล์ 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 ไปยังไฟล์ insert API คุณสามารถใช้ไลบรารีไคลเอ็นต์เพื่อใส่ข้อมูลเมตา เช่น ชื่อและคำอธิบายโปรเจ็กต์ เช่นเดียวกับการเรียกใช้ update

ต่อไปนี้คือตัวอย่างธุรกรรมของการอัปโหลดสื่อ ซึ่งจะสร้างโปรเจ็กต์ชื่อ "ไม่มีชื่อ" ในไดรฟ์ ต้องระบุพารามิเตอร์ convert ใน URL เช่นเดียวกับการเรียก update ต้องมีส่วนหัว 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"
    }
  ]
}