onEdit() 함수
- 셀이 변경될 때마다 호출된다.
- 서식이나 값을 강제로 고정해버릴 수 있다.
- 이 함수 내에서 지정한 서식은 조건부 서식에 덮어 씌워진다. (우선순위 낮음)
지정 범위 서식 강제 고정
- 수정된 범위와 지정한 범위가 겹칠 경우, 지정한 범위의 서식을 강제로 변경한다.
// ----------------------------------------------------------------------
// 범위 겹침 검사
// ----------------------------------------------------------------------
function rangeIntersect(R1, R2) {
if (R1.getLastRow() < R2.getRow() ) return false;
if (R2.getLastRow() < R1.getRow() ) return false;
if (R1.getLastColumn() < R2.getColumn()) return false;
if (R2.getLastColumn() < R1.getColumn()) return false;
return true;
}
// ----------------------------------------------------------------------
// 수정한 범위와 지정한 범위의 영역이 겹치면 지정 영역 내 모든 셀의 스타일 강제 변경
// - onEdit(event) 내에서 사용
// ----------------------------------------------------------------------
// - sheet: SpreadsheetApp.getActiveSheet()
// - eventRange: event.range
// - sheetName: 시트명(문자열)
// - targetRangeA1: 지정 범위(문자열)
// ----------------------------------------------------------------------
function conditionalFormat(sheet, eventRange, sheetName, targetRangeA1) {
if(sheet.getName() !== sheetName) return;
// 시트명이 아니라 gid로 검사하려면 하단 행 사용
//if(sheet.getSheetId() !== 2038650775) return;
var targetRange = sheet.getRange(targetRangeA1);
if(rangeIntersect(targetRange, eventRange)) {
targetRange
.setBackground(null)
.setBorder(false, false, false, false, false, false)
.setNumberFormat("@")
.setHorizontalAlignment("left")
.setFontColor("black")
.setFontWeight("normal")
;
}
}
// 테스트
function onEdit(event) {
var sheet = SpreadsheetApp.getActiveSheet();
var eventRange = event.range;
conditionalFormat(sheet, eventRange, "시트이름1", "A3:B8");
conditionalFormat(sheet, eventRange, "시트이름2", "E3:F5");
}
수정한 셀의 값 존재 여부에 따라 상단 외곽선 검정/흰색 설정
- 해당 셀 범위의 내부 윤곽선을 흰색(
#000000
)으로 설정하고 적용
// ----------------------------------------------------------------------
// 범위 겹침 검사
// ----------------------------------------------------------------------
function rangeIntersect(R1, R2) {
if (R1.getLastRow() < R2.getRow() ) return false;
if (R2.getLastRow() < R1.getRow() ) return false;
if (R1.getLastColumn() < R2.getColumn()) return false;
if (R2.getLastColumn() < R1.getColumn()) return false;
return true;
}
// ----------------------------------------------------------------------
// 수정한 셀의 값 존재 여부에 따라 상단 외곽선 검정/흰색 설정
// ----------------------------------------------------------------------
function automateCeilBorder(sheet, eventRange, sheetId, targetRangeA1) {
// if(sheet.getName() !== sheetName) return;
if(sheet.getSheetId() !== sheetId) return;
var WHITE = "#ffffff";
var BLACK = "#000000";
var targetRange = sheet.getRange(targetRangeA1);
if(rangeIntersect(targetRange, eventRange)) {
// 여러 셀을 동시에 수정한 경우, 무시
if(eventRange.getNumRows() * eventRange.getNumColumns() > 1)
return;
// 상단 검은선
if(eventRange.getValue().length > 0)
{
eventRange
.setBorder(true, null, null, null, false, false, BLACK, SpreadsheetApp.BorderStyle.SOLID)
;
}
// 상단 흰선
else
{
eventRange
.setBorder(true, null, null, null, false, false, WHITE, SpreadsheetApp.BorderStyle.SOLID)
;
}
}
}
function onEdit(event) {
var sheet = SpreadsheetApp.getActiveSheet();
var eventRange = event.range;
automateCeilBorder(sheet, eventRange, 1621150376, 'B7:C56');
automateCeilBorder(sheet, eventRange, 2038650775, 'B7:C55');
}