권장사항

이 문서에는 스크립트의 성능을 개선하는 데 도움이 되는 권장사항이 나와 있습니다.

다른 서비스로의 통화 최소화

스크립트 내에서 JavaScript 작업을 사용하는 것이 다른 서비스를 호출하는 것보다 훨씬 빠릅니다. Sheets, Docs, Sites, 번역, UrlFetch 등에 대한 요청과 같이 Google Apps Script 자체에서 수행할 수 있는 작업은 Google 서버 또는 외부 서버에서 데이터를 가져와야 하는 호출을 수행하는 것보다 훨씬 빠릅니다. 스크립트가 해당 서비스에 수행하는 호출을 최소화할 방법을 찾을 수 있으면 스크립트가 더 빠르게 실행됩니다.

공유 드라이브로 공동작업하기

다른 개발자와 스크립트 프로젝트를 함께 작업하는 경우 공유 드라이브를 사용하여 Apps Script 프로젝트에서 공동작업할 수 있습니다. 공유 드라이브의 파일은 개인이 아닌 그룹에서 소유합니다. 이렇게 하면 프로젝트 개발과 유지보수가 더 쉬워집니다.

일괄 작업 사용

스크립트는 일반적으로 스프레드시트에서 데이터를 읽고 계산을 수행한 다음 데이터 결과를 스프레드시트에 작성해야 합니다. Google Apps Script에는 이미 Look-Ahead 캐싱을 사용하여 스크립트가 얻을 수 있는 결과를 가져오고 설정 가능성이 높은 항목을 저장하기 위해 캐싱을 작성하는 등의 최적화 기능이 내장되어 있습니다.

읽기 및 쓰기 횟수를 최소화하여 스크립트를 작성하여 기본 제공되는 캐싱을 최대한 활용할 수 있습니다. 읽기 및 쓰기 명령어를 번갈아 사용하면 속도가 느립니다. 스크립트 속도를 높이려면 명령어 하나로 모든 데이터를 배열로 읽고, 배열의 데이터에 대해 작업을 수행하고, 명령어 하나로 데이터를 씁니다.

예를 들어 준수하거나 사용해서는 안 됩니다. 스크립트는 다음 코드를 사용하여 100x100 스프레드시트 그리드에 있는 모든 셀의 배경색을 설정합니다. 이 코드는 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회만 가능합니다.

그러나 호출을 일괄 처리하여 코드를 훨씬 더 효율적으로 만들 수 있습니다. 다음은 셀 범위를 색상이라는 배열로 읽고, 배열의 데이터에 대해 색상 할당 작업을 실행하고, 배열의 값을 스프레드시트에 쓰는 재작성입니다.

  // 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 Drive 파일을 정리하는 유틸리티 스크립트)에서는 눈에 띄지 않지만, 반복적이고 짧은 실행 google.script.run 호출을 실행하는 클라이언트 측 HTML 서비스 사용자 인터페이스의 경우 지연 시간이 모든 호출에 영향을 미칩니다. 이 문제로 인해 라이브러리는 부가기능에서 가급적 사용하지 않아야 하고 google.script.run 호출을 많이 하는 비 부가기능 스크립트에서는 사용하지 않는 것이 좋습니다.

캐시 서비스 사용

캐시 서비스를 사용하여 스크립트 실행 간에 리소스를 캐시할 수 있습니다. 데이터를 캐시하면 데이터를 가져와야 하는 횟수나 빈도를 줄일 수 있습니다. example.com에서 RSS 피드를 가져오는 데 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분 후에 캐시에서 만료될 때까지 매우 빠르게 진행됩니다.