스프레드시트 체크박스 해제 - seupeuledeusiteu chekeubagseu haeje

작업대상 : 구글스프레드시트 체크박스

작업범위 : 구글스프레드시트->리본 메뉴 중 "확장 프로그램"-Apps Script

예제 스프레드 시트 URL : https://url.kr/khiotn

스프레드 시트로 업무를 다루다 보면 체크박스를 활용하는 경우가 종종 발생합니다.

체크박스가 여러개인 경우 이 체크박스 상태를 한번에 전체선택 또는 전체해제가 필요한 경우도 있을거예요.

앱스스크립트를 이용해 원클릭으로 전체선택과 전체해제를 하는 방법입니다.

1.아래의 그림을 먼저 볼까요. C2셀부터 C27셀까지 체크박스가 삽입되어 있습니다.

이 체크박스들이 존재하는 스프레드시트에서 (리본 메뉴 중 "확장 프로그램"-Apps Script 클릭)

스프레드시트 체크박스 해제 - seupeuledeusiteu chekeubagseu haeje

2.새로 뜨는 앱스스크립트 창에서 아래의 코드를 삽입합니다.

만약 체크박스가 위치한 셀주소가 아래 스샷의 코드와 다르다면 빨간 테두리 부분을 바꿔주세요.

ㄴvar range = SpreadsheetApp.getActive().getRange('C2:C');

ㄴC2셀부터 그 아래 C열의 모든 영역을 컨트롤 하기로 선언한 상태입니다.

스프레드시트 체크박스 해제 - seupeuledeusiteu chekeubagseu haeje
  /** 체크박스 일괄 선택 */
  function toggleAllCheckbox_check() {
  
  var spreadsheet = SpreadsheetApp.getActive();
  
  //선택 실행 계속 여부 확인
  var ui = SpreadsheetApp.getUi();  
  var btn = ui.alert("체크박스 전체선택을 진행 하시겠습니까?", ui.ButtonSet.YES_NO);
    if (btn == ui.Button.YES ){
    
    //체크박스 선택
    var range = SpreadsheetApp.getActive().getRange('C2:C');
    range.check();
    var range = SpreadsheetApp.getActive().getRange('C2:C');
    range.check();

    ui.alert("체크박스 전체선택 완료😀\n 되돌리려면 Ctrl+Z 1회!");
   } else {
     ui.alert("체크박스 전체선택 취소😤");
   }
  
};

  /** 체크박스 일괄 해제 */
  function toggleAllCheckbox_Uncheck() {
  
  var spreadsheet = SpreadsheetApp.getActive();
  
  //해제 실행 계속 여부 확인
  var ui = SpreadsheetApp.getUi();  
  var btn = ui.alert("체크박스 전체해제를 진행 하시겠습니까?", ui.ButtonSet.YES_NO);
    if (btn == ui.Button.YES ){
    
    //체크박스 해제
    var range = SpreadsheetApp.getActive().getRange('C2:C');
    range.uncheck();
    var range = SpreadsheetApp.getActive().getRange('C2:C');
    range.uncheck();

    ui.alert("체크박스 전체해제 완료😀\n 되돌리려면 Ctrl+Z 1회!");
   } else {
     ui.alert("체크박스 전체해제 취소😤");
   }
  
};

3.다시 시트로 돌아와 버튼 2개(선택 버튼/해제 버튼)를 만들고 이 버튼들에게 해당하는 액션을 취할 스크립트를 할당하겠습니다.

스크립트 할당을 하려면 만드려는 버튼 2개에 각각 명령함수를 할당해야 합니다.

위 코드에 명령함수가 이미 지정되어 있고, 명령함수의 이름은 임의로 바꾸셔도 괜찮아요.

전체선택 명령함수 : toggleAllCheckbox_check

전체해제 명령함수 : toggleAllCheckbox_Uncheck

4.버튼을 만드려면 시트 리본 메뉴에서 "삽입-그림" 클릭

스프레드시트 체크박스 해제 - seupeuledeusiteu chekeubagseu haeje

5.버튼을 직접 만듭니다.

도형 메뉴를 누르고 아래와 같이 적당한 크기로 버튼을 만들고 버튼 이름까지 써 넣어주세요.

전체선택 버튼 하나, 전체해제 버튼 하나를 만들고 우측 상단의 "저장 후 닫기"를 누릅니다.

스프레드시트 체크박스 해제 - seupeuledeusiteu chekeubagseu haeje

6.지금 만든 2개의 버튼에 각각 명령함수를 할당 할게요.

전체선택 명령함수 : toggleAllCheckbox_check

전체해제 명령함수 : toggleAllCheckbox_Uncheck

전체선택 버튼 우측의 3점 아이콘을 클릭하고 "스크립트 할당" 클릭 후에

스프레드시트 체크박스 해제 - seupeuledeusiteu chekeubagseu haeje

전체선택 명령함수를 붙여넣습니다. : toggleAllCheckbox_check

스프레드시트 체크박스 해제 - seupeuledeusiteu chekeubagseu haeje

전체해제 버튼에도 동일한 방식으로 "전체해제 명령함수(toggleAllCheckbox_Uncheck)"를 할당 해주세요.

7.이제 체크박스 전체선택/전체해제가 버튼 두개로 가능해졌습니다.

스프레드시트 체크박스 해제 - seupeuledeusiteu chekeubagseu haeje

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

구글 스프레드 시트에서 체크박스 다루기 1 - 전체 선택, 해제 / 구글 앱스 스크립트

Richard Shin 2022. 8. 10. 12:38

A1 셀의 체크박스를 클릭하여 체크된 상태로 바꾸면 2행부터 마지막행 까지 모두 선택하고 체크를 해제하면 모두 해제 되는 예제 입니다. 
구글 스프레드 시트로 주식 수익률 관리를 하면서 전종목시세에 의존하던 주가 정보 수집을 종목별로 하게 되면서 체크 박스로 구현하였는데 그 일부를 별도의 예제로 만들었습니다  클릭해서 따로 주가를 수집가능하고 매도한 주식은 삭제도 가능하도록 했습니다. 

스프레드시트 체크박스 해제 - seupeuledeusiteu chekeubagseu haeje

두가지 방법으로 구현해 보았습니다.

첫 번째는 getDataRange 를 이용하여 데이터영역을 취한 뒤 루프를 돌려 수작업으로 구현하는 방법이고 
두 번째는 check(), uncheck() 메서드 이용 하는 방법 입니다.  두번째 방법이 속도가 빠릅니다. 

/* @체크박스구현 
 * 
 * getDataRange 함수를 이용 
 * 첫 행의 체크 박스를 클릭하면 모든 행을 켜고 끄고 함 
 * 1행 1열을 클릭해서 구현해야 하므로 이벤트 처리 
 * sheet 명은 e.range.getSheet() 이용 
 */
function toggleAllCheckbox(e) 
{
  var sheet = e.range.getSheet();
  if( sheet.getName() !="체크박스구현") return; // 체크박스 구현 시트만 적용 

  //var sheet = SpreadsheetApp.getActive().getSheetByName("체크박스구현");
  var checkRange= sheet.getDataRange()
  var values = checkRange.getValues();

  // 1행 1열이 수정될 때 
  if( e != null &&  // 이벤트가 동작하는가? 
     !(e.range.getRow() === 1 && e.range.getColumn() === 1) // 선택된 셀이 1,1 행인가?
    )  return; 

  var chk = values[0][0] // 1행 1열 

  values.forEach(function (row, rowinx) 
  {
    if( chk  == false)
      values[rowinx][0] = false; // == row[0] 
    else
      values[rowinx][0] = true; 
      
    // 다른 열을 참조할 때 rowinx 형태로 사용 
    if(values[rowinx][1] == "삼성전자"){
      values[rowinx][0] = false; 
    }
      
 
  });
  checkRange.setValues(values);
}

checkRange 에 데이터가 포함된 테이블이 2차원 배열 형태로 들어갑니다.
values[rowinx][0] 에 체크박스가 있고요. values[rowinx][1] 에 종목명이 들어갑니다. 

배열은 forEach 에 의하여 루프를 도는데요.  forEach(function(  행 배열, 배열 행 번호) 이렇습니다.
1,1 행이 체크되어 있지 않으면 false , 체크되어있으면 true( 체크함 )가 됩니다.
배열의 setValues 메소드에 의하여  배열 값이 지정됩니다. 

다음은 Range 객체의 check ,uncheck 메소드인데요 자세한 사항은 레퍼런스에 있습니다. 

https://developers.google.com/apps-script/reference/spreadsheet/range#check() 

/*
 * check(), uncheck() 메서드 이용 
 * 
 */
function toggleAllCheckbox2(e) 
{
  var sheet = e.range.getSheet();
  if( sheet.getName() !="체크박스구현") return; // 체크박스 구현 시트만 적용 

  if(e != null &&  !(e.range.getRow() === 1 && e.range.getColumn() === 1))  return;
   
   if(sheet.getRange("체크박스구현!A1").isChecked())
   {
      sheet.getRange("체크박스구현!A2:A").check();
    }
   else
   {
      sheet.getRange("체크박스구현!A2:A").uncheck();
   }
}

A1 열의  isChecked()가 true 이면  영역 전체를 check() 해버리고 아니면 uncheck() 합니다. 속도는 무척 빠르지만 
1번 예제 처럼  다른 열을 참조하여 check uncheck 에서 제외하고 싶을 때는 사용하지 못하고 일괄적으로 구현할 때 사용합니다. 

동작하는 것을 확인하려면  트리거에 등록해 줘야 하는데  확장프로그램에 있는 Apps Script 를 선택 하여 나오는 에디터에서 setUpEditTrigger() 를 실행해 줘야 합니다. 

스프레드시트 체크박스 해제 - seupeuledeusiteu chekeubagseu haeje

예제는 다음에 있으니  개인 구글 드라이브로 복사해서  사용해보시면 됩니다.  파일 메뉴에 사본만들기 

체크박스 다루기

체크박스구현 종목명,종목코드,현재가,등락률,전일대비,전일주가,거래량,시장정보,기준일시,수집일시 현대차,005380,196,000,0.00%,0,196,000,599,309,코스피,2022-08-01 16:12:00,2022-08-01 16:27:06 삼성전자,005930,

docs.google.com

스프레드시트 체크박스 해제 - seupeuledeusiteu chekeubagseu haeje

복사하기

https://docs.google.com/spreadsheets/d/1MbsSABTjB1bvNUXTC8Ur5EJY65YkJSwRa0GMN2JDxIE/copy