이 문서에는 스크립트 성능을 개선하기 위한 권장사항이 나와 있습니다.
다른 서비스에 대한 호출 최소화
스크립트 내에서 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초를 기다려야 하지만, 상품이 만료될 때까지는 후속 액세스가 빠릅니다.