Google apps script 谷歌表单舍弃文本以适应脚本
我正试图让文本自动调整大小,以适应谷歌表单的单元格。我将手机的宽度设置为特定的大小,还有电子邮件和工作头衔之类的东西,这些东西可能会很长 我知道Google Sheets本机不支持收缩文本以适应为什么!!!!!!与Excel类似,但我是否可以运行一个脚本来实现同样的目标?问题和解决方法: 不幸的是,在当前阶段,没有自动调整字体大小以适应电子表格服务中的单元格宽度的方法。因此,在这种情况下,需要考虑解决方法。但不能直接使用以像素为单位计算文本长度的方向。因为作为一个测试用例,当我比较从字体大小计算的文本长度像素和单元格宽度像素时,它们是不同的。因此,在这个回答中,我想提出一个使用其他方向的解决方法。此解决方案的基本流程如下所示 检索单元格宽度。 使用autoResizeColumn自动调整单元格宽度。 计算单元格的原始宽度与调整大小的宽度之比。 使用比率更改字体大小。 通过此流程,可以自动调整适合单元格宽度的文本长度。使用此流时,示例脚本如下所示 示例脚本: 请复制并粘贴以下脚本并设置targetRange。然后运行脚本Google apps script 谷歌表单舍弃文本以适应脚本,google-apps-script,google-sheets,google-sheets-macros,Google Apps Script,Google Sheets,Google Sheets Macros,我正试图让文本自动调整大小,以适应谷歌表单的单元格。我将手机的宽度设置为特定的大小,还有电子邮件和工作头衔之类的东西,这些东西可能会很长 我知道Google Sheets本机不支持收缩文本以适应为什么!!!!!!与Excel类似,但我是否可以运行一个脚本来实现同样的目标?问题和解决方法: 不幸的是,在当前阶段,没有自动调整字体大小以适应电子表格服务中的单元格宽度的方法。因此,在这种情况下,需要考虑解决方法。但不能直接使用以像素为单位计算文本长度的方向。因为作为一个测试用例,当我比较从字体大小计算
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时,当文本长度小于单元格宽度时,文本的字体大小不会更改。
结果:
在本演示中,单元格A1:A6中的文本长度通过更改字体大小与单元格宽度相匹配。在这种情况下,toLarge是正确的
注:
在本例中,setFontSizesize的字体大小为整数。这样,文本长度可能不完全相同,因为字体大小必须是整数类型。所以请小心这个。
参考资料:
问题和解决方法:
不幸的是,在当前阶段,没有自动调整字体大小以适应电子表格服务中的单元格宽度的方法。因此,在这种情况下,需要考虑解决方法。但不能直接使用以像素为单位计算文本长度的方向。因为作为一个测试用例,当我比较从字体大小计算的文本长度像素和单元格宽度像素时,它们是不同的。因此,在这个回答中,我想提出一个使用其他方向的解决方法。此解决方案的基本流程如下所示
检索单元格宽度。
使用autoResizeColumn自动调整单元格宽度。
计算单元格的原始宽度与调整大小的宽度之比。
使用比率更改字体大小。
通过此流程,可以自动调整适合单元格宽度的文本长度。使用此流时,示例脚本如下所示
示例脚本:
请复制并粘贴以下脚本并设置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);
}
在这个示例脚本中,创建了一个时态表,并使用时态表计算单元的原始宽度和调整大小的宽度之比。
当toLarge为true时,当文本长度小于单元格宽度时,文本的字体大小变大。这样,文本长度与单元格宽度匹配。当toLarge为false时,当文本长度小于单元格宽度时,文本的字体大小不会更改。
结果:
在本演示中,单元格A1:A6中的文本长度通过更改字体大小与单元格宽度相匹配。在这种情况下,toLarge是正确的
注:
在本例中,setFontSizesize的字体大小为整数。这样,文本长度可能不完全相同,因为字体大小必须是整数类型。所以请小心这个。
参考资料:
这很好,但我如何做到这一点而不改变行高或使任何文本变大?@Adam Ogden感谢您的回答。我不得不为我糟糕的英语水平道歉。在这种情况下,请以const-toLarge=false;的形式运行脚本@亚当·奥格登:我的回答告诉你结果了吗?你能告诉我这件事吗?这对我的学习也很有用。如果这样做有效,其他与你有相同问题的人也可以将你的问题作为可以解决的问题。如果你对我的回答还有疑问,我道歉。那时候,我可以问一下你目前的情况吗?我想学习解决您的问题。我不知道如何在电子表格中运行脚本。有用:快速使用此代码:工具->脚本编辑器->将上面的内容粘贴到code.gs中
. 将脚本工作表底部的常量更改为工作表,将targetRange更改为单元格,然后运行。谷歌将警告你,他们尚未验证该项目。这个脚本不考虑单元格高度,只考虑宽度。这会让ToLarge在你身上失败。我建议您将字体设置为有效的最大单元格高度,然后在不增大字体的情况下运行。这很好,但如何在不改变行高或使任何文本变大的情况下执行此操作?@Adam Ogden感谢您的回复。我不得不为我糟糕的英语水平道歉。在这种情况下,请以const-toLarge=false;的形式运行脚本@亚当·奥格登:我的回答告诉你结果了吗?你能告诉我这件事吗?这对我的学习也很有用。如果这样做有效,其他与你有相同问题的人也可以将你的问题作为可以解决的问题。如果你对我的回答还有疑问,我道歉。那时候,我可以问一下你目前的情况吗?我想学习解决您的问题。我不知道如何在电子表格中运行脚本。有用:快速使用此代码:工具->脚本编辑器->将上面的内容粘贴到code.gs中。将脚本工作表底部的常量更改为工作表,将targetRange更改为单元格,然后运行。谷歌将警告你,他们尚未验证该项目。这个脚本不考虑单元格高度,只考虑宽度。这会让ToLarge在你身上失败。我建议将字体设置为最大有效单元格高度,然后在不增大字体的情况下运行。