【问题标题】:App script - Exception: You do not have permission to call setFontColor应用脚本 - 例外:您无权调用 setFontColor
【发布时间】:2021-09-29 09:50:12
【问题描述】:

我正在尝试根据同一行上的其他单元格字体编辑单元格字体,但我无法使用我看到的自定义函数编辑它们的样式。

我的问题是如何做到这一点?

这是我的代码:

function colorCells(nameRange, valueRange) {
    var redHex = "#ff0000";
    var orangeHex = "#ff6d01";

    var activeRange = SpreadsheetApp.getActiveRange();
    var activeSheet = activeRange.getSheet();

    var range = activeSheet.getRange(valueRange);
    var rangeColor = range.getFontColors();
    console.log(rangeColor);

    var newColors = rangeColor.map(r => r.includes(redHex) ? redHex : r.includes(orangeHex) ? orangeHex : '#000000');
    console.log(newColors);

    var rangeToColor = activeSheet.getRange(nameRange)
    
    for (let i = 1; i <= rangeToColor.getNumRows(); i++) {
      const cell = rangeToColor.getCell(i, 1);
      cell.setFontColor(newColors[i-1])
    }

    return "";
}

编辑:

为了解释我的目标,我有一列字符串,每列都有一行数据。而且我希望某些数据根据条件格式具有不同的字体颜色。

所以我希望如果一行中的任何数据是红色或橙色,则相关的列字符串将其颜色更改为相同的颜色。这是图像上的示例。

在应用函数/脚本之前:

之后:

【问题讨论】:

  • 据我所知,自定义函数只能更改公式所属的单元格(并在某些情况下填充调整的单元格)。它可以读取工作表上的任何范围,但不要更改它。 developers.google.com/apps-script/guides/sheets/…
  • 好的,我该怎么做?是否可以选择要编辑的范围?
  • 使用conditional formatting不是你想要的吗?使用Custom formula 选项专门激活规则(它允许从其他单元格获取数据)。
  • 是的,但条件格式不能应用于单元格格式,只能应用于值(或者我不知道)
  • 我相信它可以通过例如可以通过自定义菜单运行的脚本功能来完成。具体如何取决于您的工作流程。从您的代码中,我无法判断它究竟是如何工作的。您需要更详细地描述您拥有什么、正在做什么以及想要获得什么。

标签: google-apps-script google-sheets custom-function


【解决方案1】:

您真正想要的是提取每一行的颜色,然后将其应用于具有名称的列(独立于任何名称)。

为此,最简单的方法是制作一个提取该信息的函数:

const BLACK = '#000000'

function extractColumnColors(range) {
  return range.getFontColors()
    .map(rowColors => [
      rowColors.find(v => v !== BLACK) ?? BLACK
    ])
}

此函数执行以下操作:

  1. 获取范围内单元格的字体颜色(Range 类而不是它的 A1 表示法)。
  2. 对于每一行,找到第一个不是黑色的颜色,并用它创建一个包含单个元素的数组。
  3. 如果全部为黑色,则数组中的值为黑色。

所有这些,结果是一个包含具有单一颜色值的​​数组的数组,这是完美的,因为它允许直接调用setFontColors

function example() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Example')
  const nameRange = sheet.getRange('A1:A')
  const valuesRange = sheet.getRange('B1:C')

  const newColors = extractColumnColors(valuesRange)
  nameRange.setFontColors(newColors)
}

参考文献

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2018-04-22
    • 1970-01-01
    相关资源
    最近更新 更多