เอกสารนี้แสดงแนวทางปฏิบัติแนะนำเพื่อปรับปรุงประสิทธิภาพของสคริปต์
ลดการเรียกใช้บริการอื่นๆ
การใช้การดำเนินการ JavaScript ภายในสคริปต์จะเร็วกว่าการเรียกใช้บริการอื่นๆ การดำเนินการใดๆ ที่คุณทำภายใน Google Apps Script เองจะเร็วกว่าการดึงข้อมูลจากเซิร์ฟเวอร์ของ Google หรือเซิร์ฟเวอร์ภายนอก เช่น คำขอไปยังชีต, เอกสาร, ไซต์, Sites, แปลภาษา และ UrlFetch สคริปต์จะทำงานได้เร็วขึ้นหากคุณลดการเรียกใช้บริการ
ทำงานร่วมกันด้วยไดรฟ์ที่แชร์
หากคุณทำงานในโปรเจ็กต์สคริปต์ร่วมกับนักพัฒนาซอฟต์แวร์คนอื่นๆ ให้ทำงานร่วมกันโดยใช้ไดรฟ์ที่แชร์ ไฟล์ในไดรฟ์ที่แชร์จะเป็นของกลุ่ม ไม่ใช่ของแต่ละบุคคล ซึ่งจะช่วยให้ การพัฒนาและบำรุงรักษาโปรเจ็กต์ง่ายขึ้น
ใช้การดำเนินการแบบกลุ่ม
โดยปกติแล้ว สคริปต์จะอ่านข้อมูลจากสเปรดชีต ทำการคำนวณ และเขียนผลลัพธ์กลับ Apps Script ใช้การเพิ่มประสิทธิภาพในตัว เช่น การคาดการณ์ล่วงหน้าและการแคชการเขียน
เพิ่มการแคชในตัวให้ได้มากที่สุดโดยลดการอ่านและการเขียน การสลับคำสั่งอ่านและเขียนจะช้า หากต้องการเร่งความเร็วสคริปต์ ให้อ่านข้อมูลทั้งหมดลงในอาร์เรย์ด้วยคำสั่งเดียว ดำเนินการกับข้อมูลอาร์เรย์ และเขียนข้อมูลออกด้วยคำสั่งเดียว
หลีกเลี่ยงการอ่านและเขียนสลับกันดังที่แสดงในตัวอย่างที่ไม่มีประสิทธิภาพนี้
// 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();
}
สคริปต์ไม่มีประสิทธิภาพเนื่องจากวนซ้ำในเซลล์ 10,000 เซลล์ที่มีการเขียนต่อเนื่อง แม้ว่าแคชแบบเขียนกลับจะช่วยได้ แต่การเรียกใช้แบบเป็นชุดมีประสิทธิภาพมากกว่ามาก
// 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 มาก
ไลบรารีช่วยให้ใช้โค้ดซ้ำได้สะดวก แต่จะ
เพิ่มเวลาเริ่มต้นของสคริปต์ ความล่าช้านี้จะสังเกตได้ในอินเทอร์เฟซผู้ใช้ฝั่งไคลเอ็นต์ของ HTML Service ที่ทำการเรียกใช้ซ้ำๆ
ในระยะเวลาสั้นๆ google.script.run
ใช้ไลบรารีอย่างระมัดระวังในส่วนเสริม
และหลีกเลี่ยงการใช้ในสคริปต์ที่ทำการเรียกใช้ google.script.run จำนวนมาก
ใช้บริการแคช
ใช้บริการแคชเพื่อแคช ทรัพยากรระหว่างการเรียกใช้สคริปต์ การแคชจะช่วยลดความถี่ในการดึงข้อมูล ตัวอย่างต่อไปนี้แสดงวิธีใช้บริการแคชเพื่อเพิ่มความเร็วในการเข้าถึง ฟีด RSS ที่ช้า
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 วินาทีหากรายการไม่อยู่ในแคช แต่การเข้าถึงครั้งต่อๆ ไป จะรวดเร็วขึ้นจนกว่ารายการจะหมดอายุ
ชุดข้อมูลขนาดใหญ่และการคำนวณที่ซับซ้อน
Google ชีตเป็นเครื่องมือที่มีประสิทธิภาพ แต่เมื่อชุดข้อมูลมีขนาดใหญ่ขึ้นและการคำนวณมีความซับซ้อนมากขึ้น คุณอาจพบปัญหาด้านประสิทธิภาพ เช่น สเปรดชีตทำงานช้า IMPORTRANGE ข้อผิดพลาด และสคริปต์หมดเวลา
กรณีที่ควรใช้ฐานข้อมูล
หากสเปรดชีตใกล้ถึงขีดจำกัดของเซลล์ 10 ล้านเซลล์ หรือหากคุณมีแบบฟอร์มที่เชื่อมต่อจำนวนมาก (เช่น 10 แบบฟอร์มขึ้นไป) และสูตรข้ามชีตที่ซับซ้อน ให้พิจารณาใช้โซลูชันฐานข้อมูลเฉพาะ
- Google Cloud SQL: บริการฐานข้อมูลเชิงสัมพันธ์ที่มีการจัดการครบวงจรสำหรับ MySQL, PostgreSQL และเซิร์ฟเวอร์ SQL ใช้บริการ JDBC เพื่อเชื่อมต่อกับ Cloud SQL หรือฐานข้อมูลภายนอกอื่นๆ เช่น Oracle หรือ MongoDB (ผ่านบริดจ์ที่เหมาะสม)
- BigQuery: คลังข้อมูลแบบ Serverless ที่รองรับการปรับขนาดได้อย่างมาก คุณใช้ชีตที่เชื่อมต่อเพื่อวิเคราะห์ชุดข้อมูล BigQuery ขนาดใหญ่ในชีตได้โดยตรง หรือจะใช้บริการ BigQuery เพื่อโต้ตอบกับข้อมูลจาก Apps Script ก็ได้
การเพิ่มประสิทธิภาพสูตร
การใช้สูตรบางอย่างมากเกินไปอาจทำให้สเปรดชีตทำงานช้าลงได้
- ARRAYFORMULA: แม้จะมีประโยชน์ แต่การคำนวณ
ARRAYFORMULAขนาดใหญ่อาจมีค่าใช้จ่ายสูง - VLOOKUP และ OFFSET: ฟังก์ชันเหล่านี้อาจทำงานช้าในชุดข้อมูลขนาดใหญ่ ลองใช้
INDEXและMATCHหรือ Apps Script เพื่อค้นหาในหน่วยความจำได้อย่างมีประสิทธิภาพมากขึ้น - IMPORTRANGE: การใช้
IMPORTRANGEบ่อยๆ ในชีตจำนวนมากอาจทำให้เกิด "ข้อผิดพลาดภายใน" หากชีตต้นทางมีขนาดใหญ่หรือมีการใช้งานหนัก การรวมข้อมูลไว้ในแหล่งข้อมูลแบบรวมศูนย์จะช่วยได้
การจัดการการหมดเวลาของสคริปต์
Apps Script มีขีดจำกัดเวลาในการดำเนินการ (โดยปกติคือ 6 นาทีต่อการดำเนินการ หรือ 30 นาทีสำหรับบัญชี Google Workspace บางบัญชี) หากสคริปต์ขัดข้องบ่อยครั้งเนื่องจากเกินขีดจำกัดการดำเนินการ ให้ทำดังนี้
- ใช้การดำเนินการแบบกลุ่ม: ตามที่ระบุไว้ในส่วนใช้การดำเนินการแบบกลุ่ม ให้ลดการเรียกใช้สเปรดชีตและบริการอื่นๆ
- แบ่งงาน: แบ่งงานขนาดใหญ่ออกเป็นส่วนย่อยๆ ที่แต่ละส่วนสามารถทำให้เสร็จได้ภายในเวลาที่กำหนด
- ใช้ทริกเกอร์สำหรับการดำเนินการต่อ: ตั้งค่าทริกเกอร์ที่ทำงานตามเวลาที่ติดตั้งได้เพื่อดำเนินการต่อในกระบวนการที่ใช้เวลานาน สคริปต์สามารถจัดเก็บสถานะปัจจุบัน (เช่น ดัชนีแถวที่ประมวลผลล่าสุด) โดยใช้บริการพร็อพเพอร์ตี้ และดำเนินการต่อจากจุดนั้นในการเรียกใช้ครั้งถัดไป