首页 > 解决方案 > 应用脚本 - 例外:您无权调用 setFontColor

问题描述

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

我的问题是如何实现这一点?

这是我的代码:

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 "";
}

编辑 :

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

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

在应用函数/脚本之前:

在此处输入图像描述

后 :

在此处输入图像描述

标签: google-apps-scriptgoogle-sheetscustom-function

解决方案


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

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

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)
}

参考


推荐阅读