ใน Apps Script และ JavaScript รันไทม์หรือสภาพแวดล้อมรันไทม์จะมีเครื่องมือ JavaScript ที่แยกวิเคราะห์และเรียกใช้โค้ดสคริปต์ รันไทม์มีกฎสำหรับวิธีเข้าถึงหน่วยความจำ วิธีที่โปรแกรมโต้ตอบกับระบบปฏิบัติการของคอมพิวเตอร์ และไวยากรณ์ของโปรแกรมที่ถูกต้อง เว็บเบราว์เซอร์แต่ละตัวมีสภาพแวดล้อมรันไทม์สําหรับ JavaScript
ที่ผ่านมา Apps Script ทำงานด้วยโปรแกรมตีความ JavaScript ของ Rhino จาก Mozilla แม้ว่า Rhino จะเป็นวิธีที่สะดวกสำหรับ Apps Script ในการดำเนินการสคริปต์ของนักพัฒนาซอฟต์แวร์ แต่ก็ผูก Apps Script ไว้กับ JavaScript เวอร์ชันหนึ่งๆ (ES5) ด้วย นักพัฒนา Apps Script จะใช้ไวยากรณ์และฟีเจอร์ JavaScript ที่ทันสมัยมากขึ้นในสคริปต์ที่ใช้รันไทม์ Rhino ไม่ได้
รันไทม์ V8 ที่ขับเคลื่อน Chrome และ Node.js รองรับ Apps Script แล้วในตอนนี้เพื่อคลายความกังวลนี้ คุณสามารถย้ายข้อมูลสคริปต์ที่มีอยู่ไปยัง 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 สามารถเรียกเมธอดของออบเจ็กต์และเมธอดแบบคงที่ของคลาสจากตำแหน่งที่คุณเรียกเมธอดของไลบรารีได้อยู่แล้ว สถานที่เหล่านี้มีดังต่อไปนี้
- ทริกเกอร์ไฟล์ Manifest ของส่วนเสริม Google Workspace
- ทริกเกอร์ที่ติดตั้งได้
- รายการเมนูใน เครื่องมือแก้ไข
- ฟังก์ชัน Callback ของผู้ใช้ เช่น ฟังก์ชันที่อธิบายไว้ในตัวอย่างโค้ด
ScriptApp.newStateToken()
ตัวอย่าง V8 ต่อไปนี้แสดงการใช้เมธอดออบเจ็กต์เมื่อสร้างรายการเมนูใน Google ชีต
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 มีบริการบันทึก 2 รายการ ได้แก่ บริการ Logger
และคลาส console
บริการทั้ง 2 อย่างนี้จะเขียนบันทึกลงในบริการบันทึกของ Stackdriver เดียวกัน
หากต้องการแสดงบันทึก 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 เป็นหลักคือไวยากรณ์ที่ช่วยให้เขียนโค้ดได้ง่ายขึ้นเหนือการสืบทอดที่อิงตามโปรโตไทป์ของ 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!" |
สตริงหลายบรรทัด
คุณสามารถกําหนดสตริงหลายบรรทัดได้โดยใช้ไวยากรณ์เดียวกับนิพจน์เทมเพลต ไวยากรณ์นี้ช่วยให้คุณหลีกเลี่ยงการต่อสตริงและลดความซับซ้อนของคำจำกัดความสตริงได้เช่นเดียวกับนิพจน์เทมเพลต
// 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
- คลิกการตั้งค่าโปรเจ็กต์ ทางด้านซ้าย
- เลือกช่องทำเครื่องหมายเปิดใช้รันไทม์ Chrome V8
หรือจะระบุรันไทม์ของสคริปต์โดยตรงโดยการแก้ไขไฟล์ Manifest ของสคริปต์ก็ได้ โดยทำดังนี้
- เปิดโปรเจ็กต์ Apps Script
- คลิกการตั้งค่าโปรเจ็กต์ ทางด้านซ้าย
- เลือกช่องทําเครื่องหมายแสดงไฟล์ Manifest "appsscript.json" ในเครื่องมือแก้ไข
- ทางด้านซ้าย ให้คลิกเครื่องมือแก้ไข
appsscript.json
>
- ในไฟล์ Manifest
appsscript.json
ให้ตั้งค่าช่องruntimeVersion
เป็นค่าV8
- คลิกบันทึกโปรเจ็กต์ ที่ด้านบน
การย้ายข้อมูลสคริปต์ไปยัง V8 จะอธิบายขั้นตอนอื่นๆ ที่คุณควรทำเพื่อให้สคริปต์ทำงานได้ดีโดยใช้ V8
การเปิดใช้รันไทม์ Rhino
หากสคริปต์ใช้ V8 และคุณต้องเปลี่ยนไปใช้รันไทม์ Rhino เดิม ให้ทําดังนี้
- เปิดโปรเจ็กต์ Apps Script
- คลิกการตั้งค่าโปรเจ็กต์ ทางด้านซ้าย
- ล้างช่องทำเครื่องหมายเปิดใช้รันไทม์ Chrome V8
หรือจะแก้ไขไฟล์ Manifest ของสคริปต์ก็ได้ โดยทำดังนี้
- เปิดโปรเจ็กต์ Apps Script
- คลิกการตั้งค่าโปรเจ็กต์ ทางด้านซ้าย
- เลือกช่องทําเครื่องหมายแสดงไฟล์ Manifest "appsscript.json" ในเครื่องมือแก้ไข
- ทางด้านซ้าย ให้คลิกเครื่องมือแก้ไข
appsscript.json
>
- ในไฟล์ Manifest
appsscript.json
ให้ตั้งค่าช่องruntimeVersion
เป็นค่าDEPRECATED_ES5
- คลิกบันทึกโปรเจ็กต์ ที่ด้านบน
ฉันจะย้ายข้อมูลสคริปต์ที่มีอยู่ได้อย่างไร
คู่มือการย้ายข้อมูลสคริปต์ไปยัง V8 อธิบายขั้นตอนที่คุณต้องดำเนินการเพื่อย้ายข้อมูลสคริปต์ที่มีอยู่ไปใช้ V8 ซึ่งเกี่ยวข้องกับการเปิดใช้รันไทม์ V8 และตรวจสอบสคริปต์เพื่อหาความไม่เข้ากันได้ที่ทราบ
การย้ายข้อมูลสคริปต์ไปยัง V8 โดยอัตโนมัติ
ตั้งแต่วันที่ 18 กุมภาพันธ์ 2020 เป็นต้นไป Google จะเริ่มทยอยย้ายข้อมูลสคริปต์ที่มีอยู่ซึ่งผ่านการทดสอบความเข้ากันได้แบบอัตโนมัติไปยัง V8 สคริปต์ที่ได้รับผลกระทบจะยังคงทํางานตามปกติหลังจากการย้ายข้อมูล
หากต้องการเลือกไม่ใช้สคริปต์ในการย้ายข้อมูลอัตโนมัติ ให้ตั้งค่าช่อง runtimeVersion
ในไฟล์ Manifest เป็น DEPRECATED_ES5
คุณเลือกย้ายข้อมูลสคริปต์ไปยัง V8 ด้วยตนเองได้ทุกเมื่อหลังจากนั้น
ฉันจะรายงานข้อบกพร่องได้อย่างไร
คู่มือการสนับสนุนอธิบายวิธีรับความช่วยเหลือด้านการเขียนโปรแกรมใน Stack Overflow, ค้นหารายงานปัญหาที่มีอยู่, รายงานข้อบกพร่องใหม่ และส่งคำขอฟีเจอร์ใหม่