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

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

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

שימוש בפעולות 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) ללא שרת עם יכולת התאמה רחבה במיוחד. אתם יכולים להשתמש בגיליונות מקושרים כדי לנתח מערכי נתונים גדולים של BigQuery ישירות ב-Sheets, או להשתמש בשירות BigQuery כדי ליצור אינטראקציה עם נתונים מ-Apps Script.

אופטימיזציה של הביצועים של נוסחאות

שימוש רב בנוסחאות מסוימות עלול להאט את הגיליון האלקטרוני:

  • ARRAYFORMULA: פונקציה שימושית, אבל חישובים של ARRAYFORMULA בהיקף גדול עלולים להיות יקרים.
  • VLOOKUP ו-OFFSET: הפונקציות האלה יכולות להיות איטיות במערכי נתונים גדולים. כדאי להשתמש ב-INDEX וב-MATCH או ב-Apps Script כדי לבצע חיפושים בזיכרון בצורה יעילה יותר.
  • IMPORTRANGE: שימוש תכוף בפונקציה IMPORTRANGE בגיליונות רבים עלול להוביל ל'שגיאות פנימיות' אם גיליונות המקור גדולים או נמצאים בעומס כבד. איחוד הנתונים למקור מרכזי יכול לעזור.

טיפול בזמן קצוב לסקריפט

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

  1. שימוש בפעולות אצווה: כמו שצוין בקטע שימוש בפעולות אצווה, מומלץ לצמצם את מספר הקריאות לגיליונות אלקטרוניים ולשירותים אחרים.
  2. פיצול משימות: חלוקת משימות גדולות לחלקים קטנים יותר שאפשר להשלים כל אחד מהם במסגרת מגבלת הזמן.
  3. שימוש בטריגרים להמשכים: מגדירים טריגר ניתן להתקנה שמבוסס על זמן כדי להמשיך תהליך שפועל לאורך זמן. הסקריפט יכול לשמור את המצב הנוכחי שלו (למשל, האינדקס של השורה האחרונה שעובדה) באמצעות שירות המאפיינים ולהמשיך מהנקודה הזו בהרצה הבאה.