본문 바로가기

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

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

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

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

첫 번째는 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() 를 실행해 줘야 합니다. 

 

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

 

체크박스 다루기

체크박스구현 종목명,종목코드,현재가,등락률,전일대비,전일주가,거래량,시장정보,기준일시,수집일시 현대차,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

 

복사하기

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