首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义函数以更改指定单元格的字体大小

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

Stack Overflow用户
提问于 2022-08-26 11:26:27
回答 2查看 107关注 0票数 0

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

示例

为此,我创建了以下Apps脚本函数:

代码语言:javascript
复制
function changeFontSize(cell,size) {
  var spreadsheet = SpreadsheetApp.getActive().getSheetByName("Sheet1");
  var range = spreadsheet.getRange(cell)
  range.setFontSize(size);
}

并与以下公式相结合:

代码语言:javascript
复制
=IF(B2="Heading",changeFontSize(B3,18),changeFontSize(B3,12))

这将返回以下错误:

例外情况:未找到范围(第3行)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-26 11:48:31

修改要点:

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

从上述情况来看,为了达到您的目标,使用一个简单的OnEdit触发器如何?示例脚本如下所示。

示例脚本:

代码语言:javascript
复制
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“的字体大小将更改为18。而且,当单元格"B2“不是Heading时,字体大小将更改为12

注意:

  • 这是一个简单的示例脚本。所以,请根据你的实际情况修改这个。

参考资料:

增加1:

从你下面的第二个问题,

我还希望将此功能扩展到整个专栏。因此,列中包含“标题”以下单元格的任何单元格都将是18字体。有没有一种方法可以将解决方案扩展到整个列中的所有实例?

在本例中,下面的示例脚本如何?

示例脚本:

请设置标题行。

代码语言:javascript
复制
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:

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

代码语言:javascript
复制
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));
}
票数 1
EN

Stack Overflow用户

发布于 2022-08-26 19:05:56

这将适用于你的要求,在你的后续问题,塔纳伊克,但你可能应该加上一些其他条件。此外,第一个响应是正确的,因为您的脚本是不可能的,并且它们的解决方案是好的,但是您的具体错误实际上是因为B3需要以字符串的形式传递给函数:"B3“。

代码语言:javascript
复制
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);

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73500310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档