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

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

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

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

שימוש בשירות Cache

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

  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 דקות.