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

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

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

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

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

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

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

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

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

הנה דוגמה – דוגמה שאסור לפעול לפיה או להשתמש בה. סקריפט שמשתמש בקוד הבא כדי להגדיר את צבעי הרקע של כל תא בתבנית של גיליון אלקטרוני בגודל 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 דקות.