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