SW 그리고 아빠 엔지니어링 중...

아는 만큼 보이고, 경험해봐야 알 수 있고, 자꾸 써야 내 것이 된다.

개발/생각한 것 개발하기

[단말 관리 서비스] - 리팩토링(관리자를 위한 개선)

보리남편 김 주부 2022. 4. 17. 17:29
728x90
우리 팀만이 아닌 다른 팀도 본 서비스를 사용 시 문제점 발견
초기 구상했던 기능들은 이미 완성되었었다. 하지만 이 서비스를 별개의 사람들이 다수 사용할 때 치명적인 문제점을 발견하였다.

 

현재 서비스 구조

 

확장시 문제점 발생

문제점 : 확장시 관리되는 양식이 한 곳에서 정보를 모으고 있음
원인 :
초기 제작의 목적은 우리 팀에서 사용할 서비스이기에 관리대장이 하나여도 상관없어서 상관없었으나 초기 개발 의도와 달리 서비스 관리자(나) 는 한 명이나 이 서비스를 사용하고자 하는 팀들이 여러 팀 일 때 해당 폼을 그대로 복사를 하면 위와 같은 현상이 발생한다.
임시 대응 : 팀마다 서비스 관리자(나)는 별개의 시트를 만들고 일일이 스크립트를 수정해서 개별적인 시트와의 연결 등 수작업을 해주면 해결이 됨

본격적인 관리자를 위한 개선

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 스프레드 시트를 두고 새로운 폼에 스프레드 시트가 연결이 필요할 때 복사해서 연결하는 형태로 구현이 되었다.

  1. 폼 입력 시, 스프레드시트가 있는가?
    1. 있다면, 해당 스프레드 시트 사용
    2. 없다면, 레퍼런스 스프레드 시트를 복사 -> 폼과 연결

아래와 같이 스프레드시트 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로 생성하여 겹치지 않고 계속 생성할 수 있게 개선
 

 

728x90
728x90