우리 팀만이 아닌 다른 팀도 본 서비스를 사용 시 문제점 발견
초기 구상했던 기능들은 이미 완성되었었다. 하지만 이 서비스를 별개의 사람들이 다수 사용할 때 치명적인 문제점을 발견하였다.
문제점 : 확장시 관리되는 양식이 한 곳에서 정보를 모으고 있음
원인 : 초기 제작의 목적은 우리 팀에서 사용할 서비스이기에 관리대장이 하나여도 상관없어서 상관없었으나 초기 개발 의도와 달리 서비스 관리자(나) 는 한 명이나 이 서비스를 사용하고자 하는 팀들이 여러 팀 일 때 해당 폼을 그대로 복사를 하면 위와 같은 현상이 발생한다.
임시 대응 : 팀마다 서비스 관리자(나)는 별개의 시트를 만들고 일일이 스크립트를 수정해서 개별적인 시트와의 연결 등 수작업을 해주면 해결이 됨
본격적인 관리자를 위한 개선
1. 폼과 스프레드시트 강제 연결성 끊기
폼과 별도의 스프레드 시트에 접근하기 위해서는 spreadsheet id를 가지고 있으면 access 할 수 있다. 하지만 위와 같이 확장 시 문제가 되기 때문에 폼에서 spreadsheet id로 직접 접근하는 코드에서 active 된 spreadsheet로 접근하도록 수정
form.getDestinationId()를 하면 폼에 연결된 스프레드 시트의 id를 얻을 수 있다.
※ 주의할 점은 연결되어있는 spreadsheet가 없는 경우 null이 아닌 error를 발생하기에 try, catch 문으로 예외처리 형태로 작성되어야 한다.
var form = FormApp.getActiveForm();
Logger.log('form = %s',form.getId());
try
{
//연결되어 있는 spreadsheet 있는지 확인!!
Logger.log('form description name = %s',form.getDestinationId());
}
catch(err) // 없으면 null 을 return 하는 것이 아니라 error 가 발생해서 catch 문으로 처리
2. 새로운 폼 생성 시 스프레드시트 자동 연결 하기
스프레드 시트는 페이지별 역할이 있다. (첫 페이지는 폼에서 입력한 raw data가 쌓이고, 두 번째 페이지는 전체 장치들에 대한 관리대장 표, 세 번째 페이지는 장치 관리 담당자 이메일 주소 리스트로 관리자 전체에게 메일을 보낼 때 사용된다.)
새로운 폼이 생성이 되면 form.getDestinationId() 로 했을 때 연결되어 있는 스프레드시트가 없기에 catch 문으로 들어올 테고 스크립트는 위 스프레드시트와 같은 형태와 data가 있다고 가정하고 data를 처리하기에 본 서비스에서는 reference 스프레드 시트를 두고 새로운 폼에 스프레드 시트가 연결이 필요할 때 복사해서 연결하는 형태로 구현이 되었다.
- 폼 입력 시, 스프레드시트가 있는가?
- 있다면, 해당 스프레드 시트 사용
- 없다면, 레퍼런스 스프레드 시트를 복사 -> 폼과 연결
아래와 같이 스프레드시트 id가 있으면 간단히 연결 할 수 있다.
//현재 form 파일과 연결
form.setDestination(FormApp.DestinationType.SPREADSHEET, ss.getId());
문제점 : 위 절차를 진행하면서 레퍼런스 복사를 하고 복사된 스프레드시트로 작업을 해야 하는데 레퍼런스 스프레드시트와 연결
대책 :
1) 레퍼런스 복사 시 복사 파일 이름을 일정 룰로 생성
2) 생성된 파일을 DriveApp을 이용하여 검색하여 새로 생성된 파일을 폼에 연결
1) 일정 룰로 생성
//레퍼런스 시트 복사
var ss = SpreadsheetApp.openById(referenceSpreadSheetID); //실제 access 할 spreadsheet
var createFimeName = "[HAE]Device Mgr["+count+"]";
ss.copy(createFimeName);
2) DriveApp 에 SearchFile API는 params에 스트링으로 검색 필터를 설정할 수 있으며 위 파일 룰로 검색을 하여
\searchFiles(params)
// Log the name of every file in the user's Drive that modified after February 28,
// 2013 whose name contains "untitled".
var files = DriveApp.searchFiles(
'modifiedDate > "2013-02-28" and title contains "untitled"');
while (files.hasNext()) {
var file = files.next();
Logger.log(file.getName());
}
여기서 찾은 file 을 현재 활성화된 폼에 연결
L file 객체는 스프레드시트 이기에 SpreadsheetApp.open() API로 오픈해서 현재 활성화된 폼에 ss.getId()로 연결하여 문제 해결
추가 개선 점 : 새로운 폼을 또 만들고 또 만들면 그 때마다 새로운 스프레드 시트를 생성해야 하는데 현재 룰로 검색되는 개수 +1로 생성하여 겹치지 않고 계속 생성할 수 있게 개선
'개발 > 생각한 것 개발하기' 카테고리의 다른 글
Android - 다른 앱의 로그를 수집하는 방법 정리 및 App 코드 (0) | 2022.05.30 |
---|---|
[단말 관리 서비스] - 3. 구현 - 5. 관리자에게 버그 리포팅 하기 (0) | 2022.04.01 |
[단말 관리 서비스] - troubleshoot - doc 파일 무한 증식 (0) | 2022.03.31 |
[단말 관리 서비스] - 3. 구현 - 4. 단말기 반납 (0) | 2022.03.25 |
[단말 관리 서비스] - 3. 구현 - 3. 단말기 대여 (0) | 2022.03.23 |