이 문서에는 스크립트 성능을 개선하기 위한 권장사항이 나와 있습니다.
다른 서비스에 대한 호출 최소화
스크립트 내에서 JavaScript 작업을 사용하는 것이 다른 서비스를 호출하는 것보다 빠릅니다. Google Apps Script 내에서 수행하는 작업은 Sheets, Docs, Sites, Sites, Translate, UrlFetch에 대한 요청과 같이 Google 서버나 외부 서버에서 데이터를 가져오는 것보다 빠릅니다. 서비스 호출을 최소화하면 스크립트가 더 빠르게 실행됩니다.
공유 드라이브로 공동작업하기
다른 개발자와 스크립트 프로젝트를 작업하는 경우 공유 드라이브를 사용하여 공동작업하세요. 공유 드라이브의 파일은 개인이 아닌 그룹이 소유하므로 프로젝트 개발 및 유지관리가 더 쉬워집니다.
일괄 작업 사용
스크립트는 일반적으로 스프레드시트에서 데이터를 읽고 계산을 실행한 후 결과를 다시 씁니다. Apps Script는 미리보기 및 쓰기 캐싱과 같은 기본 제공 최적화를 사용합니다.
읽기 및 쓰기를 최소화하여 내장 캐싱을 극대화합니다. 읽기 및 쓰기 명령어를 번갈아 사용하는 것은 느립니다. 스크립트 속도를 높이려면 한 명령어로 모든 데이터를 배열로 읽고, 배열 데이터에 작업을 실행하고, 한 명령어로 데이터를 씁니다.
다음과 같은 비효율적인 예시와 같이 읽기와 쓰기를 번갈아 사용하지 마세요.
// 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();
}
이 스크립트는 연속 쓰기를 사용하여 10,000개의 셀을 반복하므로 비효율적입니다. 쓰기 캐시가 도움이 되지만 호출을 일괄 처리하는 것이 훨씬 더 효율적입니다.
// 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.script.run 호출을 실행하는 클라이언트 측 HTML 서비스 사용자 인터페이스에서 눈에 띕니다. 애드온에서는 라이브러리를 조금만 사용하고 google.script.run 호출을 많이 하는 스크립트에서는 라이브러리를 사용하지 마세요.
캐시 서비스 사용
캐시 서비스를 사용하여 스크립트 실행 간에 리소스를 캐시합니다. 캐싱은 데이터 가져오기 빈도를 줄입니다. 다음 예시에서는 Cache 서비스를 사용하여 느린 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초를 기다려야 하지만, 상품이 만료될 때까지는 후속 액세스가 빠릅니다.
대규모 데이터 세트와 복잡한 계산
Google Sheets는 강력한 도구이지만 데이터 세트가 커지고 계산이 복잡해지면 스프레드시트 지연, IMPORTRANGE 오류, 스크립트 시간 초과와 같은 성능 문제가 발생할 수 있습니다.
데이터베이스를 사용해야 하는 경우
스프레드시트가 1,000만 개의 셀 제한에 가까워지거나 연결된 양식 (예: 10개 이상)과 복잡한 시트 간 수식이 많은 경우 전용 데이터베이스 솔루션을 사용하는 것이 좋습니다.
- Google Cloud SQL: MySQL, PostgreSQL, SQL Server를 위한 완전 관리형 관계형 데이터베이스 서비스입니다. JDBC 서비스를 사용하여 Cloud SQL 또는 Oracle, MongoDB와 같은 기타 외부 데이터베이스에 연결합니다 (적절한 브리지를 통해).
- BigQuery: 확장성이 뛰어난 서버리스 데이터 웨어하우스입니다. 연결된 시트를 사용하여 Sheets에서 직접 대규모 BigQuery 데이터 세트를 분석하거나 BigQuery 서비스를 사용하여 Apps Script에서 데이터와 상호작용할 수 있습니다.
수식 성능 최적화
특정 수식을 많이 사용하면 스프레드시트 속도가 느려질 수 있습니다.
- ARRAYFORMULA: 유용하지만 대규모
ARRAYFORMULA계산에는 비용이 많이 들 수 있습니다. - VLOOKUP 및 OFFSET: 이러한 함수는 대규모 데이터 세트에서 속도가 느릴 수 있습니다.
INDEX및MATCH또는 Apps Script를 사용하여 메모리에서 더 효율적으로 조회를 실행하세요. - IMPORTRANGE: 여러 시트에서
IMPORTRANGE를 자주 사용하면 소스 시트가 크거나 부하가 심한 경우 '내부 오류'가 발생할 수 있습니다. 데이터를 중앙 집중식 소스로 통합하면 도움이 될 수 있습니다.
스크립트 제한 시간 처리
Apps Script에는 실행 시간 제한이 있습니다 (일반적으로 실행당 6분, 일부 Google Workspace 계정의 경우 30분). 스크립트가 실행 한도를 초과하여 자주 비정상 종료되는 경우 다음 단계를 따르세요.
- 일괄 작업 사용: 일괄 작업 사용 섹션에 설명된 대로 스프레드시트 및 기타 서비스에 대한 호출을 최소화합니다.
- 작업 분할: 대규모 작업을 시간 제한 내에 완료할 수 있는 작은 단위로 나눕니다.
- 연속 실행을 위한 트리거 사용: 설치 가능한 시간 기반 트리거를 설정하여 장기 실행 프로세스를 재개합니다. 스크립트는 Properties 서비스를 사용하여 현재 상태 (예: 마지막으로 처리된 행 색인)를 저장하고 다음 실행에서 해당 지점부터 계속할 수 있습니다.