2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

スプレッドシートでテキストのフォントサイズを変更してテキスト全体をセルの幅に合わせたい

Posted at

背景

Microsoft Excel ではセルの幅に合わせてテキストのフォントを変更する機能がありますが、Google Spreadsheet では残念ながらマニュアル操作でもできないだけでなく、スクリプトを使ってもWrap strategyの中にこのような機能はありません。そこで、回避策を使ってフォントサイズを変更してテキストをセル幅にフィットさせるようなスクリプトを作ってみました。

デモ

20200703a-fig2a.gif

これはデモンストレーションの様子です。スクリプトを実行することで、スプレッドシート上のセル 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へ新たなメソッドとして追加しました。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?