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

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

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

השימוש בפעולות 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).setBackgroundColors(colors);

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

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

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

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

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