แนวทางปฏิบัติแนะนำ

เอกสารนี้แสดงแนวทางปฏิบัติแนะนำที่จะช่วยปรับปรุงประสิทธิภาพของสคริปต์

ลดการโทรติดต่อบริการอื่นๆ

การใช้การดำเนินการ 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 ฝั่งไคลเอ็นต์ที่เรียกใช้ 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 นาที