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

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

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

การใช้การดำเนินการ 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 เป็นประโยชน์ เพราะจะบังคับให้เขียนกลับโดยใช้ 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).setBackgroundColors(colors);

โค้ดที่ไม่มีประสิทธิภาพจะใช้เวลาประมาณ 70 วินาทีในการเรียกใช้ โค้ดที่มีประสิทธิภาพ ทำงานภายใน 1 วินาที

หลีกเลี่ยงไลบรารีในสคริปต์ที่ใช้ UI มากเกินไป

ไลบรารีเป็นวิธีที่สะดวกในการใช้โค้ดซ้ำ แต่จะทำให้ใช้เวลาเริ่มต้นสคริปต์เพิ่มขึ้นเล็กน้อย ความล่าช้านี้สังเกตไม่ได้สำหรับสคริปต์ที่ค่อนข้างนาน (เช่น สคริปต์ยูทิลิตีสำหรับล้างไฟล์ Google ไดรฟ์) แต่สำหรับอินเทอร์เฟซผู้ใช้ HTML Service ฝั่งไคลเอ็นต์ที่เรียกใช้ google.script.run ซ้ำเป็นระยะเวลาสั้นๆ การหน่วงเวลาจะมีผลต่อการเรียกใช้ทุกครั้ง ด้วยเหตุนี้ คุณจึงควรใช้ไลบรารีในส่วนเสริมอย่างจำกัด และคุณอาจต้องการหลีกเลี่ยงการใช้ไลบรารีในสคริปต์ที่ไม่ใช่ส่วนเสริมซึ่งมีการเรียก google.script.run เป็นจำนวนมาก

ใช้บริการ Cache

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