【问题标题】:Google Sheets Shirk Text to Fit Script谷歌表格推脱文本以适应脚本
【发布时间】:2020-07-02 22:14:44
【问题描述】:

我正在尝试使用 Google 表格让文本自动调整大小以适合其单元格。我将单元格宽度设置为特定大小,并且电子邮件和职位等内容可能会变得很长。

我知道 Google 表格本身并不支持像 Excel 那样缩小文本以适应(为什么!!!!!!),但是有没有我可以运行的脚本来实现相同的目标?

【问题讨论】:

    标签: google-apps-script google-sheets google-sheets-macros


    【解决方案1】:

    问题和解决方法:

    不幸的是,在当前阶段,电子表格服务中没有自动调整字体大小以适应单元格宽度的方法。因此,在这种情况下,需要考虑解决方法。但是不能直接使用以像素为单位计算文本长度的方向。因为作为一个测试用例,当我比较从字体大小和单元格宽度(像素)计算的文本长度(像素)时,它们是不同的。通过这个,在这个答案中,我想提出一个使用其他方向的解决方法。此解决方法的基本流程如下。

    1. 检索单元格宽度。
    2. 使用autoResizeColumn自动调整单元格宽度。
    3. 计算单元格的原始宽度与调整后宽度的比率。
    4. 使用比例更改字体大小。

    通过这种流程,可以自动调整适合单元格宽度的文本长度。使用此流程时,示例脚本如下。

    示例脚本:

    请复制并粘贴以下脚本并设置targetRange。并运行脚本。

    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);
    }
    
    • 在此示例脚本中,将创建一个临时表,并使用该临时表计算单元格的原始宽度和调整大小后的宽度之比。
    • toLargetrue时,当文本长度小于单元格宽度时,文本的字体变大。这样,文本长度与单元格宽度匹配。当toLargefalse时,当文本长度小于单元格宽度时,文本字体大小不变。

    结果:

    在此演示中,单元格“A1:A6”中的文本长度通过更改字体大小与单元格宽度匹配。在这种情况下,toLargetrue

    注意:

    • 在这种情况下,setFontSize(size) 的字体大小为“整数”。这样,文本长度可能不完全相同,因为字体大小需要是整数类型。所以请注意这一点。

    参考资料:

    【讨论】:

    • 这很好,但是如何在不改变行高或使任何文本变大的情况下做到这一点?
    • @Adam Ogden 感谢您的回复。我不得不为我糟糕的英语水平道歉。在这种情况下,请以const toLarge = false; 运行脚本。
    • @Adam Ogden 我的回答是否向您展示了您想要的结果?你能告诉我吗?这对我学习也很有用。如果这可行,与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果您对我的回答有疑问,我深表歉意。到时候,可以问一下你现在的情况吗?我想学习解决你的问题。
    • 我不知道如何在电子表格中运行脚本。有用:developers.google.com/apps-script/quickstart/… 快​​速使用此代码:工具 -> 脚本编辑器 -> 将上面粘贴到 Code.gs。更改脚本底部的常量(将工作表更改为工作表,将 targetRange 更改为单元格),然后运行。 Google 会警告您他们尚未验证该项目。该脚本不考虑单元格高度,只考虑宽度。这会使 ToLarge 对您失败。我建议将您的字体设置为最大单元格高度有效,然后在没有 toLarge 的情况下运行。
    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多