যেহেতু গুগল অ্যাপস স্ক্রিপ্ট প্রোজেক্টগুলো গুগল ড্রাইভে থাকে, তাই ডেভেলপাররা গুগল ড্রাইভ এপিআই (API) ব্যবহার করে অ্যাপস স্ক্রিপ্ট সোর্স কোড ইম্পোর্ট ও এক্সপোর্ট করতে পারেন (অ্যাপস স্ক্রিপ্টের ড্রাইভ সার্ভিসের সাথে এটিকে গুলিয়ে ফেলবেন না)।
উদাহরণস্বরূপ, একজন ডেভেলপার তার পছন্দের কোড এডিটর ব্যবহার করে নিজের লোকাল মেশিনে নতুন অ্যাপস স্ক্রিপ্ট কোড লিখতে পারেন এবং অন্যান্য ডেভেলপারদের সাথে কাজ করার জন্য গিট (Git)-এর মতো একটি ভার্সন কন্ট্রোল সিস্টেম ব্যবহার করতে পারেন। যখন কোনো ভার্সন চূড়ান্ত হয়ে যায়, তখন তিনি REST API ব্যবহার করে ফাইলগুলো গুগল ড্রাইভে আপলোড (ইম্পোর্ট) করতে পারেন, যেখানে সেগুলো অন্য যেকোনো অ্যাপস স্ক্রিপ্ট প্রজেক্টের মতোই ব্যবহার করা যায়।
গুগল ড্রাইভ এপিআই ব্যবহার করে স্থানীয় সংস্করণগুলিতে কোড পরিবর্তন করা যায় এবং অ্যাপস স্ক্রিপ্ট প্রকল্পে সিঙ্ক করা যায়। বিদ্যমান প্রকল্পগুলি গুগল ড্রাইভ থেকে স্থানীয় মেশিনে ডাউনলোড (এক্সপোর্ট) করা যেতে পারে।
বৈশিষ্ট্য এবং সীমাবদ্ধতা
আপনি যদি গুগল ড্রাইভ এপিআই ব্যবহার করে প্রজেক্ট ইম্পোর্ট বা এক্সপোর্ট করতে চান, তাহলে নিম্নলিখিত বিষয়গুলো সম্পর্কে সচেতন থাকুন:
- সার্ভার-সাইড স্ক্রিপ্ট ফাইলগুলোর শেষে ".gs" থাকা আবশ্যক। আপনি চাইলে স্থানীয়ভাবে .js ফাইল ব্যবহার করে ডেভেলপ করতে পারেন, কিন্তু গুগল ড্রাইভে ইম্পোর্ট করার আগে ফাইলের নাম পরিবর্তন করে তাতে .gs এক্সটেনশন যুক্ত করে নিতে ভুলবেন না।
- ক্লায়েন্ট-সাইড স্ক্রিপ্ট ফাইলগুলোর শেষে অবশ্যই ".html" থাকতে হবে। এর মধ্যে ক্লায়েন্ট-সাইডের .html, .js বা .css ফাইল অন্তর্ভুক্ত। আপনি চাইলে স্থানীয়ভাবে অন্যান্য এক্সটেনশন ব্যবহার করেও ফাইল তৈরি করতে পারেন, কিন্তু গুগল ড্রাইভে ইম্পোর্ট করার আগে .html এক্সটেনশনটি থাকা আবশ্যক।
- আপনি যখন গুগল ড্রাইভে প্রজেক্ট ফাইল ইম্পোর্ট করবেন, তখন সেই ফাইলগুলোতে থাকা সমস্ত ডেটা মুছে যাবে। আপনি আংশিক টেক্সট যোগ বা সন্নিবেশ করতে পারবেন না; পুরো ফাইলটিই আপডেট করতে হবে।
- সার্ভার-সাইড স্ক্রিপ্ট ফাইলগুলিতে অবশ্যই বৈধ জাভাস্ক্রিপ্ট থাকতে হবে। আপনার সার্ভারের .js ফাইলগুলিতে কোনো ত্রুটি থাকলে, Google Drive API আপডেট কলটি 5xx ত্রুটির কারণে ব্যর্থ হবে। ইম্পোর্ট করার আগে আপনার কোড লিন্টিং করার মাধ্যমে আপনি এটি প্রতিরোধ করতে পারেন।
- খালি ফাইল ইম্পোর্ট করা যাবে না। আপনি যদি একটি খালি ফাইল আপলোড করার চেষ্টা করেন, তাহলে Google Drive API আপডেট কলটি 5xx এরর সহ ব্যর্থ হবে।
- শুধুমাত্র স্বতন্ত্র স্ক্রিপ্টই ইম্পোর্ট বা এক্সপোর্ট করা যায়। কন্টেইনার-সংযুক্ত স্ক্রিপ্টগুলো গুগল ড্রাইভ এপিআই-এর মাধ্যমে অ্যাক্সেস করা যায় না।
- শুধুমাত্র সোর্স কোড ইম্পোর্ট বা এক্সপোর্ট করা যায়। প্রজেক্ট প্রোপার্টি বা লগের মতো রিসোর্সগুলোও গুগল ড্রাইভ এপিআই দ্বারা উন্মুক্ত করা হয় না। গুগল ড্রাইভ এপিআই ব্যবহার করে স্ক্রিপ্ট ভার্সনিং, পাবলিশিং বা স্ক্রিপ্ট এক্সিকিউট করার মতো কাজগুলো করা সম্ভব নয়।
- আপনি একটিমাত্র সার্ভার
Code.gsফাইলে সীমাবদ্ধ নন। উন্নয়নের সুবিধার জন্য আপনি সার্ভার কোড একাধিক ফাইলে ছড়িয়ে দিতে পারেন। সমস্ত সার্ভার ফাইল একই গ্লোবাল নেমস্পেসে লোড করা হয়, তাই নিরাপদ এনক্যাপসুলেশন নিশ্চিত করতে জাভাস্ক্রিপ্ট ক্লাস ব্যবহার করুন।
ড্রাইভ এপিআই
গুগল ড্রাইভ এপিআই ডেভেলপারদের প্রোগ্রাম্যাটিকভাবে গুগল ড্রাইভের ফাইল অ্যাক্সেস করার সুযোগ দেয়। এই এপিআই ফাইল ডাউনলোড করার জন্য GET এবং ফাইল আপলোড করার জন্য PUT/POST ব্যবহার করে। বিস্তারিত ডকুমেন্টেশন এবং কুইকস্টার্টের জন্য গুগল ড্রাইভ এপিআই ওভারভিউ পেজটি দেখুন।
এই নির্দেশিকাটি Files রিসোর্স ব্যবহার করে নিম্নলিখিত কলগুলির মাধ্যমে ফাইল তালিকাভুক্ত করা এবং সরানোর উপর আলোকপাত করে:
অনুমোদন
Google Drive API-তে করা সমস্ত অনুরোধ অবশ্যই একজন প্রমাণীকৃত ব্যবহারকারী দ্বারা OAuth 2.0 প্রোটোকলের মাধ্যমে অনুমোদিত হতে হবে। আরও বিস্তারিত তথ্যের জন্য, Google Drive API অনুমোদন সংক্রান্ত ডকুমেন্টেশন দেখুন।
একটি অ্যাপ্লিকেশনের প্রয়োজনীয় অন্যান্য স্কোপ (যেমন https://www.googleapis.com/auth/drive ) ছাড়াও, যে সকল অ্যাপ্লিকেশন গুগল অ্যাপস স্ক্রিপ্ট প্রজেক্ট ইম্পোর্ট বা এক্সপোর্ট করার চেষ্টা করবে, তাদের অবশ্যই এই বিশেষ স্কোপটির জন্য অনুরোধ করতে হবে:
https://www.googleapis.com/auth/drive.scripts
নিম্নলিখিত নমুনা অনুরোধগুলি পরীক্ষা করতে, OAuth 2.0 প্লেগ্রাউন্ড থেকে প্রাপ্ত একটি OAuth 2.0 বেয়ারার টোকেন ব্যবহার করুন।
বিদ্যমান প্রকল্পগুলির তালিকা করুন
আপনার ড্রাইভে থাকা সমস্ত অ্যাপস স্ক্রিপ্ট প্রোজেক্টের তালিকা পেতে, `files` রিসোর্স ব্যবহার করে application/vnd.google-apps.script MIME টাইপের ফাইলগুলির জন্য কোয়েরি করুন। ফলাফল থেকে শুধুমাত্র আপনার নিজের ফাইলগুলি ফিল্টার করে অন্তর্ভুক্ত করতে, 'me' in owners যোগ করুন।
এখানে একটি নমুনা অনুরোধ এবং প্রতিক্রিয়া দেখানো হয়েছে, যা একটি 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 } ] }
যদি আপনার কোনো অ্যাপস স্ক্রিপ্ট প্রজেক্টের ফাইল আইডি জানা থাকে, তাহলে আপনি নিম্নলিখিত এপিআই কলটির মাধ্যমে সরাসরি সেটি সংগ্রহ করতে পারেন:
GET https://www.googleapis.com/drive/v2/files/1234567890abcefghijklmnopqrstuvwxyz
Authorization: Bearer ya29.fakebearerstring
একটি প্রজেক্টের ফাইল আইডি এবং প্রজেক্ট কী এক জিনিস নয়। ফাইল আইডি হলো প্রজেক্টের URL-এ থাকা আলফানিউমেরিক স্ট্রিংটি।
ড্রাইভ থেকে প্রকল্প রপ্তানি করুন
এপিআই থেকে একটি File রিসোর্স ফেরত পাওয়ার পর, ` exportLinks প্রপার্টিতে একটি ইউআরএল থাকবে, যা ব্যবহার করে প্রজেক্টের বিষয়বস্তু JSON ডেটা হিসেবে পাওয়া যাবে। এই ইউআরএলটি দেখতে কেমন হতে পারে তার একটি নমুনা নিচে দেওয়া হলো:
https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json
প্রজেক্টটির বিষয়বস্তু পেতে এই URL-এ একটি অনুরোধ পাঠান। নিশ্চিত করুন যে আপনি একই OAuth Bearer টোকেন সহ একটি Authorization হেডার অন্তর্ভুক্ত করেছেন।
এখানে একটি নমুনা অনুরোধ এবং তার প্রতিক্রিয়া দেওয়া হলো:
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" } ] }
পূর্ববর্তী উদাহরণটিতে এইচটিএমএল সার্ভিস গাইড থেকে নেওয়া একটি ওয়েব অ্যাপের কোড রয়েছে। আপনি Files নামের একটি অ্যারে ফেরত পাবেন, যার প্রতিটিতে নিম্নলিখিত ৪টি প্রোপার্টি রয়েছে:
id | প্রকল্পের অন্তর্গত কোনো ফাইলের অভ্যন্তরীণ শনাক্তকারী, যা আপডেট করার সময় ফাইলটিকে উল্লেখ করার জন্য প্রয়োজন হয়। |
name | স্ক্রিপ্ট এডিটরে প্রদর্শিত, এক্সটেনশন ছাড়া ফাইলটির নাম। |
type | দুই ধরনের ফাইল হলো server_js এবং html। |
source | ফাইলটিতে এনকোড করা সোর্স কোড রয়েছে। |
ড্রাইভে প্রকল্প আমদানি করুন
একটি বিদ্যমান প্রজেক্ট আপডেট করতে, উপযুক্ত fileId সহ ফাইল update API-তে একটি HTTP PUT কল করুন। নিম্নলিখিত উদাহরণটি মিডিয়া-আপলোড অংশের জন্য একটি নমুনা ট্রানজ্যাকশন দেখায়। ক্লায়েন্ট লাইব্রেরিগুলোর মধ্যে একটি ব্যবহার করে, আপনার অ্যাপ্লিকেশন সহজেই একই আপলোড কলে মেটাডেটা এবং মিডিয়া অন্তর্ভুক্ত করতে পারে। এক্ষেত্রে 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" } ] }
একটি প্রোজেক্টের মধ্যে নতুন ফাইল তৈরি করুন
প্রজেক্টের মধ্যে একটি নতুন ফাইল তৈরি করতে, id প্রপার্টি ছাড়া একটি PUT রিকোয়েস্ট পাঠান। যদি আপনি একটি অজানা আইডেন্টিফায়ারসহ ফাইল অন্তর্ভুক্ত করেন, তাহলে সিস্টেম একটি এরর মেসেজ দেখাবে।
একটি প্রোজেক্টের মধ্যে থাকা ফাইলগুলো মুছে ফেলুন
প্রজেক্ট থেকে কোনো ফাইল ডিলিট করতে, এমন একটি PUT রিকোয়েস্ট পাঠান যাতে ওই ফাইলটি অন্তর্ভুক্ত থাকবে না (কিন্তু প্রজেক্টের অন্য সব ফাইল অন্তর্ভুক্ত থাকবে)। ইম্পোর্ট প্রক্রিয়ার সময় যে ফাইলগুলো ফেরত পাঠানো হবে না, সেগুলো সার্ভার থেকে ডিলিট হয়ে যাবে।
একটি প্রোজেক্টের মধ্যে ফাইলগুলির নাম পরিবর্তন করুন
প্রজেক্টের মধ্যে কোনো ফাইলের নাম পরিবর্তন করতে, বিদ্যমান id কিন্তু একটি নতুন name দিয়ে একটি PUT রিকোয়েস্ট পাঠান। সার্ভার type পরিবর্তনের যেকোনো প্রচেষ্টা উপেক্ষা করে।
নতুন প্রকল্প তৈরি করুন
একটি নতুন প্রজেক্ট তৈরি করতে, ফাইল insert এপিআই-তে একটি POST রিকোয়েস্ট পাঠান। update কলের মতোই, আপনি প্রজেক্টের নাম এবং বিবরণের মতো মেটাডেটা অন্তর্ভুক্ত করার জন্য একটি ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে পারেন।
এখানে মিডিয়া আপলোডের একটি নমুনা লেনদেন দেওয়া হলো। এটি আপনার ড্রাইভে 'Untitled' নামে একটি প্রজেক্ট তৈরি করবে। URL-এ convert প্যারামিটারটি আবশ্যক। 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" } ] }