스프레드시트에서 텍스트의 글꼴 크기를 변경하여 전체 텍스트를 셀 너비에 맞추고 싶습니다.
10747 단어 GoogleAppsScriptGoogleSpreadSheet
배경
Microsoft Excel에서는 셀 너비에 맞게 텍스트 글꼴을 변경할 수 있습니다. . 그래서 해결 방법을 사용하여 글꼴 크기를 변경하여 텍스트를 셀 너비에 맞게 하는 스크립트를 만들어 보았습니다.
데모
Wrap strategy
이것은 데모의 모습입니다. 스크립트를 실행하면 스프레드시트의 셀 A1:A6에 있는 텍스트의 글꼴 크기가 변경되어 셀 너비에 맞는지 확인할 수 있습니다. 완전히 맞지 않는 이유는 setFontSize(size)
정수의 크기를 조정할 수 없기 때문입니다. 이 때문에, 폰트 사이즈가 작아질수록 완전한 피트는 어렵습니다. 이것이 병목 현상이라고 생각됩니다.
원리
불행히도 셀의 텍스트 글꼴 크기와 텍스트 문자 수에서 계산된 픽셀 값은 셀 너비의 픽셀 값과 다르게 보입니다. (원인 불명) 이 때문에, 다른 방법으로서, 최초로 현재의 셀 폭과, autoResizeColumn
(을)를 사용해 셀 폭을 텍스트의 폭에 오토 피트 시켰을 때의 셀 폭의 비율을 취득합니다. 이 비율을 사용하여 글꼴 크기를 변경하여 auto resize를 실현합니다.
샘플 스크립트
function myFunction() {
const autoResizeFont = (range, toLarge) => {
const sheet = range.getSheet();
const ss = sheet.getParent();
const startColumn = range.getColumn();
const endColumn = range.getColumn() + range.getNumColumns();
const startRow = range.getRow();
const endRow = range.getRow() + range.getNumRows();
const columnObj = [];
for (let c = startColumn; c < endColumn; c++) {
columnObj.push({
column: c,
width: sheet.getColumnWidth(c),
});
}
const tempSheet = ss.insertSheet("tempForAutoresizeFont");
sheet.activate();
const tempRange = tempSheet.getRange("A1");
for (let r = startRow; r < endRow; r++) {
for (let c = 0; c < columnObj.length; c++) {
const srcRange = sheet.getRange(r, columnObj[c].column);
tempSheet.setColumnWidth(1, columnObj[c].width);
srcRange.copyTo(tempRange);
tempSheet.autoResizeColumn(1);
const resizedWidth = tempSheet.getColumnWidth(1);
tempSheet.setColumnWidth(1, columnObj[c].width);
const ratio = columnObj[c].width / resizedWidth;
if (ratio > 1 && !toLarge) continue;
const fontSize = srcRange.getFontSize();
srcRange.setFontSize(Math.ceil(fontSize * ratio));
}
}
ss.deleteSheet(tempSheet);
};
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet1");
const targetRange = "A1:A6";
const toLarge = true;
autoResizeFont(sheet.getRange(targetRange), toLarge);
}
Wrap strategy
이것은 데모의 모습입니다. 스크립트를 실행하면 스프레드시트의 셀 A1:A6에 있는 텍스트의 글꼴 크기가 변경되어 셀 너비에 맞는지 확인할 수 있습니다. 완전히 맞지 않는 이유는
setFontSize(size)
정수의 크기를 조정할 수 없기 때문입니다. 이 때문에, 폰트 사이즈가 작아질수록 완전한 피트는 어렵습니다. 이것이 병목 현상이라고 생각됩니다.원리
불행히도 셀의 텍스트 글꼴 크기와 텍스트 문자 수에서 계산된 픽셀 값은 셀 너비의 픽셀 값과 다르게 보입니다. (원인 불명) 이 때문에, 다른 방법으로서, 최초로 현재의 셀 폭과, autoResizeColumn
(을)를 사용해 셀 폭을 텍스트의 폭에 오토 피트 시켰을 때의 셀 폭의 비율을 취득합니다. 이 비율을 사용하여 글꼴 크기를 변경하여 auto resize를 실현합니다.
샘플 스크립트
function myFunction() {
const autoResizeFont = (range, toLarge) => {
const sheet = range.getSheet();
const ss = sheet.getParent();
const startColumn = range.getColumn();
const endColumn = range.getColumn() + range.getNumColumns();
const startRow = range.getRow();
const endRow = range.getRow() + range.getNumRows();
const columnObj = [];
for (let c = startColumn; c < endColumn; c++) {
columnObj.push({
column: c,
width: sheet.getColumnWidth(c),
});
}
const tempSheet = ss.insertSheet("tempForAutoresizeFont");
sheet.activate();
const tempRange = tempSheet.getRange("A1");
for (let r = startRow; r < endRow; r++) {
for (let c = 0; c < columnObj.length; c++) {
const srcRange = sheet.getRange(r, columnObj[c].column);
tempSheet.setColumnWidth(1, columnObj[c].width);
srcRange.copyTo(tempRange);
tempSheet.autoResizeColumn(1);
const resizedWidth = tempSheet.getColumnWidth(1);
tempSheet.setColumnWidth(1, columnObj[c].width);
const ratio = columnObj[c].width / resizedWidth;
if (ratio > 1 && !toLarge) continue;
const fontSize = srcRange.getFontSize();
srcRange.setFontSize(Math.ceil(fontSize * ratio));
}
}
ss.deleteSheet(tempSheet);
};
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet1");
const targetRange = "A1:A6";
const toLarge = true;
autoResizeFont(sheet.getRange(targetRange), toLarge);
}
function myFunction() {
const autoResizeFont = (range, toLarge) => {
const sheet = range.getSheet();
const ss = sheet.getParent();
const startColumn = range.getColumn();
const endColumn = range.getColumn() + range.getNumColumns();
const startRow = range.getRow();
const endRow = range.getRow() + range.getNumRows();
const columnObj = [];
for (let c = startColumn; c < endColumn; c++) {
columnObj.push({
column: c,
width: sheet.getColumnWidth(c),
});
}
const tempSheet = ss.insertSheet("tempForAutoresizeFont");
sheet.activate();
const tempRange = tempSheet.getRange("A1");
for (let r = startRow; r < endRow; r++) {
for (let c = 0; c < columnObj.length; c++) {
const srcRange = sheet.getRange(r, columnObj[c].column);
tempSheet.setColumnWidth(1, columnObj[c].width);
srcRange.copyTo(tempRange);
tempSheet.autoResizeColumn(1);
const resizedWidth = tempSheet.getColumnWidth(1);
tempSheet.setColumnWidth(1, columnObj[c].width);
const ratio = columnObj[c].width / resizedWidth;
if (ratio > 1 && !toLarge) continue;
const fontSize = srcRange.getFontSize();
srcRange.setFontSize(Math.ceil(fontSize * ratio));
}
}
ss.deleteSheet(tempSheet);
};
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet1");
const targetRange = "A1:A6";
const toLarge = true;
autoResizeFont(sheet.getRange(targetRange), toLarge);
}
toLarge = true
의 경우, 텍스트의 길이가 셀 폭보다 작은 경우, 텍스트의 폰트를 크게 해 조정합니다. toLarge = false
의 경우 텍스트 길이가 셀 너비보다 작 으면 텍스트 글꼴이 변경되지 않습니다. 라이브러리에 구현
위의 방법은 GAS 라이브러리의 에 새로운 방법으로 추가되었습니다.
참고
Reference
이 문제에 관하여(스프레드시트에서 텍스트의 글꼴 크기를 변경하여 전체 텍스트를 셀 너비에 맞추고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tanaike/items/d0d3a72e351dd2a621fa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)