ייבוא וייצוא פרויקטים

מאחר שפרויקטים של Apps Script נמצאים ב-Google Drive, מפתחים יכולים לייבא ולייצא את קוד המקור של Apps Script באמצעות Google Drive API (להבדיל משירות Drive ב-Apps Script).

לדוגמה, מפתחת יכולה לכתוב קוד חדש של Apps Script במחשב המקומי שלה באמצעות עורך הקוד המועדף עליה, ולהשתמש במערכת לניהול גרסאות כמו Git כדי לשתף פעולה עם מפתחים אחרים. אחרי שמסיימים גרסה, היא יכולה להעלות (לייבא) את הקבצים ל-Google Drive באמצעות API ל-REST, ולהשתמש בהם כמו בכל פרויקט אחר ב-Apps Script.

ניתן לבצע שינויים בקוד בגרסאות המקומיות ולסנכרן אותו עם פרויקט Apps Script באמצעות 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 API תיכשל ותופיע שגיאה 5xx. אפשר למנוע זאת על ידי שכפול הקוד לפני הייבוא.
  5. אי אפשר לייבא קבצים ריקים. הקריאה לעדכון Google Drive API תיכשל ותוצג שגיאת 5xx אם תנסו להעלות קובץ ריק.
  6. אפשר לייבא או לייצא רק סקריפטים עצמאיים. לא ניתן לגשת לסקריפטים שמקושרים לקונטיינרים דרך Google Drive API.
  7. ניתן לייבא או לייצא רק קוד מקור. גם משאבים כמו מאפייני פרויקט או יומנים לא נחשפים דרך Google Drive API. לא ניתן לבצע פעולות כמו ניהול גרסאות של סקריפט, פרסום או הפעלה של הסקריפט באמצעות Google Drive API.
  8. אתם לא מוגבלים לקובץ Code.gs של שרת אחד. תוכלו לפזר את קוד השרת על פני מספר קבצים כדי שיהיה קל לפתח אותו. כל קובצי השרת נטענים באותו מרחב שמות גלובלי, לכן כדאי להשתמש במחלקות JavaScript כשרוצים לספק אנקפסולציה בטוחה.

Drive API

ה-API של Google Drive מאפשר למפתחים לגשת לקבצים ב-Google Drive באופן פרוגרמטי. ב-API הזה נעשה שימוש ב-GET כדי להוריד קבצים וב-PUT/POST כדי להעלות קבצים. בדף הסקירה הכללית של Google Drive API תוכלו למצוא תיעוד מפורט ומדריכים למתחילים.

המדריך הזה יתמקד ברישום ובהעברה של קבצים באמצעות המשאב Files באמצעות הקריאות הבאות:

הרשאות

כל הבקשות ל-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 ב-Drive שלכם, אפשר להשתמש במשאב Files כדי לשלוח שאילתות לגבי קבצים עם סוג ה-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

ייצוא פרויקטים מ-Drive

אחרי שמקבלים בחזרה משאב File מה-API, הנכס ב-exportLinks יכיל כתובת URL לאחזור כדי לקבל את תוכן הפרויקט כנתוני JSON. הנה דוגמה לכתובת אתר זו:

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 שני סוגי הקבצים הם server_js ו-html.
source קוד המקור המקודד שנמצא בקובץ.

ייבוא פרויקטים אל Drive

כדי לעדכן פרויקט קיים, צריך לבצע קריאה ל-HTTP PUT של הקובץ 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 ל-API של הקובץ insert. בדומה לקריאה ל-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"
    }
  ]
}