권장사항

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

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

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

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

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

일괄 작업 사용

스크립트는 일반적으로 스프레드시트의 데이터를 읽고 계산한 다음 데이터의 결과를 스프레드시트에 작성해야 합니다. Google Apps Script에는 이미 미리보기 캐싱을 사용하여 스크립트가 얻을 수 있는 항목을 검색하고 캐싱을 작성하여 설정될 가능성이 있는 항목을 저장하는 등 몇 가지 최적화 기능이 내장되어 있습니다.

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

다음은 예이며, 따르거나 사용해서는 안 됩니다. 스크립트는 다음 코드를 사용하여 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에 가져오는 데 20초가 걸리는 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초를 기다려야 하지만 후속 액세스는 25분 후에 캐시에서 항목이 만료될 때까지 매우 빠르게 이루어집니다.