권장사항

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

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

스크립트 내에서 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번만 실행됩니다.

하지만 호출을 일괄 처리하면 코드의 효율성을 훨씬 높일 수 있습니다. 다음은 셀 범위가 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 Drive 파일을 정리하는 유틸리티 스크립트)에서는 눈에 띄지 않지만 반복적으로 짧게 실행되는 google.script.run 호출을 하는 클라이언트 측 HTML 서비스 사용자 인터페이스의 경우 지연이 모든 호출에 영향을 미칩니다. 이 문제로 인해 라이브러리는 부가기능에서 가급적 사용하지 않아야 하며 google.script.run 호출을 많이 하는 부가기능 외 스크립트에서는 사용하지 않는 것이 좋습니다.

캐시 서비스 사용

캐시 서비스를 사용하여 스크립트 실행 간에 리소스를 캐시할 수 있습니다. 데이터를 캐시하면 데이터를 가져와야 하는 횟수나 빈도를 줄일 수 있습니다. 가져오는 데 20초가 걸리는 RSS 피드가 example.com에 있고 평균 요청의 액세스 속도를 높이려는 시나리오를 생각해 보겠습니다. 아래 예는 캐시 서비스를 사용하여 이 데이터에 액세스하는 속도를 높이는 방법을 보여줍니다.

  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분 후에 캐시에서 항목이 만료될 때까지 매우 빠르게 이루어집니다.