גם מפתחים מנוסים ביותר כמעט אף פעם לא כותבים קוד בצורה נכונה בניסיון הראשון, ולכן פתרון בעיות הוא חלק חשוב בתהליך הפיתוח. בקטע הזה נסביר על כמה טכניקות שיעזרו לכם למצוא שגיאות בסקריפטים, להבין אותן ולנפות באגים.
הודעות שגיאה
כשסקריפט נתקל בשגיאה, מוצגת הודעת שגיאה. ההודעה מלווה במספר שורה שמשמש לפתרון בעיות. יש שני סוגים בסיסיים של שגיאות שמוצגות בדרך הזו: שגיאות תחביר ושגיאות זמן ריצה.
שגיאות תחביר
שגיאות תחביר נגרמות כתוצאה מכתיבת קוד שלא תואם לדקדוק של JavaScript, והשגיאות מזוהות ברגע שמנסים לשמור את הסקריפט. לדוגמה, קטע הקוד הבא מכיל שגיאת תחביר:
function emailDataRow(rowNumber) {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var rowData = data[rowNumber-1].join(" ";
MailApp.sendEmail('john@example.com',
'Data in row ' + rowNumber,
rowData);
}
בעיית התחביר כאן היא היעדר התו )
בסוף השורה הרביעית. כשמנסים לשמור את הסקריפט מופיעה השגיאה הבאה:
חסרה הסוגריים ) אחרי רשימת הארגומנטים. (שורה 4)
בדרך כלל קל לפתור בעיות מהסוג הזה, כי הן מתגלות מיד והסיבות להן בדרך כלל פשוטות. אי אפשר לשמור קובץ שמכיל שגיאות תחביר, כלומר רק קוד תקין נשמר בפרויקט.
שגיאות זמן ריצה
השגיאות האלה נגרמות כתוצאה משימוש לא נכון בפונקציה או במחלקה, ואפשר לזהות אותן רק אחרי שהסקריפט מורץ. לדוגמה, הקוד הבא גורם לשגיאת זמן ריצה:
function emailDataRow(rowNumber) {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var rowData = data[rowNumber-1].join(" ");
MailApp.sendEmail('john',
'Data in row ' + rowNumber,
rowData);
}
הקוד בפורמט הנכון, אבל אנחנו מעבירים את הערך john לכתובת האימייל כשמבצעים קריאה ל-MailApp.sendEmail
. מכיוון שזו לא כתובת אימייל תקינה, השגיאה הבאה מופיעה כשמריצים את הסקריפט:
כתובת אימייל לא תקינה: john (שורה 5)
מה שמקשה על פתרון הבעיות האלה הוא שבדרך כלל הנתונים שמועברים לפונקציה לא נכתבים בקוד, אלא נמשכים מגיליון אלקטרוני, מטופס או ממקור נתונים חיצוני אחר. הטכניקות לניפוי באגים שמתוארות בהמשך יכולות לעזור לכם לזהות את הסיבה לשגיאות האלה.
שגיאות נפוצות
ריכזנו כאן רשימה של שגיאות נפוצות והסיבות להן.
השירות הופעל יותר מדי פעמים: <שם הפעולה>
השגיאה הזו מציינת שחרגתם מהמכסה היומית לפעולה מסוימת. לדוגמה, השגיאה הזו עשויה להופיע אם שולחים יותר מדי אימיילים ביום אחד. המכסות מוגדרות ברמות שונות עבור חשבונות פרטיים, חשבונות דומיין וחשבונות פרימיום, והן עשויות להשתנות בכל שלב ללא הודעה מוקדמת מ-Google. בתיעוד המכסות של Apps Script אפשר לראות את מגבלות המכסות לפעולות שונות.
השרת לא זמין או אירעה שגיאת שרת. צריך לנסות שוב
יש כמה סיבות אפשריות לשגיאות האלה:
- שרת או מערכת של Google לא זמינים באופן זמני. מחכים כמה רגעים ומנסים להריץ את הסקריפט שוב.
- יש שגיאה בסקריפט שאין לה הודעת שגיאה תואמת. נסו לנפות באגים בסקריפט ולבדוק אם אתם יכולים לבודד את הבעיה.
- יש באג ב-Google Apps Script שגורם לשגיאה הזו. הוראות לחיפוש דוחות על באגים ולשליחת דוחות כאלה מופיעות במאמר בנושא באגים. לפני ששולחים דוח על באג חדש, כדאי לחפש כדי לראות אם משתמשים אחרים כבר דיווחו עליו.
נדרשת הרשאה כדי לבצע את הפעולה הזו.
השגיאה הזו מציינת שלסקריפט חסרה ההרשאה הדרושה להפעלה. כשמריצים סקריפט בכלי לעריכת סקריפטים או מפריט בתפריט מותאם אישית, מוצגת למשתמש תיבת דו-שיח של הרשאה. עם זאת, כשמריצים סקריפט מטריגר, מוטמע בדף Google Sites או מורץ כשירות, אי אפשר להציג את תיבת הדו-שיח הזו ומוצגת השגיאה הזו.
כדי לאשר את הסקריפט, פותחים את עורך הסקריפטים ומריצים פונקציה כלשהי. מופיעה בקשה לאישור, כדי שתוכלו לאשר את פרויקט הסקריפט. אם הסקריפט מכיל שירותים חדשים לא מורשים, צריך לתת לו הרשאה מחדש.
השגיאה הזו נגרמת בדרך כלל בגלל טריגרים שמופעלים לפני שהמשתמש אישר אותם או שהאישור שלהם פג. אם אין לכם גישה לפרויקט הסקריפט (לדוגמה, אם השגיאה מתרחשת בתוסף שבו אתם משתמשים), בדרך כלל תוכלו להעניק הרשאה לסקריפט באמצעות שימוש חוזר בתוסף. אם טריגר ממשיך לפעול וגורם לשגיאה הזו, אפשר להסיר את הטריגרים באופן הבא:
- בצד ימין של פרויקט Apps Script, לוחצים על מפעילים .
- משמאל לטריגר שרוצים להסיר, לוחצים על סמל האפשרויות הנוספות > מחיקת הטריגר.
אפשר גם להסיר טריגרים בעייתיים של תוספים על ידי הסרת התוסף.
גם הרשאות גרנולריות יכולות לגרום לשגיאות האלה. Apps Script יבקש באופן אוטומטי מהמשתמש את ההרשאות החסרות, אלא אם ההפעלה מתבצעת על ידי טריגר. כדי להגן על הפעלות של טריגרים מפני השגיאה הזו, אפשר לעיין בדף היקפי ההרשאות.
הגישה נדחתה: DriveApp או מדיניות הדומיין השביתה אפליקציות Drive של צד שלישי
אדמינים בדומיינים של Google Workspace יכולים להשבית את Drive API בדומיין שלהם, וכך למנוע מהמשתמשים להתקין אפליקציות של Google Drive ולהשתמש בהן. ההגדרה הזו גם מונעת מהמשתמשים להשתמש בתוספים של Apps Script שמשתמשים בשירות Drive או בשירות Drive מתקדם (גם אם הסקריפט קיבל הרשאה לפני שהאדמין השבית את Drive API).
עם זאת, אם תוסף או אפליקציית אינטרנט שמשתמשים בשירות Drive מתפרסמים לצורך התקנה בכל הדומיין והאדמין מתקין אותם עבור חלק מהמשתמשים בדומיין או עבור כולם, פונקציות הסקריפט יפעלו עבור המשתמשים האלה גם אם Drive API מושבת בדומיין.
לסקריפט אין הרשאה לקבל את הזהות של המשתמש הפעיל.
מציין שהזהות והאימייל של המשתמש הפעיל לא זמינים לסקריפט. האזהרה הזו נובעת מקריאה אל
Session.getActiveUser()
.
השגיאה יכולה להופיע גם כתוצאה מקריאה ל-Session.getEffectiveUser()
אם הסקריפט פועל במצב הרשאה שאינו AuthMode.FULL
.
אם האזהרה הזו מופיעה, קריאות עוקבות אל User.getEmail()
מחזירות רק "".
יש כמה דרכים לפתור את הבעיה שמוצגת באזהרה הזו, בהתאם למצב ההרשאה שבו הסקריפט פועל. מצב ההרשאה מוצג בפונקציות מופעלות כמאפיין authMode
של e
פרמטר האירוע.
- ב-
AuthMode.FULL
, כדאי להשתמש במקום זאת ב-Session.getEffectiveUser()
. - ב-
AuthMode.LIMITED
, מוודאים שהבעלים אישר את הסקריפט. - במצבי הרשאה אחרים, מומלץ להימנע מהפעלת אחת מהשיטות.
- אם אתם לקוחות Google Workspace שנתקלים באזהרה הזו מטריגר שאפשר להתקין, וזו הפעם הראשונה שזה קורה לכם, אתם צריכים לוודא שהטריגר פועל כמשתמש בארגון שלכם.
הספרייה חסרה
אם מוסיפים ספרייה פופולרית לסקריפט, יכול להיות שתופיע הודעת שגיאה שמציינת שהספרייה חסרה, גם אם היא מופיעה כהסתמכות של הסקריפט. יכול להיות שהסיבה לכך היא שיותר מדי אנשים ניגשים לספרייה בו-זמנית. כדי להימנע מהשגיאה הזו, נסו אחד מהפתרונות הבאים:
- מעתיקים את הקוד של הספרייה לסקריפט ומסירים את התלות בספרייה.
- מעתיקים את סקריפט הספרייה ומפרסים אותו כספרייה מהחשבון. חשוב לעדכן את התלות בסקריפט המקורי בספרייה החדשה במקום בספרייה הציבורית.
אירעה שגיאה כי גרסת הספרייה או גרסת הפריסה חסרות. קוד השגיאה Not_Found
הודעת השגיאה הזו מציינת אחד מהמקרים הבאים:
- הגרסה של הסקריפט שהופעלה נמחקה. במאמר בנושא עריכת פריסה עם גרסאות מוסבר איך לעדכן את הגרסה של התסריט שנפרסה.
- הגרסה של הספרייה שבה הסקריפט משתמש נמחקה. כדי לבדוק איזו ספרייה חסרה, לצד שם הספרייה, לוחצים על > פתיחה בכרטיסייה חדשה. הספרייה החסרה
גורמת להודעת שגיאה. אחרי שמאתרים את הספרייה שרוצים לעדכן, מבצעים אחת מהפעולות הבאות:
- מעדכנים את הספרייה כדי להשתמש בגרסה אחרת. איך מעדכנים ספרייה
- מסירים את הספרייה שנמחקה מפרויקט הסקריפט ומהקוד. כך מסירים ספרייה
אפשרויות נוספות
- הסקריפט של ספרייה שהסקריפט שלכם משתמש בה כולל ספרייה אחרת שמשתמשת בגרסה שנמחקה. מבצעים אחת מהפעולות הבאות:
- אם יש לכם גישת עריכה לספרייה שבה התסריט משתמש, אתם יכולים לעדכן את הספרייה המשנית בתסריט לגרסה קיימת.
- מעדכנים את הספרייה כדי להשתמש בגרסה אחרת. איך מעדכנים ספרייה
- מסירים את הספרייה מפרויקט הסקריפט ומהקוד. כך מסירים ספרייה
שגיאה 400: invalid_scope כשקוראים ל-Google Chat API באמצעות השירות המתקדם
אם מופיעה השגיאה Error 400: invalid_scope
עם הודעת השגיאה
Some requested scopes cannot be shown
,
זה אומר שלא ציינתם היקפי הרשאות בקובץ appsscript.json
של פרויקט Apps Script. ברוב המקרים, Apps Script קובע באופן אוטומטי את ההיקפים שנדרשים לסקריפט, אבל כשמשתמשים בשירות המתקדם של Chat, צריך להוסיף באופן ידני את היקפי ההרשאות שהסקריפט משתמש בהם לקובץ המניפסט של פרויקט Apps Script. מידע נוסף על הגדרת היקפים מפורשים
כדי לפתור את השגיאה, צריך להוסיף את היקפי ההרשאות המתאימים לקובץ appsscript.json
של פרויקט Apps Script כחלק ממערך oauthScopes
. לדוגמה, כדי להפעיל את השיטה spaces.messages.create
, מוסיפים את הפרטים הבאים:
"oauthScopes": [
"https://www.googleapis.com/auth/chat.messages.create"
]
האדמין שלך לא מתיר לבצע קריאות של הסקריפט UrlFetch אל <URL>
אדמינים ב-Google Workspace יכולים להפעיל רשימת היתרים במסוף Admin כדי לקבוע לאילו דומיינים חיצוניים תהיה גישה דרך Apps Script.
כדי לפתור את השגיאה, צריך לפנות לאדמין ולבקש ממנו להוסיף את כתובת ה-URL לרשימת ההיתרים.
ניפוי באגים
לא כל טעות גורמת להצגת הודעת שגיאה. יכול להיות שיש שגיאה פחות ברורה, שבה הקוד נכון מבחינה טכנית ואפשר להריץ אותו, אבל התוצאות לא תואמות למה שציפיתם. ריכזנו כאן כמה אסטרטגיות להתמודדות עם מצבים כאלה ולבדיקה נוספת של סקריפט שלא פועל כמו שציפיתם.
רישום ביומן
במהלך ניפוי הבאגים, כדאי לתעד מידע בזמן הפעלת פרויקט סקריפט. ב-Google Apps Script יש שתי שיטות לרישום מידע: שירות Cloud Logging ושירותי Logger ו-console הבסיסיים יותר, שמוטמעים בעורך Apps Script.
פרטים נוספים זמינים במדריך לרישום ביומן.
Error Reporting
חריגים שמתרחשים בגלל שגיאות בזמן ריצה נרשמים באופן אוטומטי באמצעות שירות דיווח השגיאות של Google Cloud. השירות הזה מאפשר לכם לחפש ולסנן הודעות חריגה שנוצרות בפרויקט הסקריפט.
במאמר הצגת יומני Cloud ודוחות שגיאות במסוף Google Cloud Platform מוסבר איך לגשת אל Error Reporting.
הפעלות
בכל פעם שמריצים סקריפט, מערכת Apps Script מתעדת את ההפעלה, כולל יומני Cloud. הרישומים האלה יכולים לעזור לכם להבין אילו פעולות הסקריפט ביצע.
כדי לראות את ההרצות של הסקריפט בפרויקט Apps Script, בצד ימין לוחצים על Executions (הרצות)
.בדיקת הסטטוס של שירות Apps Script
למרות שזה נדיר, לפעמים יש בעיות זמניות בשירותים ספציפיים של Google Workspace (כמו Gmail או Drive) שעלולות לגרום להפסקות בשירות. במצב כזה, יכול להיות שפרויקטים של Apps Script שמתקשרים עם השירותים האלה לא יפעלו כצפוי.
אפשר לבדוק אם יש הפסקת שירות ב-Google Workspace ב-Google Workspace Status Dashboard. אם יש כרגע הפסקת שירות, אפשר לחכות עד שהיא תיפתר או להיעזר במרכז העזרה של Google Workspace או במסמכי התיעוד של בעיות ידועות ב-Google Workspace.
שימוש בכלי לניפוי באגים ובנקודות עצירה
כדי לאתר בעיות בסקריפט, אפשר להריץ אותו במצב ניפוי באגים. כשמריצים סקריפט במצב ניפוי באגים, הסקריפט מושהה כשהוא מגיע לנקודת עצירה. נקודת עצירה היא שורה שהדגשתם בסקריפט, שלדעתכם יכולה להיות בעייתית. כשסקריפט מושהה, מוצג הערך של כל משתנה באותו רגע, כך שאפשר לבדוק את הפעולות הפנימיות של הסקריפט בלי להוסיף הרבה הצהרות של רישום ביומן.
הוספת נקודת עצירה
כדי להוסיף נקודת עצירה, מעבירים את העכבר מעל מספר השורה שרוצים להוסיף לה את נקודת העצירה. מימין למספר השורה, לוחצים על העיגול. בתמונה הבאה מוצגת דוגמה לנקודת עצירה שנוספה לסקריפט:
הרצת סקריפט במצב ניפוי באגים
כדי להריץ את הסקריפט במצב ניפוי באגים, בחלק העליון של העורך לוחצים על ניפוי באגים.
לפני שהסקריפט מריץ את השורה עם נקודת העצירה, הוא מושהה ומציג טבלה עם מידע על ניפוי הבאגים. אפשר להשתמש בטבלה הזו כדי לבדוק נתונים כמו ערכי הפרמטרים והמידע שמאוחסן באובייקטים.
כדי לשלוט באופן ההרצה של הסקריפט, משתמשים בלחצנים Step in (כניסה), Step over (דילוג) ו-Step out (יציאה) בחלק העליון של חלונית Debugger (מאבחן הבאגים). האפשרויות האלה מאפשרות להריץ את הסקריפט שורה אחת בכל פעם ולבדוק איך הערכים משתנים לאורך זמן.
שגיאה: קוד המקור של השורה הנוכחית לא זמין
השגיאה הזו מופיעה כשקובץ ניפוי באגים פעיל לא זמין.
Google Apps Script לא תומך בהצגה של סקריפטים של JavaScript (JS) שנוצרו באופן דינמי בעורך הסקריפטים, כמו אלה שנוצרו באמצעות eval()
ו-new Function()
. הסקריפטים האלה נוצרים ומופעלים במנוע V8, אבל לא מוצגים כקבצים עצמאיים בעורך.
אם תנסו להיכנס לסקריפטים האלה, תיתקלו בשגיאה הזו.
לדוגמה, נניח שיש לכם את הקוד הבא:
function myFunction() {
eval('a=2');
}
כשמפעילים את eval()
, הארגומנט שלו מטופל כקוד JS ומופעל כסקריפט שנוצר באופן דינמי במנוע V8. אם מבצעים step-into ל-eval()
, השגיאה הזו מופיעה. אם הסקריפט כולל הערה //# sourceURL
, השם שלה מוצג במחסנית הקריאות. אחרת, היא מופיעה כרשומה ללא שם.
למרות הודעת השגיאה, סשן הניפוי באגים נשאר פעיל, והביצוע יכול להימשך. כדי להמשיך, עוברים לשלב 'כניסה', 'יציאה' או 'המשך'. עם זאת, השגיאה הזו ממשיכה להופיע כל עוד ההרצה נשארת בתחום של הסקריפט הדינמי. אחרי שהביצוע יוצא מהסקריפט הדינמי, ניפוי הבאגים נמשך ללא השגיאה הזו.
בעיות עם כמה חשבונות Google
אם אתם מחוברים לכמה חשבונות Google בו-זמנית, יכול להיות שתיתקלו בבעיות בגישה לתוספים ולאפליקציות אינטרנט. פרויקטים, תוספים ואפליקציות אינטרנט של Apps Script לא תומכים בהתחברות לכמה חשבונות Google בו-זמנית.
אם פותחים את עורך Apps Script כשמחוברים ליותר מחשבון אחד, Google מבקשת לבחור את החשבון שרוצים להמשיך איתו.
אם פותחים אפליקציית אינטרנט או תוסף ונתקלים בבעיות שקשורות להתחברות לכמה חשבונות ב-זמנית, אפשר לנסות אחד מהפתרונות הבאים:
- יוצאים מכל חשבונות Google ונכנסים רק לחשבון שבו נמצאים התוסף או אפליקציית האינטרנט שרוצים לגשת אליהם.
- פותחים חלון פרטי ב-Google Chrome או חלון מקביל לגלישה פרטית, ונכנסים לחשבון Google שבו נמצאים התוסף או אפליקציית האינטרנט שרוצים לגשת אליהם.
קבלת עזרה
ניפוי באגים בבעיה באמצעות הכלים והטכניקות שצוינו למעלה יכול לפתור מגוון בעיות, אבל יכול להיות שתיתקלו בבעיות שיידרש סיוע נוסף כדי לפתור אותן. בדף התמיכה שלנו אפשר למצוא מידע על המקומות שבהם אפשר לשאול שאלות ולדווח על באגים.