自定义函数更改指定单元格的字体大小



我正试图用谷歌应用程序脚本创建一个自定义函数,以实现以下目标:

示例

为此,我创建了以下应用程序脚本功能:

function changeFontSize(cell,size) {
var spreadsheet = SpreadsheetApp.getActive().getSheetByName("Sheet1");
var range = spreadsheet.getRange(cell)
range.setFontSize(size);
}

并将其与以下公式相结合:

=IF(B2="Heading",changeFontSize(B3,18),changeFontSize(B3,12))

这将返回以下错误:

异常:未找到范围(第3行(。

为什么会发生这种情况,我如何调整我的功能以正确实现我想要的结果?

修改点:

  • 我认为您发布Exception: Range not found的原因是由于=IF(B2="Heading",changeFontSize(B3,18),changeFontSize(B3,12))B3。在这种情况下;B3";给出。如果单元格";B3";是A1符号,则可能不会出现错误。但是,从您当前的错误消息来看,我认为该值可能不是A1符号
  • 而且,即使=IF(B2="Heading",changeFontSize(B3,18),changeFontSize(B3,12))B3是A1符号,我也认为会发生错误。因为在当前阶段,setFontSize不能与自定义函数一起使用。不幸的是,这似乎是当前的规范

从上面的情况来看,为了实现你的目标,使用一个简单的OnEdit触发器怎么样?示例脚本如下。

示例脚本:

function onEdit(e) {
const sheetName = "Sheet1"; // Please set the sheet name.
const fontSize1 = 18; // Please set the font size.
const fontSize2 = 12; // Please set the font size.
const { range } = e;
const sheet = range.getSheet();
if (sheet.getSheetName() != sheetName || range.getA1Notation() != "B2") return;
range.offset(1, 0).setFontSize(range.getValue() == "Heading" ? fontSize1 : fontSize2);
}
  • 使用此脚本时,请将Heading的值设置为单元格";B2";。通过这种方式;B3";变为CCD_ 8。并且当细胞";B2";不是Heading,则字体大小更改为12

注意:

  • 这是一个简单的示例脚本。因此,请根据您的实际情况对此进行修改

参考:

  • 简单触发器

添加1:

根据您的第二个问题,

我还希望将此功能扩展到整个专栏。因此,列中包含";标题";下面的单元格将是18号字体。有没有一种方法可以扩展您的解决方案,使其适用于整个列中的所有实例?

在这种情况下,下面的示例脚本如何?

示例脚本:

请设置标题行。

function myFunction() {
const sheetName = "Sheet1"; // Please set the sheet name.
const fontSize1 = 18; // Please set the font size.
const fontSize2 = 12; // Please set the font size.
const headerRow = 2; // Please set the header row. From your showing sample, 2 is used.
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
const values = sheet.getDataRange().getValues();
const lastRow = values.length;
const { font1, font2 } = values[headerRow - 1].reduce((o, h, c) => {
o[h == "Heading" ? "font1" : "font2"].push(sheet.getRange(headerRow + 1, c + 1, lastRow - headerRow, 1).getA1Notation());
return o;
}, { font1: [], font2: [] });
if (font1.length > 0) {
sheet.getRangeList(font1).setFontSize(fontSize1);
}
if (font2.length > 0) {
sheet.getRangeList(font2).setFontSize(fontSize2);
}
}
  • 在这种情况下,当您使用脚本编辑器运行此脚本时,会检查标题行的值,并更改字体大小

添加2:

关于你的第二个问题,下面的剧本怎么样?

function myFunction() {
const sheetName = "Sheet1"; // Please set the sheet name.
const fontSize1 = 18; // Please set the font size.
const fontSize2 = 12; // Please set the font size.
const column = 2; // Please set the column number.
const headerTitle = "Heading";
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
const range = sheet.getRange(1, column, sheet.getLastRow());
const { s1, s2 } = range.createTextFinder(headerTitle).matchEntireCell(true).findAll().reduce((o, r) => {
o.s1.push(r.offset(1, 0).getA1Notation());
o.s2.push(r.getA1Notation());
return o;
}, { s1: [], s2: [] });
if (s2.length == 0) return;
[[s1, fontSize1], [s2, fontSize2]].forEach(([r, s]) => sheet.getRangeList(r).setFontSize(s));
}

这将适用于您在向Tanaike提出的后续问题中提出的问题,但您可能应该添加一些其他条件。此外,第一个响应是正确的,关于你的脚本不可能,他们的解决方案是好的,但你的具体错误实际上是因为B3需要作为字符串传递给函数:;B3";

function onEdit(e){
changeColumnFontSizeOnHeaderName(e);
}
function changeColumnFontSizeOnHeaderName(e) {
const getColIndexBy = (table,header_name) => table[0].indexOf(header_name); 
const getTableValuesBy = (sheet) => sheet.getRange(1,1,1,1).isBlank() ? [] : Array.from(sheet.getRange(1,1,sheet.getLastRow(),sheet.getLastColumn()).getValues()); 
const header_name = 'Heading';
const fontSize1 = 18; // Please set the font size.
const fontSize2 = 12; // Please set the font size.

const sheet = SpreadsheetApp.getActiveSheet();

const table = getTableValuesBy(sheet); //retrieves the shreadsheet as a table.
const header_index = getColIndexBy(table,header_name); //Identifies the column index of your target header name.
const last_row_with_data = sheet.getLastRow();
const target_column = sheet.getRange(1,(header_index+1),last_row_with_data,1); //(starting row, starting column, last row, last column);
console.log(header_index+1)
const is_heading_match = sheet.getRange(1,(header_index+1)).getValue() == header_name;
const font_sizes_to_set = Array(last_row_with_data).fill().map(()=> is_heading_match ? [fontSize1] : [fontSize2]);
target_column.setFontSizes(font_sizes_to_set);
}

相关内容

  • 没有找到相关文章

最新更新