این سند، بهترین شیوههایی را فهرست میکند که به شما در بهبود عملکرد اسکریپتهایتان کمک میکند.
تماس با سایر سرویسها را به حداقل برسانید
استفاده از عملیات جاوا اسکریپت در اسکریپت شما به طور قابل توجهی سریعتر از فراخوانی سایر سرویسها است. هر کاری که بتوانید در خود Google Apps Script انجام دهید، بسیار سریعتر از برقراری تماسهایی خواهد بود که نیاز به واکشی دادهها از سرورهای گوگل یا یک سرور خارجی دارند، مانند درخواستها به Sheets، Docs، Sites، Translate، UrlFetch و غیره. اگر بتوانید راههایی برای به حداقل رساندن تماسهایی که اسکریپتها با آن سرویسها انجام میدهند، پیدا کنید، اسکریپتهای شما سریعتر اجرا میشوند.
همکاری با درایوهای اشتراکی را در نظر بگیرید
اگر با سایر توسعهدهندگان روی یک پروژه اسکریپت کار میکنید، میتوانید با استفاده از درایوهای مشترک، روی پروژههای اسکریپت برنامهها همکاری کنید . فایلهای موجود در یک درایو مشترک متعلق به گروه هستند، نه افراد. این امر توسعه و نگهداری پروژه را آسانتر میکند.
استفاده از عملیات دستهای
اسکریپتها معمولاً نیاز دارند که دادهها را از یک صفحه گسترده بخوانند، محاسبات را انجام دهند و سپس نتایج دادهها را در یک صفحه گسترده بنویسند. اسکریپت Google Apps از قبل دارای برخی بهینهسازیهای داخلی است، مانند استفاده از ذخیرهسازی پیشبینانه برای بازیابی آنچه یک اسکریپت احتمالاً دریافت میکند و ذخیرهسازی نوشتن برای ذخیره آنچه احتمالاً تنظیم میشود.
شما میتوانید اسکریپتهایی بنویسید تا با به حداقل رساندن تعداد خواندن و نوشتن، از حداکثر مزیت حافظه پنهان داخلی بهرهمند شوید. استفاده متناوب از دستورات خواندن و نوشتن کند است. برای سرعت بخشیدن به یک اسکریپت، تمام دادهها را با یک دستور در یک آرایه بخوانید، هر عملیاتی را روی دادههای موجود در آرایه انجام دهید و دادهها را با یک دستور بنویسید.
در اینجا یک مثال آورده شده است - مثالی که نباید از آن پیروی کنید یا استفاده کنید. یک اسکریپت از کد زیر برای تنظیم رنگ پسزمینه هر سلول در یک شبکه صفحه گسترده ۱۰۰ در ۱۰۰ استفاده میکند. این اسکریپت از تابعی به نام getColorFromCoordinates() (که در اینجا نشان داده نشده است) برای تعیین رنگ مورد استفاده برای هر سلول استفاده میکند:
// 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();
}
این اسکریپت ناکارآمد است: در ۱۰۰ سطر و ۱۰۰ ستون حلقه میزند و به طور متوالی در ۱۰۰۰۰ سلول مینویسد. حافظه پنهان write-back اسکریپت Google Apps مفید است، زیرا با استفاده از flush در انتهای هر خط، write-back را اجباری میکند. به دلیل ذخیره سازی، فقط ۱۰۰ فراخوانی به صفحه گسترده وجود دارد.
اما میتوان با دستهبندی فراخوانیها، کد را بسیار کارآمدتر کرد. در اینجا بازنویسیای آمده است که در آن محدوده سلولی در آرایهای به نام colors خوانده میشود، عملیات انتساب رنگ روی دادههای موجود در آرایه انجام میشود و مقادیر موجود در آرایه در صفحه گسترده نوشته میشوند:
// 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);
کد ناکارآمد حدود ۷۰ ثانیه طول میکشد تا اجرا شود. کد کارآمد فقط در ۱ ثانیه اجرا میشود!
از کتابخانهها در اسکریپتهای سنگین رابط کاربری اجتناب کنید
کتابخانهها راهی مناسب برای استفاده مجدد از کد هستند، اما زمان لازم برای شروع اسکریپت را کمی افزایش میدهند. این تأخیر برای اسکریپتهای نسبتاً طولانی مدت (مانند یک اسکریپت کاربردی برای تمیز کردن فایلهای Google Drive شما) قابل توجه نیست، اما برای رابطهای کاربری سرویس HTML سمت کلاینت که فراخوانیهای مکرر و کوتاه مدت google.script.run را انجام میدهند، این تأخیر بر هر فراخوانی تأثیر میگذارد. به دلیل این مشکل، کتابخانهها باید به مقدار کم در افزونهها استفاده شوند و ممکن است بخواهید از آنها در اسکریپتهای غیر افزونهای که فراخوانیهای زیادی google.script.run انجام میدهند، اجتناب کنید.
استفاده از سرویس کش
شما میتوانید از سرویس Cache برای ذخیره منابع بین اجرای اسکریپتها استفاده کنید. با ذخیره دادهها، میتوانید تعداد دفعات یا فرکانسی که باید دادهها را دریافت کنید، کاهش دهید. سناریویی را در نظر بگیرید که در آن یک فید RSS در example.com دارید که دریافت آن 20 ثانیه طول میکشد و میخواهید سرعت دسترسی را در درخواستهای متوسط افزایش دهید. مثال زیر نحوه استفاده از سرویس Cache را برای افزایش سرعت دسترسی به این دادهها نشان میدهد.
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 ثانیه صبر کنید، دسترسیهای بعدی بسیار سریع خواهند بود تا زمانی که مورد در حافظه پنهان ظرف 25 دقیقه منقضی شود.