ב-Apps Script וב-JavaScript, זמן ריצה או סביבה של זמן ריצה מכילים את מנוע ה-JavaScript שמנתח ומריץ את קוד הסקריפט. סביבת זמן הריצה מספקת כללים לגישה לזיכרון, לאופן שבו התוכנית יכולה לקיים אינטראקציה עם מערכת ההפעלה של המחשב ולתחביר התוכנית שחוקי. לכל דפדפן אינטרנט יש סביבה בסביבת זמן ריצה ל-JavaScript.
בעבר, Apps Script הופעל על ידי המפרש של Mozilla ל-JavaScript Rhino. Rhino סיפק דרך נוחה ל-Apps Script להריץ סקריפטים של מפתחים, אבל הוא גם קשר את Apps Script לגרסה ספציפית של JavaScript (ES5). מפתחי Apps Script לא יכולים להשתמש בתחביר ובתכונות מודרניים יותר של JavaScript בסקריפטים שמשתמשים בסביבת זמן הריצה של Rhino.
כדי לטפל בבעיה הזו, מעכשיו יש תמיכה ב-Apps Script בסביבת זמן הריצה V8 שמפעילה את Chrome ואת Node.js. אתם יכולים להעביר סקריפטים קיימים ל-V8 כדי ליהנות מהתכונות ומהתחביר המודרני של JavaScript.
בדף הזה מוסברות התכונות החדשות שמופעלות על ידי V8 ואיך מפעילים את V8 לשימוש בסקריפטים. במאמר העברת סקריפטים ל-V8 מתוארים השלבים להעברת סקריפטים קיימים לשימוש בסביבת זמן הריצה V8.
תכונות של סביבת זמן הריצה V8
סקריפטים שמשתמשים בסביבת זמן הריצה של V8 יכולים ליהנות מהתכונות הבאות:
תחביר מודרני של ECMAScript
אפשר להשתמש בתחביר ECMAScript מודרני בסקריפטים שמבוססים על סביבת זמן הריצה V8. התחביר הזה כולל את let
, את const
ועוד תכונות פופולריות רבות.
במאמר דוגמאות לתחביר V8 מופיעה רשימה קצרה של שיפורים פופולריים בתחביר שאפשר לבצע באמצעות סביבת זמן הריצה V8.
זיהוי פונקציות משופר
זיהוי הפונקציות ב-Apps Script משופר בסקריפטים שמשתמשים ב-V8. סביבת זמן הריצה החדשה מזהה את הפורמטים הבאים של הגדרות פונקציות:
function normalFunction() {} async function asyncFunction() {} function* generatorFunction() {} var varFunction = function() {} let letFunction = function() {} const constFunction = function() {} var namedVarFunction = function alternateNameVarFunction() {} let namedLetFunction = function alternateNameLetFunction() {} const namedConstFunction = function alternateNameConstFunction() {} var varAsyncFunction = async function() {} let letAsyncFunction = async function() {} const constAsyncFunction = async function() {} var namedVarAsyncFunction = async function alternateNameVarAsyncFunction() {} let namedLetAsyncFunction = async function alternateNameLetAsyncFunction() {} const namedConstAsyncFunction = async function alternateNameConstAsyncFunction() {} var varGeneratorFunction = function*() {} let letGeneratorFunction = function*() {} const constGeneratorFunction = function*() {} var namedVarGeneratorFunction = function* alternateNameVarGeneratorFunction() {} let namedLetGeneratorFunction = function* alternateNameLetGeneratorFunction() {} const namedConstGeneratorFunction = function* alternateNameConstGeneratorFunction() {} var varLambda = () => {} let letLambda = () => {} const constLambda = () => {} var varAsyncLambda = async () => {} let letAsyncLambda = async () => {} const constAsyncLambda = async () => {}
קריאה לשיטות של אובייקטים מטריגרים ומפונקציות קריאה חוזרת
סקריפטים שמשתמשים ב-V8 יכולים להפעיל שיטות של אובייקטים ושיטות סטטיות של כיתות ממקומות שבהם כבר אפשר להפעיל שיטות של ספריות. המקומות האלה כוללים את:
- טריגרים של מניפסט בתוספים ל-Google Workspace
- טריגרים שניתן להתקין
- פריטי תפריט ב Google Workspace עורכים
- פונקציות קריאה חוזרת של משתמשים, כמו זו שמתוארת בדוגמת הקוד
ScriptApp.newStateToken()
.
בדוגמה הבאה ל-V8 מוצג השימוש בשיטות אובייקט בזמן יצירה של פריטים בתפריט ב-Google Sheets:
function onOpen() {
var ui = SpreadsheetApp.getUi(); // Or DocumentApp, SlidesApp, or FormApp.
ui.createMenu('Custom Menu')
.addItem('First item', 'menu.item1')
.addSeparator()
.addSubMenu(ui.createMenu('Sub-menu')
.addItem('Second item', 'menu.item2'))
.addToUi();
}
var menu = {
item1: function() {
SpreadsheetApp.getUi().alert('You clicked: First item');
},
item2: function() {
SpreadsheetApp.getUi().alert('You clicked: Second item');
}
}
צפייה ביומנים
ב-Apps Script יש שני שירותי רישום ביומן: השירות Logger
והכיתה console
. שני השירותים האלה כותבים יומנים לאותו שירות של Stackdriver Logging.
כדי להציג את היומנים Logger
ו-console
, לוחצים על יומן הביצוע בחלק העליון של עורך הסקריפט.
הצגת ביצועים
כדי להציג את היסטוריית הביצועים של הסקריפט, פותחים את הפרויקט ב-Apps Script ולוחצים על ביצועים
בצד ימין.דוגמאות לתחביר V8
בהמשך מופיעה רשימה קצרה של תכונות תחביריות פופולריות שזמינות לסקריפטים באמצעות סביבת זמן הריצה V8.
let
וגם const
מילות המפתח let
ו-const
מאפשרות להגדיר משתנים מקומיים ברמת החסימה וקבועים ברמת החסימה, בהתאמה.
// V8 runtime let s = "hello"; if (s === "hello") { let s = "world"; console.log(s); // Prints "world" } console.log(s); // Prints "hello" const N = 100; N = 5; // Results in TypeError |
פונקציות חץ
פונקציות חץ מספקות דרך קומפקטית להגדרת פונקציות בתוך ביטויים.
// Rhino runtime function square(x) { return x * x; } console.log(square(5)); // Outputs 25 |
// V8 runtime const square = x => x * x; console.log(square(5)); // Outputs 25 // Outputs [1, 4, 9] console.log([1, 2, 3].map(x => x * x)); |
שיעורים
כיתות מאפשרות לארגן קוד באופן קונספטואלי באמצעות ירושה. הכיתות ב-V8 הן בעיקר תכונות נוחה לשימוש (syntactic sugar) על פני הירושה מבוססת-האב טיפוס של JavaScript.
// V8 runtime class Rectangle { constructor(width, height) { // class constructor this.width = width; this.height = height; } logToConsole() { // class method console.log(`Rectangle(width=${this.width}, height=${this.height})`); } } const r = new Rectangle(10, 20); r.logToConsole(); // Outputs Rectangle(width=10, height=20) |
ביטול המבנה של הקצאות
ביטויים של הקצאה עם פירוק מבנה הם דרך מהירה לפרוס ערכים ממערכים ומאובייקטים למשתנים נפרדים.
// Rhino runtime var data = {a: 12, b: false, c: 'blue'}; var a = data.a; var c = data.c; console.log(a, c); // Outputs 12 "blue" var array = [1, 2, 3]; var x = a[0]; var y = a[1]; var z = a[2]; console.log(x, y, z); // Outputs 1 2 3 |
// V8 runtime var data = {a: 12, b: false, c: 'blue'}; var {a, c} = data; console.log(a, c); // Outputs 12 "blue" var array = [1, 2, 3]; var [x, y, z] = array; console.log(x, y, z); // Outputs 1 2 3 |
מחרוזות תבנית
מחרוזות לתבנית הם מחרוזות ללא תווים מיוחדים שמאפשרות להטמיע ביטויים. הם מאפשרים להימנע משימוש בהצהרות מורכבות יותר של שרשור מחרוזות.
// Rhino runtime var name = 'Hi ' + first + ' ' + last + '.'; var url = 'http://localhost:3000/api/messages/' + id; |
// V8 runtime var name = `Hi ${first} ${last}.`; var url = `http://localhost:3000/api/messages/${id}`; |
פרמטרים שמוגדרים כברירת מחדל
פרמטרים שמוגדרים כברירת מחדל מאפשרים לציין ערכים שמוגדרים כברירת מחדל לפרמטר של פונקציה בהצהרה על הפונקציה. כך אפשר לפשט את הקוד בגוף הפונקציה, כי אין צורך להקצות באופן מפורש ערכים שמוגדרים כברירת מחדל לפרמטרים חסרים.
// Rhino runtime function hello(greeting, name) { greeting = greeting || "hello"; name = name || "world"; console.log( greeting + " " + name + "!"); } hello(); // Outputs "hello world!" |
// V8 runtime var hello = function(greeting="hello", name="world") { console.log( greeting + " " + name + "!"); } hello(); // Outputs "hello world!" |
מחרוזות עם כמה שורות
אפשר להגדיר מחרוזות בכמה שורות באמצעות אותו תחביר של מחרוזות תבנית. בדומה ל-template literals, התחביר הזה מאפשר להימנע משרשור מחרוזות ולפשט את הגדרות המחרוזות.
// Rhino runtime var multiline = "This string is sort of\n" + "like a multi-line string,\n" + "but it's not really one."; |
// V8 runtime var multiline = `This on the other hand, actually is a multi-line string, thanks to JavaScript ES6`; |
הפעלת סביבת זמן הריצה V8
אם סקריפט משתמש בסביבת זמן הריצה של Rhino, אפשר להעביר אותו ל-V8 באופן הבא:
- פותחים את הפרויקט ב-Apps Script.
- בצד ימין, לוחצים על הגדרות הפרויקט .
- מסמנים את התיבה Enable Chrome V8 runtime.
לחלופין, אפשר לציין את סביבת זמן הריצה של הסקריפט ישירות על ידי עריכת קובץ המניפסט של הסקריפט:
- פותחים את הפרויקט ב-Apps Script.
- בצד ימין, לוחצים על הגדרות הפרויקט .
- מסמנים את התיבה הצגת קובץ המניפסט 'Appscript.json' בעורך.
- בצד ימין, לוחצים על עריכה
appsscript.json
.
> - בקובץ המניפסט
appsscript.json
, מגדירים את השדהruntimeVersion
לערךV8
. - בחלק העליון, לוחצים על שמירה של הפרויקט .
במאמר העברת סקריפטים ל-V8 מוסבר מה עוד צריך לעשות כדי לוודא שהסקריפט פועל כמו שצריך באמצעות V8.
הפעלת סביבת זמן הריצה של Rhino
אם הסקריפט שלכם משתמש ב-V8 ואתם צריכים להעביר אותו לשימוש בסביבת זמן הריצה המקורית של Rhino, עליכם לבצע את הפעולות הבאות:
- פותחים את הפרויקט ב-Apps Script.
- בצד ימין, לוחצים על הגדרות הפרויקט .
- מבטלים את הסימון של התיבה הפעלה של 'סביבת זמן הריצה' של Chrome V8.
לחלופין, אפשר לערוך את המניפסט של הסקריפט:
- פותחים את הפרויקט ב-Apps Script.
- בצד ימין, לוחצים על הגדרות הפרויקט .
- מסמנים את התיבה הצגת קובץ המניפסט 'Appscript.json' בעורך.
- בצד ימין, לוחצים על עריכה
appsscript.json
.
> - בקובץ המניפסט
appsscript.json
, מגדירים את השדהruntimeVersion
לערךDEPRECATED_ES5
. - בחלק העליון, לוחצים על שמירה של הפרויקט .
איך מעבירים סקריפטים קיימים?
במדריך העברת סקריפטים ל-V8 מוסבר איך מעבירים סקריפט קיים ל-V8. לשם כך, צריך להפעיל את סביבת זמן הריצה של V8 ולבדוק אם יש בסקריפט אי-תאימות ידועה.
העברה אוטומטית של סקריפטים ל-V8
החל מ-18 בפברואר 2020, Google תתחיל בהדרגה להעביר סקריפטים קיימים שעוברים את בדיקת התאימות האוטומטית שלנו לגרסה V8. הסקריפטים המושפעים ממשיכים לפעול כרגיל אחרי ההעברה.
אם רוצים לבטל את ההעברה האוטומטית של סקריפט, צריך להגדיר את השדה runtimeVersion
במניפסט שלו לערך DEPRECATED_ES5
. לאחר מכן, תוכלו להעביר את הסקריפט ל-V8 באופן ידני מתי שתרצו.
איך מדווחים על באגים?
במדריך התמיכה מוסבר איך לקבל עזרה בנושאי תכנות ב-Stack Overflow, לחפש דוחות קיימים על בעיות, לדווח על באגים חדשים ולשלוח בקשות חדשות להוספת תכונות.