본문 바로가기

컴퓨터 활용/구글스프레드시트 응용

구글 스프레드시트에서 체크박스 다루기 2 - 토글 스위치(toggle Switch)

실행하면 선택되어 있는 체크박스가 반전되도록 합니다. 

 

예제는 다음에 있습니다.
https://docs.google.com/spreadsheets/d/1MbsSABTjB1bvNUXTC8Ur5EJY65YkJSwRa0GMN2JDxIE/edit#gid=1459606208

수동으로 실행

첫번째 방법은 메뉴에서 명령을 선택하여 수동으로 처리하는 방법입니다.

 

/*
 *  수동 실행
 *  toggleCheckbox 와 같으나 getDataRange를 사용하지 않고 
 *  영역을 직접 지정함 
 *  첫행의 체크박스를 누르는 이벤트로 처리할 시 주석 부분을 수정 
 */
function toggleCheckBoxManual(e) 
{
  //var sheet = e.range.getSheet();
  //if( sheet.getName() !="체크박스토글") return;
  //if(e != null &&  !(e.range.getRow() === 1 && e.range.getColumn() === 1))  return;
 
  var sheet = SpreadsheetApp.getActive().getSheetByName("체크박스토글"); // 이벤트 시 삭제
  sheet.setActiveRange(sheet.getRange("A1"));
  
    
  var checkboxes = sheet.getRange("A2:A"); // 체크 박스 영역
  var rows = checkboxes.getHeight();  // 체크박스 줄 수 
  var checkbox = checkboxes.getValues(); 
 
  var values = new Array(rows); // 2차원 배열 만들기 
  for (var row = 0; row < rows; row++) 
  {
    values[row] = new Array(0); // 2차원 배열 

      if (checkbox[row][0] === true) {
        values[row][0] = false;
      } else { 
        values[row][0] = true;
      } 
  }

  checkboxes.setValues(values);
}

getDataRange() 함수로 데이터 영역을 찾지 않고 직접 영역을 설정합니다.
체크박스 영역은  var checkboxes = sheet.getRange("A2:A");  로 지정되는데 A2:A 는 줄 끝까지 자동지정됩니다. 
checkboxes.getHeight() 로 줄 수를 알 수 있습니다.

두번째 방법은 1행 1열에 있는 체크박스에  변경 이벤트가 발생했을 때 동작합니다.
구현 방법은 전체선택/해제 와 동일합니다.  getDataRange로 영역을 검색해서 체크 박스를 토글시킵니다.
체크되어 있는 것은 체크 해제 그리고 체크 해제된 것은 체크 

/* 
 * 체크박스 토글 스위치 
 * 첫 행의 체크박스를 클릭하면 선택 되어 있는 체크 박스를 토글 함
 *  
 *  ScriptApp.newTrigger("toggleCheckbox").forSpreadsheet(SpreadsheetApp.getActive())
 *   .onEdit().create();
 */

function toggleCheckbox(e) 
{
  var sheet = e.range.getSheet();
  if( sheet.getName() !="체크박스토글") return;
  
  // 이벤트가 동작하고 현재 셀이 1행 1열이 아니면 그냥 종료 
  if(e != null &&  !(e.range.getRow() === 1 && e.range.getColumn() === 1))  return; 

  var checkRange= sheet.getDataRange() // 데이터가 들어있는 테이블 
  var values = checkRange.getValues(); // 값만 취함 
  
  values.forEach(function (row, rowinx) 
  {
    if( values[rowinx][0]  == false)
      values[rowinx][0] = true;
    else
      values[rowinx][0] = false;
   
  });

  checkRange.setValues(values);
}


체크박스다루기.gs 파일에 setUpEditTrigger() 함수를 실행시켜서 트리거를 등록해줘야 동작합니다.

/* 트리거등록 */
function setUpEditTrigger() 
{

  if(!checkTrigger("toggleCheckbox")) // lib.gs 에 있음
  {
    ScriptApp.newTrigger("toggleCheckbox").forSpreadsheet(SpreadsheetApp.getActive()).onEdit().create();
  }
 
}

왼쪽 시계모양을 클릭한다음 다음과 같이 수동으로 생성해줘도 됩니다.