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

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

ลดการโทรไปยังบริการอื่นๆ

การใช้การดำเนินการ JavaScript ภายในสคริปต์ของคุณรวดเร็วกว่า การเรียกใช้บริการอื่นๆ การดำเนินการใดๆ ที่คุณทำได้ภายใน Google Apps Script จะเร็วกว่าการเรียกใช้ที่ต้องดึงข้อมูลจากเซิร์ฟเวอร์ของ Google หรือเซิร์ฟเวอร์ภายนอก เช่น คำขอไปยังชีต, เอกสาร, Sites, แปล, UrlFetch และอื่นๆ สคริปต์จะทำงานเร็วขึ้นหากคุณทำได้ หาวิธีลดการเรียกที่สคริปต์เรียกใช้บริการเหล่านั้น

ลองทำงานร่วมกับไดรฟ์ที่แชร์

หากคุณกำลังทำโครงการสคริปต์กับนักพัฒนาซอฟต์แวร์อื่นๆ คุณสามารถ ทำงานร่วมกันในโปรเจ็กต์ Apps Script ด้วยไดรฟ์ที่แชร์ ไฟล์ในไดรฟ์ที่แชร์จะเป็นของกลุ่ม ไม่ใช่ของรายบุคคล ช่วงเวลานี้ ทำให้การพัฒนาและการบำรุงรักษาโครงการง่ายขึ้น

ใช้การดำเนินการแบบเป็นกลุ่ม

สคริปต์ที่ต้องมีสำหรับอ่านข้อมูลจากสเปรดชีต ดำเนินการคำนวณ แล้วเขียนผลลัพธ์ข้อมูลลงในสเปรดชีต แอป Google สคริปต์มีการเพิ่มประสิทธิภาพในตัวอยู่แล้ว เช่น การใช้การแคชมองล่วงหน้า เพื่อดึงข้อมูลที่สคริปต์น่าจะได้รับ และเขียนการแคชเพื่อบันทึก ที่ควรตั้งค่า

คุณสามารถเขียนสคริปต์เพื่อใช้ประโยชน์สูงสุดจากการแคชในตัว โดย จำนวนการอ่านและเขียนให้เหลือน้อยที่สุด การสลับใช้คำสั่งอ่านและเขียนทำให้การทำงานช้า หากต้องการเร่งความเร็วสคริปต์ ให้อ่านข้อมูลทั้งหมดลงในอาร์เรย์ด้วยคําสั่งเดียว ดําเนินการกับข้อมูลในอาร์เรย์ แล้วเขียนข้อมูลออกด้วยคําสั่งเดียว

ตัวอย่างด้านล่างนี้คือตัวอย่างที่คุณไม่ควรทำตามหรือใช้ สคริปต์ ใช้โค้ดต่อไปนี้เพื่อกำหนดสีพื้นหลังของทุกเซลล์ใน ตารางของสเปรดชีตขนาด 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 มีประโยชน์ เพราะจะบังคับให้เขียนตอบกลับโดยใช้ Flush ที่อยู่ท้ายบรรทัดทุกบรรทัด เพราะ มีการเรียกใช้สเปรดชีตเพียง 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).setBackgrounds(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 นาที