Apps Komut Dosyası ve JavaScript'te çalışma zamanı veya çalışma zamanı ortamı, komut dosyası kodunu ayrıştırıp yürüten JavaScript motorunu içerir. Çalışma zamanı, belleğe nasıl erişileceği, programın bilgisayarın işletim sistemiyle nasıl etkileşim kurabileceği ve hangi program söz diziminin yasal olduğuyla ilgili kurallar sağlar. Her web tarayıcısının JavaScript için bir çalışma zamanı ortamı vardır.
Geçmişte Apps Komut Dosyası, Mozilla'nın Rhino JavaScript yorumlayıcısı tarafından destekleniyordu. Rhino, Apps Komut Dosyası'nın geliştirici komut dosyalarını yürütmesi için uygun bir yol sunsa da Apps Komut Dosyası'nı belirli bir JavaScript sürümüne (ES5) bağladı. Apps Komut Dosyası geliştiricileri, Rhino çalışma zamanını kullanan komut dosyalarında daha modern JavaScript söz dizimi ve özellikleri kullanamaz.
Bu sorunu gidermek için Apps Komut Dosyası artık Chrome ve Node.js'ye güç veren V8 çalışma zamanı tarafından desteklenmektedir. Modern JavaScript söz diziminden ve özelliklerinden yararlanmak için mevcut komut dosyalarını V8'e taşıyabilirsiniz.
Bu sayfada, V8'in etkinleştirdiği yeni özellikler ve V8'i komut dosyalarınızda kullanmak üzere nasıl etkinleştirebileceğiniz açıklanmaktadır. Komut dosyalarını V8'e taşıma mevcut komut dosyalarını V8 çalışma zamanını kullanacak şekilde taşıma adımlarını açıklar.
V8 çalışma zamanının özellikleri
V8 çalışma zamanını kullanan komut dosyaları aşağıdaki özelliklerden yararlanabilir:
Modern ECMAScript söz dizimi
V8 çalışma zamanı tarafından desteklenen komut dosyalarında modern ECMAScript söz dizimini kullanabilirsiniz. Bu söz dizimi let, const ve diğer birçok popüler özelliği içerir.
V8 çalışma zamanını kullanarak yapabileceğiniz popüler söz dizimi iyileştirmelerinin kısa bir listesi için V8 söz dizimi örnekleri başlıklı makaleyi inceleyin.
İyileştirilmiş işlev algılama
V8 kullanan komut dosyaları için Apps Komut Dosyası işlev algılama özelliği iyileştirildi. Yeni çalışma zamanı, şu işlev tanımı biçimlerini tanır:
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 () => {}
Tetikleyicilerden ve geri aramalardan nesne yöntemlerini çağırma
V8 kullanan komut dosyaları, kitaplık yöntemlerini çağırabildiğiniz yerlerden nesne yöntemlerini ve sınıf statik yöntemlerini çağırabilir. Bu yerler arasında şunlar bulunur:
- Google Workspace eklentileri manifest tetikleyicileri
- Yüklenebilir tetikleyiciler
- Google Workspace düzenleyicilerindeki menü öğeleri
ScriptApp.newStateToken()kod örneğinde açıklanan gibi kullanıcı geri çağırma işlevleri.
Aşağıdaki V8 örneğinde, Google E-Tablolar'da menü öğeleri oluşturulurken nesne yöntemlerinin nasıl kullanıldığı gösterilmektedir:
function onOpen() {
const 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();
}
const menu = {
item1: function() {
SpreadsheetApp.getUi().alert('You clicked: First item');
},
item2: function() {
SpreadsheetApp.getUi().alert('You clicked: Second item');
}
}
Günlükleri göster
Apps Komut Dosyası iki günlük hizmeti sağlar: Logger hizmeti ve console sınıfı. Bu hizmetlerin her ikisi de günlükleri aynı Stackdriver Logging hizmetine yazar.
Logger ve console günlüklerini göstermek için komut dosyası düzenleyicisinin üst kısmındaki Yürütme günlüğü'nü tıklayın.
Yürütmeleri görüntüleme
Komut dosyanızın yürütme geçmişini görüntülemek için Apps Komut Dosyası projesini açın ve sol tarafta Yürütmeler'i tıklayın.
V8 söz dizimi örnekleri
Aşağıda, V8 çalışma zamanını kullanan komut dosyalarında kullanılabilen popüler söz dizimsel özelliklerin kısa bir listesi verilmiştir.
let ve const
let
ve const
anahtar kelimeleri, sırasıyla blok kapsamlı yerel değişkenler ve blok kapsamlı sabitler tanımlamanıza olanak tanır.
// V8 runtime let s = "hello"; if (s === "hello") { s = "world"; console.log(s); // Prints "world" } console.log(s); // Prints "hello" const N = 100; N = 5; // Results in TypeError |
Ok işlevleri
Ok işlevleri, ifadelerdeki işlevleri tanımlamanın kompakt bir yolunu sunar.
// 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)); |
Sınıflar
Sınıflar, kalıtımla kodu kavramsal olarak düzenlemenin bir yolunu sunar. V8'deki sınıflar, öncelikle JavaScript prototip tabanlı devralma üzerinde söz dizimsel bir kolaylık sağlar.
// 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) |
Destructuring assignments
Destructuring assignment ifadeleri, dizilerdeki ve nesnelerdeki değerleri ayrı değişkenlere ayırmanın hızlı bir yoludur.
// 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 a = [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 const data = {a: 12, b: false, c: 'blue'}; const {a, c} = data; console.log(a, c); // Outputs 12 "blue" const array = [1, 2, 3]; const [x, y, z] = array; console.log(x, y, z); // Outputs 1 2 3 |
Şablon değişmezleri
Şablon değişmezleri yerleştirilmiş ifadelere izin veren dize değişmezleridir. Daha karmaşık dize birleştirme ifadelerinden kaçınmanızı sağlar.
// Rhino runtime var name = 'Hi ' + first + ' ' + last + '.'; var url = 'http://localhost:3000/api/messages/' + id; |
// V8 runtime const name = `Hi ${first} ${last}.`; const url = `http://localhost:3000/api/messages/${id}`; |
Varsayılan parametreler
Varsayılan parametreler, işlev bildiriminde işlev parametreleri için varsayılan değerler belirtmenize olanak tanır. Bu, eksik parametrelere varsayılan değerlerin açıkça atanması ihtiyacını ortadan kaldırdığı için işlev gövdesindeki kodu basitleştirebilir.
// Rhino runtime function hello(greeting, name) { greeting = greeting || "hello"; name = name || "world"; console.log( greeting + " " + name + "!"); } hello(); // Outputs "hello world!" |
// V8 runtime const hello = function(greeting="hello", name="world") { console.log( greeting + " " + name + "!"); } hello(); // Outputs "hello world!" |
Çok satırlı dizeler
Şablon değişmezleri ile aynı söz dizimini kullanarak çok satırlı dizeler tanımlayabilirsiniz. Şablon değişmezlerinde olduğu gibi bu söz dizimi, dize birleştirmelerinden kaçınmanıza ve dize tanımlarını basitleştirmenize olanak tanır.
// Rhino runtime var multiline = "This string is sort of\n" + "like a multi-line string,\n" + "but it's not really one."; |
// V8 runtime const multiline = `This on the other hand, actually is a multi-line string, thanks to JavaScript ES6`; |
V8 çalışma zamanı sınırlamaları
Apps Komut Dosyası V8 çalışma zamanı, standart bir Node.js veya tarayıcı ortamı değildir. Bu durum, üçüncü taraf kitaplıklarını çağırdığınızda veya diğer JavaScript ortamlarındaki kod örneklerini uyarladığınızda uyumluluk sorunlarına yol açabilir.
Kullanılamayan API'ler
Aşağıdaki standart JavaScript API'leri Apps Script V8 çalışma zamanında KULLANILAMAZ:
- Zamanlayıcılar:
setTimeout,setInterval,clearTimeout,clearInterval - Yayınlar:
ReadableStream,WritableStream,TextEncoder,TextDecoder - Web API'leri:
fetch,FormData,File,Blob,URL,URLSearchParams,DOMException,atob,btoa - Kripto:
crypto,SubtleCrypto - Global Nesneler:
window,navigator,performance,process(Node.js)
Alternatif olarak aşağıdaki Apps Komut Dosyası API'lerini kullanın:
- Zamanlayıcılar: Eşzamanlı duraklamalar için
Utilities.sleepkullanın. Asenkron zamanlayıcılar desteklenmez. - Fetch: HTTP(S) istekleri göndermek için
UrlFetchApp.fetch(url, params)kullanın. - atob: Base64 kodlu dizelerin kodunu çözmek için
Utilities.base64Decodekullanın. - btoa: Dizeleri Base64 olarak kodlamak için
Utilities.base64Encodekullanın. - Crypto:
UtilitiessimgesinicomputeDigest,computeHmacSha256SignaturevecomputeRsaSha256Signaturegibi kriptografik işlevler için kullanın.
TextEncoder gibi Apps Komut Dosyası alternatifi olmayan API'ler için bazen bir polyfill kullanabilirsiniz. Çoklu doldurma, çalışma zamanı ortamında varsayılan olarak kullanılamayan API işlevlerini kopyalayan bir kitaplıktır. Polyfill kullanmadan önce Apps Komut Dosyası'nın V8 çalışma zamanıyla uyumlu olduğunu doğrulayın.
Asenkron sınırlamalar
V8 çalışma zamanı, async ve await söz dizimini ve Promise nesnesini destekler.
Ancak Apps Komut Dosyası çalıştırma zamanı ortamı temelde eşzamanlıdır.
- Küçük görevler (Desteklenir): Çalışma zamanı, mevcut çağrı yığını temizlendikten sonra küçük görev sırasını (geri çağırmaların ve çözümlerin gerçekleştiği yer) işler.
Promise.thenawait - Büyük görevler (desteklenmez): Apps Komut Dosyası'nda büyük görevler için standart bir etkinlik döngüsü yoktur.
setTimeoutvesetIntervalgibi işlevler kullanılamaz. - WebAssembly Exception: WebAssembly API, çalışma zamanında engellemeyen bir şekilde çalışan tek yerleşik özelliktir ve belirli eşzamansız derleme kalıplarına (WebAssembly.instantiate) olanak tanır.
UrlFetchApp.fetch gibi tüm G/Ç işlemleri
engelleyici olur. Paralel ağ istekleri elde etmek için UrlFetchApp.fetchAll kullanın.
Sınıf sınırlamaları
V8 çalışma zamanı, modern ES6+ sınıf özellikleri konusunda belirli sınırlamalara sahiptir:
- Özel Alanlar: Özel sınıf alanları (ör.
#field) desteklenmez ve ayrıştırma hatalarına neden olur. Gerçek kapsülleme için kapanışları veyaWeakMapkullanabilirsiniz. - Statik Alanlar: Sınıf gövdesi içindeki doğrudan statik alan bildirimleri (ör.
static count = 0;) desteklenmez. Tanımlandıktan sonra sınıfa statik özellikler atayın (ör.MyClass.count = 0;).
Modül sınırlamaları
- ES6 Modülleri: V8 çalışma zamanı ES6 modüllerini (
import/export) desteklemez. Kitaplıkları kullanmak için Apps Komut Dosyası kitaplık mekanizmasını kullanmanız veya kodunuzu ve bağımlılıklarını tek bir komut dosyası halinde paketlemeniz gerekir. (Issue Tracker) - Dosya Yürütme Sırası: Projenizdeki tüm komut dosyaları genel kapsamda yürütülür. Yan etkileri olan üst düzey koddan kaçınmak ve işlevlerin ile sınıfların dosyalarda kullanılmadan önce tanımlandığından emin olmak en iyisidir. Dosyalar arasında bağımlılıklar varsa bunları düzenleyicide açıkça sıralayın.
V8 çalışma zamanını etkinleştirme
Rhino çalışma zamanını kullanan bir komut dosyasını V8'e geçirmek için aşağıdakileri yapabilirsiniz:
- Apps Komut Dosyası projesini açın.
- Sol tarafta Proje Ayarları'nı tıklayın.
- Chrome V8 çalışma zamanını etkinleştir onay kutusunu seçin.
Alternatif olarak, komut dosyası manifest dosyasını düzenleyerek komut dosyası çalışma zamanını doğrudan belirtebilirsiniz:
- Apps Komut Dosyası projesini açın.
- Sol tarafta Proje Ayarları'nı tıklayın.
- "appsscript.json" manifest dosyasını düzenleyicide göster onay kutusunu işaretleyin.
- Sol tarafta Düzenleyici >
appsscript.json'ı tıklayın. appsscript.jsonmanifest dosyasında,runtimeVersionalanınıV8değerine ayarlayın.- Üstte Projeyi kaydet'i tıklayın.
Komut dosyalarını V8'e taşıma başlıklı makalede, komut dosyanızın V8'i kullanarak düzgün çalışmasını sağlamak için uygulamanız gereken diğer adımlar açıklanmaktadır.
Rhino çalışma zamanını etkinleştirme
Komut dosyanız V8 kullanıyorsa ve orijinal Rhino çalışma zamanını kullanacak şekilde değiştirmeniz gerekiyorsa aşağıdakileri yapın:
- Apps Komut Dosyası projesini açın.
- Sol tarafta Proje Ayarları'nı tıklayın.
- Chrome V8 çalışma zamanını etkinleştir onay kutusunun işaretini kaldırın.
Alternatif olarak, komut dosyası manifestinizi düzenleyin:
- Apps Komut Dosyası projesini açın.
- Sol tarafta Proje Ayarları'nı tıklayın.
- "appsscript.json" manifest dosyasını düzenleyicide göster onay kutusunu işaretleyin.
- Sol tarafta Düzenleyici >
appsscript.json'ı tıklayın. appsscript.jsonmanifest dosyasında,runtimeVersionalanınıDEPRECATED_ES5değerine ayarlayın.- Üstte Projeyi kaydet'i tıklayın.
Mevcut komut dosyalarını nasıl taşıyabilirim?
Komut dosyalarını V8'e taşıma rehberinde, mevcut bir komut dosyasını V8'i kullanacak şekilde taşımak için uygulamanız gereken adımlar açıklanmaktadır. Bu işlem, V8 çalışma zamanını etkinleştirmeyi ve komut dosyasında bilinen uyumsuzlukları kontrol etmeyi içerir.
Komut dosyalarının V8'e otomatik olarak taşınması
Google, 18 Şubat 2020'den itibaren otomatik uyumluluk testimizi geçen mevcut komut dosyalarını kademeli olarak V8'e taşımaya başlayacak. Etkilenen komut dosyaları, taşıma işleminden sonra normal şekilde çalışmaya devam eder.
Bir komut dosyasını otomatik taşıma dışında bırakmak istiyorsanız manifest dosyasındaki
runtimeVersion
alanını DEPRECATED_ES5 olarak ayarlayın. Daha sonra dilediğiniz zaman komut dosyasını manuel olarak V8'e taşıyabilirsiniz.
Hataları nasıl bildirebilirim?
Destek kılavuzunda, Stack Overflow'da programlama yardımı alma, mevcut sorun raporlarını arama, yeni hataları bildirme ve yeni özellik isteklerinde bulunma hakkında bilgi verilmektedir.