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