שיטות מומלצות

במסמך הזה מפורטות שיטות מומלצות שיעזרו לכם לשפר את הביצועים של הסקריפטים.

מזעור הקריאות לשירותים אחרים

השימוש בפעולות JavaScript בסקריפט מהיר בהרבה מקריאה לשירותים אחרים. כל מה שאפשר לבצע ב-Google Apps Script בעצמו יהיה מהיר בהרבה מקריאות לצורך אחזור נתונים מהשרתים של Google או משרת חיצוני, כמו בקשות ל-Sheets, ל-Docs, ל-Google Sites, ל-Translate, ל-UrlFetch וכו'. אם הסקריפטים שלכם יפעלו מהר יותר, תוכלו למזער את הקריאות שהם מבצעים לשירותים האלה.

מומלץ לשתף פעולה עם תיקיות אחסון שיתופי

אם אתם עובדים על פרויקט סקריפט עם מפתחים אחרים, תוכלו לשתף פעולה בפרויקטים של Apps Script באמצעות תיקיות אחסון שיתופי. קבצים באחסון שיתופי שייכים לקבוצה ולא לאנשים פרטיים. כך קל יותר לפתח ולתחזוקה של הפרויקט.

שימוש בפעולות אצווה

בדרך כלל סקריפטים צריכים לקרוא את הנתונים בגיליון אלקטרוני, לבצע חישובים ולכתוב את התוצאות בגיליון אלקטרוני. ב-Google Apps לסקריפט יש כבר אופטימיזציה מובנית, כמו שימוש בשמירה במטמון במבט אחד כדי לאחזר את מה שסקריפט צפוי לקבל, וכתיבת שמירה במטמון כדי לשמור את מה שצפוי להיות מוגדר.

אפשר לכתוב סקריפטים כדי לנצל את מלוא היתרונות של השמירה המובנית במטמון, על ידי צמצום מספר פעולות הקריאה והכתיבה. החלפת פקודות קריאה וכתיבה איטית. כדי להאיץ סקריפט, כדאי לקרוא את כל הנתונים במערך באמצעות פקודה אחת, לבצע פעולות כלשהן על הנתונים במערך ולכתוב את הנתונים באמצעות פקודה אחת.

הנה דוגמה שאין להשתמש בה או לעקוב אחריו. בסקריפט נעשה שימוש בקוד הבא כדי להגדיר את צבעי הרקע של כל תא ברשת גיליונות אלקטרוניים בגודל 100x100. היא משתמשת כפונקציה בשם getColorFromCoordinates() (לא מוצגת כאן) כדי לקבוע באיזה צבע להשתמש בכל תא:

  // DO NOT USE THIS CODE. It is an example of SLOW, INEFFICIENT code.
  // FOR DEMONSTRATION ONLY
  var cell = sheet.getRange('a1');
  for (var y = 0; y < 100; y++) {
    xcoord = xmin;
    for (var x = 0; x < 100; x++) {
      var c = getColorFromCoordinates(xcoord, ycoord);
      cell.offset(y, x).setBackgroundColor(c);
      xcoord += xincrement;
    }
    ycoord -= yincrement;
    SpreadsheetApp.flush();
  }

הסקריפט לא יעיל: הוא עובר בלולאה דרך 100 שורות ו-100 עמודות, וכותב ברצף 10,000 תאים. מטמון הכתיבה החוזרת של הסקריפט של Google Apps Script עוזר, כי הוא מאלצת מחיקה באמצעות פונקציית רצף נתונים בסוף כל שורה. בגלל השמירה במטמון, בגיליון האלקטרוני בוצעו רק 100 קריאות.

אבל אפשר לייעל את הקוד על ידי קיבוץ הקריאות. הנה תיאור של שכתוב שבו טווח התאים מוקרא למערך שנקרא צבעים, פעולת הקצאת הצבעים מתבצעת על הנתונים במערך והערכים במערך נכתבים בגיליון האלקטרוני:

  // OKAY TO USE THIS EXAMPLE or code based on it.
  var cell = sheet.getRange('a1');
  var colors = new Array(100);
  for (var y = 0; y < 100; y++) {
    xcoord = xmin;
    colors[y] = new Array(100);
    for (var x = 0; x < 100; x++) {
      colors[y][x] = getColorFromCoordinates(xcoord, ycoord);
      xcoord += xincrement;
    }
    ycoord -= yincrement;
  }
  sheet.getRange(1, 1, 100, 100).setBackgroundColors(colors);

הרצת הקוד הלא יעיל נמשכת כ-70 שניות. הקוד היעיל פועל בשנייה אחת בלבד!

הימנעות משימוש בספריות בסקריפטים עמוסים בממשק המשתמש

ספריות הן דרך נוחה לשימוש חוזר בקוד, אבל הן מאריכות קצת את הזמן שלוקח להפעיל את הסקריפט. העיכוב הזה לא משמעותי בסקריפטים ארוכים יחסית (כמו סקריפט של כלי עזר לניקוי הקבצים ב-Google Drive), אבל בממשקי משתמש של שירות HTML בצד הלקוח שמבצעים קריאות google.script.run חוזרות וקצרות, העיכוב ישפיע על כל קריאה. לכן כדאי לצמצם את השימוש בספריות בתוספים, ולכן כדאי להימנע משימוש בספריות כאלה בסקריפטים שאינם תוספים, שמבצעים הרבה קריאות של google.script.run.

שימוש בשירות 'מטמון'

אפשר להשתמש בשירות המטמון כדי לשמור משאבים בין הפעלות של סקריפטים. שמירת נתונים במטמון מאפשרת לצמצם את מספר הפעמים או את התדירות שבהן צריך לאחזר את הנתונים. חשבו על תרחיש שבו יש לכם פיד RSS בכתובת example.com שהאחזור שלו נמשך 20 שניות, וברצונכם לזרז את הגישה לבקשה הממוצעת. הדוגמה הבאה ממחישה איך להשתמש בשירות המטמון כדי להאיץ את הגישה לנתונים האלה.

  function getRssFeed() {
    var cache = CacheService.getScriptCache();
    var cached = cache.get("rss-feed-contents");
    if (cached != null) {
      return cached;
    }
    // This fetch takes 20 seconds:
    var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml");
    var contents = result.getContentText();
    cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
    return contents;
  }

אם הפריט לא שמור במטמון בכל זאת, צריך להמתין 20 שניות, אבל הגישות הבאות שלו יהיו מהירות מאוד עד שהפריט יוסר מהמטמון תוך 25 דקות.