스프레드시트에서 텍스트의 글꼴 크기를 변경하여 전체 텍스트를 셀 너비에 맞추고 싶습니다.

배경



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);
}
  • 이 경우 활성 스프레드시트의 Sheet1에 있는 셀 A2:A6의 텍스트 글꼴 크기가 변경됩니다.
  • toLarge = true 의 경우, 텍스트의 길이가 셀 폭보다 작은 경우, 텍스트의 폰트를 크게 해 조정합니다.
  • toLarge = false의 경우 텍스트 길이가 셀 너비보다 작 으면 텍스트 글꼴이 변경되지 않습니다.

  • 라이브러리에 구현



    위의 방법은 GAS 라이브러리의 에 새로운 방법으로 추가되었습니다.

    참고


  • RichTextApp
  • autoResizeColumn (columnPosition)
  • etFontSize(size)
  • 좋은 웹페이지 즐겨찾기