במסמך הזה מפורטות שיטות מומלצות לשיפור הביצועים של סקריפטים.
צמצום השימוש בשירותים אחרים
שימוש בפעולות JavaScript בסקריפט מהיר יותר מאשר קריאה לשירותים אחרים. כל פעולה שמבצעים ב-Google Apps Script עצמו מהירה יותר משליפת נתונים משרתי Google או משרת חיצוני, כמו בקשות ל-Sheets, ל-Docs, ל-Sites, ל-Translate ול-UrlFetch. הסקריפטים יפעלו מהר יותר אם תצמצמו את מספר הקריאות לשירותים.
שיתוף פעולה עם תיקיות אחסון שיתופי
אם אתם עובדים על פרויקט של סקריפט עם מפתחים אחרים, כדאי לשתף את הפרויקט באמצעות כוננים משותפים. הקבצים באחסון השיתופי שייכים לקבוצה ולא למשתמשים ספציפיים, ולכן קל יותר לפתח ולתחזק פרויקטים.
שימוש בפעולות בקבוצות
בדרך כלל, סקריפטים קוראים נתונים מגיליון אלקטרוני, מבצעים חישובים וכותבים את התוצאות בחזרה. ב-Apps Script נעשה שימוש באופטימיזציה מובנית כמו חיפוש מראש וזיכרון מטמון לכתיבה.
כדי למקסם את השימוש במטמון המובנה, צריך לצמצם את פעולות הקריאה והכתיבה. החלפה בין פקודות קריאה וכתיבה איטית. כדי להריץ סקריפט מהר יותר, קוראים את כל הנתונים למערך באמצעות פקודה אחת, מבצעים פעולות על נתוני המערך וכותבים את הנתונים באמצעות פקודה אחת.
מומלץ להימנע מקריאה וכתיבה לסירוגין, כמו בדוגמה הלא יעילה הזו:
// 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();
}
הסקריפט לא יעיל כי הוא מבצע לולאה על 10,000 תאים עם כתיבות רצופות. למרות שמטמון הכתיבה החוזרת עוזר, קיבוץ של קריאות הוא יעיל הרבה יותר:
// 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 שניות, ואילו הקוד היעיל פועל במשך שנייה אחת בלבד.
הימנעות מספריות בסקריפטים עם ממשק משתמש עשיר
ספריות נוחות לשימוש חוזר בקוד, אבל הן מאריכות את זמן ההפעלה של הסקריפט. העיכוב הזה מורגש בממשקי משתמש של HTML Service בצד הלקוח שמבצעים קריאות חוזרות וקצרות ל-google.script.run. כדאי להשתמש בספריות במשורה בתוספים ולהימנע מהן בסקריפטים שמבצעים הרבה קריאות ל-google.script.run.
שימוש בשירות המטמון
אפשר להשתמש בשירות המטמון כדי לשמור במטמון משאבים בין הרצות של סקריפטים. שמירה במטמון מפחיתה את התדירות של שליפת הנתונים. בדוגמה הבאה אפשר לראות איך משתמשים בשירות ה-Cache כדי להאיץ את הגישה לפיד RSS איטי.
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 שניות, אבל גישות חוזרות יהיו מהירות עד שהפריט יפוג.
מערכי נתונים גדולים וחישובים מורכבים
Google Sheets הוא כלי רב עוצמה, אבל ככל שקבוצות הנתונים גדלות והחישובים נעשים מורכבים יותר, יכול להיות שתיתקלו בבעיות בביצועים, כמו השהיה בגיליון האלקטרוני, שגיאות IMPORTRANGE ופסק זמן של סקריפט.
מתי כדאי להשתמש במסד נתונים
אם הגיליון האלקטרוני מתקרב למגבלה של 10 מיליון תאים או אם יש לכם הרבה טפסים מקושרים (למשל, 10 או יותר) ונוסחאות מורכבות שמתייחסות לגיליונות שונים, כדאי להשתמש בפתרון ייעודי של מסד נתונים.
- Google Cloud SQL: שירות מנוהל של מסד נתונים רלציוני ל-MySQL, PostgreSQL ו-SQL Server. משתמשים בשירות JDBC כדי להתחבר ל-Cloud SQL או למסדי נתונים חיצוניים אחרים כמו Oracle או MongoDB (באמצעות גשרים מתאימים).
- BigQuery: מחסן נתונים (data warehouse) בלי שרת (serverless) עם מדרגיות גבוהה במיוחד. אתם יכולים להשתמש בגיליונות מקושרים כדי לנתח מערכי נתונים גדולים של BigQuery ישירות ב-Sheets, או להשתמש בשירות BigQuery כדי ליצור אינטראקציה עם נתונים מ-Apps Script.
אופטימיזציה של הביצועים של נוסחאות
שימוש רב בנוסחאות מסוימות עלול להאט את הגיליון האלקטרוני:
- ARRAYFORMULA: פונקציה שימושית, אבל חישובים של
ARRAYFORMULAבהיקף גדול עלולים להיות יקרים. - VLOOKUP ו-OFFSET: הפונקציות האלה יכולות להיות איטיות במערכי נתונים גדולים. כדאי להשתמש ב-
INDEXוב-MATCHאו ב-Apps Script כדי לבצע חיפושים בזיכרון בצורה יעילה יותר. - IMPORTRANGE: שימוש תכוף בפונקציה
IMPORTRANGEבגיליונות רבים עלול לגרום ל'שגיאות פנימיות' אם גיליונות המקור גדולים או נמצאים בעומס כבד. איחוד הנתונים למקור מרכזי יכול לעזור.
טיפול בזמן קצוב לביצוע סקריפט
ל-Apps Script יש מגבלות על זמן הביצוע (בדרך כלל 6 דקות לכל הרצה, או 30 דקות לחלק מחשבונות Google Workspace). אם הסקריפט קורס לעיתים קרובות כי הוא חורג ממגבלת הביצוע:
- שימוש בפעולות אצווה: כמו שצוין בקטע שימוש בפעולות אצווה, מומלץ לצמצם את מספר הקריאות לגיליונות אלקטרוניים ולשירותים אחרים.
- פיצול משימות: חלוקת משימות גדולות לחלקים קטנים יותר שאפשר להשלים כל אחד מהם במסגרת מגבלת הזמן.
- שימוש בטריגרים להמשכיות: מגדירים טריגר שניתן להתקנה שמבוסס על זמן כדי להפעיל מחדש תהליך שפועל לאורך זמן. הסקריפט יכול לאחסן את המצב הנוכחי שלו (למשל, האינדקס של השורה האחרונה שעובדה) באמצעות שירות המאפיינים ולהמשיך מהנקודה הזו בהרצה הבאה.