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

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

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

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

כדאי לשקול שיתוף פעולה באמצעות תיקיות אחסון שיתופי

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

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

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

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

הנה דוגמה – דוגמה שאסור לפעול לפיה או להשתמש בה. סקריפט שמשתמש בקוד הבא כדי להגדיר את צבעי הרקע של כל תא בגיליון אלקטרוני של רשת 100 על 100. הנוסחה משתמשת בפונקציה בשם 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 להחזרת נתונים לזיכרון עוזר, כי הוא מאלץ החזרת נתונים לזיכרון באמצעות flush בסוף כל שורה. בגלל שמתבצע שמירת נתונים במטמון, מתבצעות רק 100 קריאות לגיליון האלקטרוני.

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

  // 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).setBackgrounds(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 דקות.