Total: Today: Yesterday:
연구소/이것저것 | 2016. 4. 28. 14:11 | Posted by 자수씨


엑셀 시트로 저장된 데이터를 레드마인 위키에 옮길 때 주로 사용하던 컨버팅페이지가 있었는데, 단위가 큰 수를 적용하니 오류가 발생하였습니다.


방법을 궁리하다가 얼마전에 해보았던 Google Sheets Script editor 를 이용하여 포팅을 도전해보았습니다.



#h3 첫번째 시도



위와 같은 데이터가 있을 때 레드마인에서 테이블 형식으로 사용하기 위해서는 다음과 같은 문법으로 작성 되어야 합니다.


|_. 이름 |_. 출생년도 |_. 주급 | 

| 이정주 | 1983 | 500000 |
| 이은호 | 1986 | 480000 |
| 이수진 | 1989 | 450000 |
| 이혜원 | 1900 | 445000 | 


위와 같은 레드마인용 컨텐츠를 작성해주는 Google Sheets 용 script 를 작성해보았습니다.


### js


function toRedmine(input, hasTitle) {

  

  var _redmineContent = '';

  

  for (var i = 0; i < input.length; i++) {

    var _row = input[i];

    for (var j = 0; j < _row.length; j++) {

      var _col = _row[j];

      

      _redmineContent += '|';

      if (hasTitle == true && i == 0)

        _redmineContent += '_.';

      _redmineContent += ' ' + _col + ' ';

    }

    _redmineContent += '|\r\n'

  }

  

  return _redmineContent;

}


커스텀 함수를 사용하게되면 위와 같은 레드마인 문법으로 포팅된 것을 확인할 수 있습니다.


=toRedmine(A1:C5, true)



실제로 레드마인에 붙여보면 내용은 잘 나오지만 시트에서 본 형식이 아니라 만족스럽지는 않습니다.



포맷이 적용된 데이터를 보고싶은데 말이죠...




#h3 포맷팅된 값으로...


구글 시트의 문서를 찾아보니 range 를 이용하여 현재 화면에 보여지는 값을 가지고 올 수 있다고 합니다.

해당 함수를 이용하여 새로운 커스텀 함수를 만들어보았습니다.


### js


function toRedmine2(range, hasTitle) {

  

  var _redmineContent = '';

  var _values = SpreadsheetApp.getActiveSheet().getRange(range).getDisplayValues();

  

  for (var i = 0; i < _values.length; i++) {

    var _row = _values[i];

    for (var j = 0; j < _row.length; j++) {

      var _col = _row[j];

      

      _redmineContent += '|';

      if (hasTitle == true && i == 0)

        _redmineContent += '_.';

      _redmineContent += ' ' + _col + ' ';

    }

    _redmineContent += '|\r\n'

  }

  

  return _redmineContent;

}

새로만든 커스텀 함수는 기존과는 다르게 ```range```  를 문자열 형식으로 전달해야 합니다.


=toRedmine2("A1:C5", true)






처음에 설정했던 목표는 달성했으나 뭔가 정렬되지 않은게 아쉽습니다.




#h3 정렬을 해보자!!


구글 문서를 살펴보니 정렬된 데이터를 가지고 오는 함수가 있었습니다. ```range.getHorizontalAlignments()``` 해당 함수를 이용하여 레드마인의 정렬 문법을 적용시켜보았습니다.


### js


function toRedmine3(range, hasTitle) {

  

  var _redmineContent = '';

  var _range = SpreadsheetApp.getActiveSheet().getRange(range);

  var _values = _range.getDisplayValues();

  var _aligns = _range.getHorizontalAlignments();

  

  for (var i = 0; i < _values.length; i++) {

    var _row = _values[i];

    for (var j = 0; j < _row.length; j++) {

      var _col = _row[j];

      var _align = _aligns[i][j];

      

      _redmineContent += '|';

      if (hasTitle == true && i == 0)

        _redmineContent += '_.';

      else {

        if (_align.indexOf('right') > -1)

          _redmineContent += '>.';

        else if (_align.indexOf('left') > -1)

          _redmineContent += '<.';

        else if (_align.indexOf('center') > -1)

          _redmineContent += '=.';

      }

      _redmineContent += ' ' + _col + ' ';

    }

    _redmineContent += '|\r\n'

  }

  

  return _redmineContent;

}


세번째 커스텀 함수는 사용방법이 두번째와 동일합니다. 헤더 영역은 정렬이 먹지 않으므로 그 부분만 정렬되지 않도록 구성하였습니다.


=toRedmine3("A1:C5", true)






엑셀의 VBScript 는 문법이 손에 익지 않아 불편했는데 Google Sheets 는 주특기로 사용했던 자바스크립트로 개발이 가능하여 훨씬 빠르고 수월하게 원하는 기능을 만들 수 있었습니다.


앞으로도 자주 애용해야겠네요~




#h3 References

 - https://www.joecullin.com/data_converter/

 - https://developers.google.com/apps-script/reference/spreadsheet/range

 - http://webapps.stackexchange.com/questions/10629/how-to-pass-a-range-into-a-custom-function-in-google-spreadsheets

 - http://www.redmine.org/projects/redmine/wiki/RedmineTextFormattingTextile