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

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

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

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

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

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

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

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

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

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