เอกสารนี้แสดงรายการแนวทางปฏิบัติแนะนำที่จะช่วยคุณปรับปรุงประสิทธิภาพของสคริปต์
ลดการโทรไปยังบริการอื่นๆ
การใช้การดำเนินการ JavaScript ภายในสคริปต์จะเร็วกว่าการเรียกใช้บริการอื่นๆ อย่างมาก อะไรก็ตามที่สามารถทำได้ใน Google Apps Script จะเร็วกว่าการเรียกที่ต้องดึงข้อมูลจากเซิร์ฟเวอร์ของ Google หรือเซิร์ฟเวอร์ภายนอก เช่น คำขอไปยังชีต, เอกสาร, Sites, แปลภาษา, UrlFetch เป็นต้น สคริปต์จะทำงานเร็วขึ้นหากคุณหาวิธีลดการเรียกใช้สคริปต์กับบริการเหล่านั้น
ลองทำงานร่วมกับไดรฟ์ที่แชร์
หากคุณทำโปรเจ็กต์สคริปต์กับนักพัฒนาซอฟต์แวร์รายอื่น คุณจะทำงานร่วมกันในโปรเจ็กต์ Apps Script ด้วยไดรฟ์ที่แชร์ได้ ไฟล์ในไดรฟ์ที่แชร์จะเป็นของกลุ่ม ไม่ใช่ของรายบุคคล ซึ่งจะทำให้การพัฒนาและการบำรุงรักษาโปรเจ็กต์ง่ายขึ้น
ใช้การดำเนินการแบบกลุ่ม
สคริปต์มักจะต้องอ่านข้อมูลจากสเปรดชีต คำนวณ แล้วเขียนผลลัพธ์ข้อมูลลงในสเปรดชีต สคริปต์ของ Google Apps มีการเพิ่มประสิทธิภาพในตัวอยู่แล้ว เช่น การใช้การแคชล่วงหน้าเพื่อเรียกข้อมูลสิ่งที่สคริปต์น่าจะได้รับ และเขียนการแคชเพื่อบันทึกสิ่งที่น่าจะตั้งค่า
คุณเขียนสคริปต์เพื่อใช้ประโยชน์สูงสุดจากการแคชในตัวได้ โดยการลดจำนวนการอ่านและเขียน การสลับคำสั่งอ่านและเขียน จะช้า หากต้องการเพิ่มความเร็วสคริปต์ ให้อ่านข้อมูลทั้งหมดลงในอาร์เรย์ด้วยคำสั่งเดียว ดำเนินการกับข้อมูลในอาร์เรย์ และเขียนข้อมูลออกมาด้วยคำสั่งเดียว
ตัวอย่างด้านล่างนี้คือตัวอย่างที่คุณไม่ควรทำตามหรือใช้ สคริปต์ใช้รหัสต่อไปนี้เพื่อกำหนดสีพื้นหลังของทุกเซลล์ในตารางสเปรดชีตขนาด 100 x 100 โดยใช้เป็นฟังก์ชันชื่อ 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();
}
สคริปต์ไม่มีประสิทธิภาพ โดยวนซ้ำ 100 แถว 100 คอลัมน์ และเขียนต่อกันถึง 10,000 เซลล์ แคชการเขียนกลับของ Google Apps Script มีประโยชน์เพราะจะบังคับให้เขียนกลับโดยใช้การล้างที่ท้ายบรรทัด เพราะการแคชมีการเรียกไปที่สเปรดชีตเพียง 100 ครั้งเท่านั้น
แต่โค้ดจะมีประสิทธิภาพมากยิ่งขึ้นด้วยการรวมการโทรเป็นกลุ่ม นี่คือการเขียนใหม่โดยอ่านช่วงเซลล์เป็นอาร์เรย์ชื่อสี การกำหนดสี ให้กับข้อมูลในอาร์เรย์ และเขียนค่าในอาร์เรย์ลงในสเปรดชีต
// 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).setBackgroundColors(colors);
โค้ดที่ไม่มีประสิทธิภาพจะใช้เวลาประมาณ 70 วินาที โค้ดที่มีประสิทธิภาพ จะทำงานเพียง 1 วินาที!
หลีกเลี่ยงไลบรารีในสคริปต์ที่มี UI เป็นจำนวนมาก
ไลบรารีเป็นวิธีที่สะดวกในการใช้โค้ดซ้ำ
แต่จะใช้เวลาในการเริ่มต้นสคริปต์เพิ่มขึ้นเล็กน้อย การหน่วงเวลานี้จะมองไม่เห็นในสคริปต์ที่ค่อนข้างใช้เวลานาน (เช่น สคริปต์ยูทิลิตีเพื่อล้างไฟล์ใน Google ไดรฟ์) แต่สำหรับอินเทอร์เฟซผู้ใช้ HTML Service ฝั่งไคลเอ็นต์ที่ทำให้เกิดการเรียกใช้ google.script.run
ซ้ำๆ เป็นระยะเวลาสั้นๆ การหน่วงเวลาจะส่งผลต่อการเรียกใช้ทุกครั้ง ด้วยเหตุนี้ จึงควรใช้ไลบรารีอย่างจำกัดในส่วนเสริม และคุณควรหลีกเลี่ยงไลบรารีเหล่านี้ในสคริปต์ที่ไม่ใช่ส่วนเสริมซึ่งเรียกใช้ google.script.run
จำนวนมาก
ใช้บริการแคช
คุณใช้บริการแคชเพื่อแคชทรัพยากรระหว่างการเรียกใช้สคริปต์ได้ การแคชข้อมูลช่วยลดเวลาหรือความถี่ในการเรียกข้อมูลได้ ลองนึกถึงสถานการณ์ที่คุณมีฟีด RSS ที่ example.com ซึ่งใช้เวลา 20 วินาทีในการดึงข้อมูล และคุณต้องการเพิ่มความเร็วในการเข้าถึงคำขอโดยเฉลี่ย ตัวอย่างด้านล่างแสดงวิธีใช้บริการแคชเพื่อเพิ่มความเร็วในการเข้าถึงข้อมูลนี้
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 นาที