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

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

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

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

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

หากต้องการใช้ Google ไดรฟ์ API เพื่อนำเข้าหรือส่งออกโปรเจ็กต์ โปรดทราบข้อมูลต่อไปนี้

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

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

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 ซอร์สโค้ดที่เข้ารหัสซึ่งอยู่ในไฟล์

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

หากต้องการอัปเดตโปรเจ็กต์ที่มีอยู่ ให้เรียกใช้ HTTP PUT ไปยัง API ของไฟล์ update ด้วย 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"
    }
  ]
}