应用程序脚本 - 例外:您无权调用 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
])
}
此函数执行以下操作:
- 获取范围内单元格的字体颜色(class
Range
不是它的A1表示法)。
- 对于每一行,找到第一个不是黑色的颜色,并用它创建一个包含单个元素的数组。
- 如果都是黑色,则数组中的值为黑色。
有了所有这些,结果是一个包含具有单一颜色值的数组的数组,这是完美的,因为它允许直接调用 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)
}
参考资料
我正在尝试根据同一行中其他单元格的字体来编辑单元格字体,但我无法使用我看到的自定义函数来编辑它们的样式。
我的问题是如何实现呢?
这是我的代码:
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
])
}
此函数执行以下操作:
- 获取范围内单元格的字体颜色(class
Range
不是它的A1表示法)。 - 对于每一行,找到第一个不是黑色的颜色,并用它创建一个包含单个元素的数组。
- 如果都是黑色,则数组中的值为黑色。
有了所有这些,结果是一个包含具有单一颜色值的数组的数组,这是完美的,因为它允许直接调用 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)
}