استيراد المشروعات وتصديرها

نظرًا لأنّ مشاريع "برمجة التطبيقات" تتوفّر على Google Drive، يمكن للمطوِّرين استيراد رمز مصدر "برمجة تطبيقات Google" وتصديره باستخدام واجهة برمجة تطبيقات Google Drive (يجب عدم الخلط بينه وبين خدمة Drive في لغة "برمجة تطبيقات Google").

على سبيل المثال، يمكن لمطوّر برامج تأليف رمز جديد لبرمجة التطبيقات على جهازه المحلي باستخدام أداة تعديل الرموز المفضلة لديها واستخدام نظام للتحكم في الإصدار مثل Git للتعاون مع مطوّرين آخرين. عند اكتمال إصدار ما، يمكنها تحميل (استيراد) الملفات إلى Google Drive باستخدام واجهة برمجة تطبيقات REST، حيث يمكن استخدامها مثل أي مشروع آخر لبرمجة التطبيقات.

يمكن إجراء تغييرات على الرمز في الإصدارات المحلية ومزامنته مع مشروع "برمجة تطبيقات Google" باستخدام Google Drive API. يمكن تنزيل (تصدير) المشاريع الحالية من Google Drive إلى جهاز محلي.

الميزات والقيود

إذا أردت استخدام Google Drive API لاستيراد المشاريع أو تصديرها، يجب الانتباه إلى ما يلي:

  1. من المتوقّع أن تنتهي ملفات النصوص البرمجية من جهة الخادم بالنطاق ".gs". قد ترغب في التطوير محليًا باستخدام ملفات .js، ولكن تأكد من إعادة التسمية لتضمين امتداد gs. قبل استيرادها إلى Google Drive.
  2. يجب أن تنتهي ملفات النصوص البرمجية من جهة العميل بـ ".html". ويشمل هذا ملفات html .أو js. أو css .من جهة العميل. ومرة أخرى، يمكنك التطوير محليًا باستخدام إضافات أخرى، ولكن من المهم الحصول على الإضافة .html قبل الاستيراد إلى Google Drive.
  3. عند استيراد ملفات المشاريع إلى Google Drive، سيتم استبدال جميع البيانات الحالية في هذه الملفات. لا يمكنك إلحاق نص جزئي أو إدراجه، إذ يجب تحديث الملف بأكمله.
  4. يجب أن تحتوي ملفات النصوص البرمجية من جهة الخادم على رمز JavaScript صالح. إذا كانت هناك أخطاء في ملفات .js للخادم، فسيفشل طلب تحديث واجهة برمجة تطبيقات Google Drive مع ظهور خطأ 5xx. ويمكنك منع ذلك عن طريق تصحيح التعليمات البرمجية قبل الاستيراد.
  5. لا يمكن استيراد الملفات الفارغة. سيفشل طلب تحديث واجهة برمجة تطبيقات Google Drive مع ظهور خطأ 5xx إذا حاولت تحميل ملف فارغ.
  6. يمكن استيراد أو تصدير النصوص البرمجية المستقلة فقط. لا يمكن الوصول إلى النصوص البرمجية المرتبطة بالحاوية من خلال Google Drive API.
  7. يمكن استيراد رمز المصدر أو تصديره فقط. لا يتم أيضًا عرض الموارد مثل خصائص المشروع أو السجلات عبر Google Drive API. لا يمكن تنفيذ إجراءات مثل تحديد نُسخ النص البرمجي أو نشره أو تنفيذه عبر Google Drive API.
  8. لست مقيدًا بملف Code.gs لخادم واحد. ويمكنك نشر رمز الخادم عبر ملفات متعددة لتسهيل عملية التطوير. يتم تحميل كل ملفات الخادم في مساحة الاسم العامة نفسها، لذلك يمكنك استخدام فئات JavaScript عندما تريد توفير تغليف آمن.

Drive API

تسمح Google Drive API للمطوّرين بالوصول إلى الملفات في Google Drive آليًا. تستخدم واجهة برمجة التطبيقات هذه GET لتنزيل الملفات وPUT/POST لتحميل الملفات. يُرجى الرجوع إلى صفحة نظرة عامة على Google Drive API للحصول على المستندات التفصيلية والتشغيل السريع.

سيركز هذا الدليل على إدراج الملفات ونقلها باستخدام مورد الملفات باستخدام عمليات الاستدعاء التالية:

التفويض

يجب أن يصادق مستخدم تمت مصادقته على جميع الطلبات إلى Google Drive API من خلال بروتوكول OAuth 2.0. للتعرُّف على المزيد من التفاصيل، يُرجى الرجوع إلى مستندات تفويض Google Drive API.

بالإضافة إلى النطاقات الأخرى التي قد يحتاجها التطبيق (مثل https://www.googleapis.com/auth/drive)، على جميع التطبيقات التي تحاول استيراد مشاريع برمجة Google Apps أو تصديرها طلب النطاق الخاص:

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

سرد المشاريع الحالية

لإدراج جميع مشاريع "برمجة تطبيقات Google" في Drive، يمكنك استخدام مورد الملفات للبحث عن الملفات التي تتضمن نوع MIME وهو application/vnd.google-apps.script. لفلترة الردّ لتضمين الملفات التي تملكها فقط، عليك تضمين معلَمة البحث '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

تصدير المشاريع من Drive

بعد استرداد مورد File من واجهة برمجة التطبيقات، ستحتوي السمة 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. تجدر الإشارة إلى الحصول على مصفوفة من Files، يتضمّن كل منها السمات الأربع التالية:

id معرّف داخلي لملف ضمن مشروع، مطلوب للإشارة إلى هذا الملف أثناء التعديلات.
name اسم الملف بدون امتدادات، كما يظهر في "مُحرِّر النصوص البرمجية".
type نوعا الملفات هما server_js وhtml.
source رمز المصدر المشفّر المتضمّن في الملف

استيراد المشاريع إلى Drive

لتعديل مشروع حالي، يمكنك إجراء استدعاء HTTP PUT لواجهة برمجة تطبيقات الملف 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 إلى file insert API. يمكنك استخدام مكتبة العميل لتضمين بيانات وصفية مثل اسم المشروع ووصفه، تمامًا مثل طلب update.

إليك نموذج عن عملية تحميل الوسائط. سيؤدي ذلك إلى إنشاء مشروع يسمى "بلا عنوان" في Drive. يجب إدخال المَعلمة 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"
    }
  ]
}