背景
Microsoft Excel ではセルの幅に合わせてテキストのフォントを変更する機能がありますが、Google Spreadsheet では残念ながらマニュアル操作でもできないだけでなく、スクリプトを使っても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へ新たなメソッドとして追加しました。