应用程序脚本 - 例外:您无权调用 setFontColor

App script - Exception: You do not have permission to call 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 "";
}

编辑:

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

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

在应用 function/script 之前:

之后:

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

要做到这一点,最简单的方法是制作一个提取该信息的函数:

const BLACK = '#000000'

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

此函数执行以下操作:

  1. 获取范围内单元格的字体颜色(class 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)
}

参考资料