반응형
반응형
💡Apps Script로 Google Sheets에서 Sidebar에 데이터를 선택하는
HTML 페이지를 불러오는 방법을 알아본다.
데이터를 조회하는 화면에서
조회조건인 G/L 계정 값들을 다중 선택 하여 조회하고 싶다는 요구 사항이 들어왔다.
처음엔 sheet edit trigger를 이용해 개발하였는데,
외부 trigger라 속도가 느렸다.
성능개선의 요구를 받았고,
Sidebar와 Modal 로 개발을 진행하였다.
일단 버튼을 만들었다.
버튼에 실행할 script도 할당하였다.
다른 시트에 있는 해당 데이터들을 가져올 것이다.
SpreadsheetApp 을 이용해 sheet의 데이터들을 가져오고,
가져온 데이터들을 html 을 이용하여 sidebar에 그려준다.
/**
* sidebar 열기
* @param {string} gubun = 구분값
*/
function open_GlSideBar(gubun){
// 소스
const sheetUrl = SpreadsheetApp.getActiveSpreadsheet().getUrl();
const masterSheetName = "가져올시트";
const sheetName = "할당할시트";
const title = "G/L계정 선택";
// sidebar에 뿌려줄 데이터 가져오기
const sheet = SpreadsheetApp.openByUrl(sheetUrl).getSheetByName(masterSheetName);
const data = sheet.getRange("A2:B"+sheet.getLastRow()).getValues();
// 할당할 시트
const workSheet = SpreadsheetApp.openByUrl(sheetUrl).getSheetByName(sheetName);
const selectedValues = workSheet.getRange("B5").getValue();
// 선택된 값들에 checked
const arrayValues = selectedValues.toString().split(", ");
var loopHtml = "";
for (i in data) {
var status = "";
for ( j in arrayValues ) {
if ( data[i][0] == arrayValues[j] ) {
status = 'checked="checked"';
}
}
loopHtml += '<div class="itemKeys"><li style=list-style:none; >';
loopHtml += '<input type="checkbox" class="check" onchange="selectVal()" name="' + data[i][1] + '" id="items" value="' + data[i][0] + '"'+status+'><font class="itemName" size="1">' + data[i][0] + " (" + data[i][1] + ')</font></li></div>';
}
var html = HtmlService.createHtmlOutput('<html> '
+ ' <body> '
+ ' <div style=position:fixed;background-color:white;width:100%;top:0;line-height:2rem;>'
+ ' <input onkeyup="filter()" type="text" id="value" placeholder="검색어 입력" style="width: 220px;"> '
+ ' </div> '
+ ' <br />'
+ ' <div>'
+ loopHtml
+ ' </div>'
+ ' <div style=position:fixed;background-color:white;width:100%;bottom:0;line-height:2rem;>'
+ ' <input type="button" value="초기화" onclick="resetChecked()" /> '
+ ' <input type="button" value="닫기" onclick="closeModal()" /> '
+ ' </div> '
+ ' <script type="text/javascript"> '
+ ' function closeModal() { google.script.host.close(); }'
+ ' function setSelectedValues(resultVal, resultName) { google.script.run.setSelectedValues(resultVal, resultName, "'+gubun+'"); }'
+ ' function resetValues() { google.script.run.setSelectedValues("", "", "'+gubun+'"); }'
+ ' function selectVal() { '
+ ' const query = "input[id=\\'items\\']:checked"; '
+ ' const selectedEls = document.querySelectorAll(query); '
+ ' var resultVal = ""; '
+ ' var resultName = ""; '
+ ' for ( var i=0; i<selectedEls.length; i++ ) { '
+ ' if ( i == 0 ) { '
+ ' resultVal += selectedEls[i].value; '
+ ' resultName += selectedEls[i].name; '
+ ' } else { '
+ ' resultVal += ", " + selectedEls[i].value; '
+ ' resultName += ", " + selectedEls[i].name; '
+ ' } '
+ ' } '
+ ' setSelectedValues(resultVal, resultName); '
+ ' } '
+ ' function filter() { '
+ ' var value, name, item, i; '
+ ' value = document.getElementById("value").value.toUpperCase().trim(); '
+ ' item = document.getElementsByClassName("itemKeys"); '
+ ' for( i=0; i<item.length; i++ ) { '
+ ' name = item[i].getElementsByClassName("itemName"); '
+ ' if ( name[0].innerHTML.toUpperCase().indexOf(value) > -1 ) { '
+ ' item[i].style.display = "flex"; '
+ ' } else { '
+ ' item[i].style.display = "none"; '
+ ' } '
+ ' } '
+ ' } '
+ ' function resetChecked() { '
+ ' var item = document.getElementsByClassName("check"); '
+ ' for ( i=0; i<item.length; i++ ) { '
+ ' item[i].checked = false; '
+ ' } '
+ ' resetValues(); '
+ ' } '
+ ' </script> '
+ ' </body> '
+ ' </html> ')
.setTitle(title);
SpreadsheetApp.getUi().showSidebar(html);
}
HTML 과 Google Sheets의 연결을 위해,
HTML 에서 아래와 같이 Google Sheets에서 생성한 함수를 호출해야한다.
google.script.run.anyFunction
/**
* sidebar에서 선택된 값 sheet에 할당
* @param {string} val = 코드
* @param {string} name = 명칭
* @param {string} gubun = 구분자
*/
function setSelectedValues ( val, name, gubun ) {
const sheetUrl = SpreadsheetApp.getActiveSpreadsheet().getUrl();
const sheetName = "할당할시트";
const sheet = SpreadsheetApp.openByUrl(sheetUrl).getSheetByName(sheetName);
sheet.getRange("B5").setValue(val);
sheet.getRange("C5").setValue(name);
}
모달로 호출하려면, showModalDialog() 를 사용하면 된다.
var htmlString = "";
var html = HtmlService.createHtmlOutput(htmlString)
.setTitle(title)
.setWidth(600).setHeight(350);
SpreadsheetApp.getUi().showModalDialog(html, title);
검색 기능도 들어가 있다.
반응형
'GCP > Apps Script' 카테고리의 다른 글
Apps Script로 Google Sheets의 마스터성 데이터 관리하기 (1) | 2022.09.07 |
---|---|
Apps Script의 trigger 사용기와 활용 예시 (1) | 2022.09.07 |
Apps Script로 Google Sheets의 소계 데이터 만들기 (0) | 2022.09.06 |
Apps Script로 Google Sheets의 저장 영역 필수 값 체크하기 (0) | 2022.09.06 |
Apps Script 라이브러리 생성해서 다른 Apps Script에서 사용하기 (0) | 2022.09.06 |