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

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

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

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

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

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

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

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

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

הנה דוגמה — דוגמה שלא כדאי לעקוב אחריה או להשתמש בה. סקריפט משתמשת בקוד הבא כדי להגדיר את צבעי הרקע של כל תא רשת של גיליונות אלקטרוניים בגודל 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).setBackgrounds(colors);

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

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

ספריות הן דרך נוחה לעשות שימוש חוזר בקוד, אבל הן מאריכות מעט את הזמן שנדרש להפעלת הסקריפט. העיכוב הזה לא ניכר בסקריפטים ארוכים יחסית (כמו סקריפט של כלי עזר, לנקות את הקבצים ב-Google Drive), אבל בצד הלקוח ממשקי משתמש של HTML Service שחוזרים על עצמם משך זמן קצר 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 דקות.