구글 스프레드시트 스크립트 setValue() 동작 문제
구글 스프레드시트 스크립트를 사용하다가 올바르게 setValue()
를 사용하여 특정 셸에 값을 붙여넣으려는데 평상시와 달리 값이 들어가지 않을 때가 있습니다.
function myFunction() { var Sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("mySheet"); // mySheet 시트의 A1:A 범위 중복 제거 값을 B1부터 추출합니다. Sheet.getRange('B1').setValue('=UNIQUE(A1:A)'); }
▲ B1 셸부터 중복 제거 값이 들어와야 하는데 아무런 데이터도 없다.
그러나 정작 B열에는 아무런 데이터도 들어오지 않았습니다. 원래대로라면 UNIQUE(특정 범위의 중복 데이터를 제거한 값을 지정 열에 삽입)함수가 실행 되어야 하지만 오류조차 발생하지 않았습니다.
이러한 문제는 대체로 구글 스크립트 실행 시 다음 명령을 처리하는 데에 있어 타이밍 문제가 발생하여 값을 붙여넣어야 할 시점을 제대로 캐치하지 않아 발생하는 현상입니다. 정확하게는 스크립트 성능 향상을 위해 구글 스크립트가 getRange()
를 우선적으로는 처리하지만 setValue()
함수의 작업은 일시적으로 보류할 수 있다는 의미이기 때문에 다량의 스프레드시트 데이터 변경이 있을 경우 데이터 삽입은 지연이 있는 것입니다.
일반 값이라면 대부분 문제가 없지만 수식을 사용하는 경우 해당 증상이 자주 나타날 것입니다.
해결 방법
수식 데이터를 삽입할 경우 setFomula() 함수로 대체하여 사용해봅니다.
- 기존 –
Sheet.getRange('B1').setValue('=UNIQUE(A1:A)');
- 대체 –
Sheet.getRange('B1').setFomula('=UNIQUE(A1:A)');
만약 위 방법으로도 해결되지 않는다면 setValue() 또는 setFomula() 함수를 실행한 명령문 아랫줄에 다음 내용을 추가합니다 : SpreadsheetApp.flush();
SpreadsheetApp.flush()
함수는 이러한 데이터 삽입 지연을 하지 않고 값 입력이 처리되도록 합니다. 따라서 스크립트 실행 도중에 실시간으로 데이터가 처리되는 것을 확인할 수 있으며 스크립트 동작에 발생하는 오류를 일부 막을 수 있게 됩니다.