javascript - 如何在 Google 表格/应用程序脚本中仅针对一个特定列(按列名)进行定位和迭代?
问题描述
所以我有一个 OnEdit 函数,它检测数据何时被复制并粘贴到电子表格中,然后在找到颜色值的地方,单元格背景颜色变为该颜色。
但是,目前它正在遍历电子表格中的每个单元格,这在复制和粘贴数据时非常慢。我只希望它在我的电子表格的“CategoryColor”列中迭代并检测复制和粘贴的更改。
这是我到目前为止所拥有的,任何帮助将不胜感激!谢谢!
function onEdit(e) {
var firstRow = e.range.getLastRow() - e.range.getHeight() + 1;
var firstColumn = e.range.getLastColumn() - e.range.getWidth() + 1;
var values = e.range.getValues();
for (var i = 0; i < e.range.getHeight(); i++) {
for (var j = 0; j < e.range.getWidth(); j++) {
try {
// changes background colour of cell
e.source.getActiveSheet().getRange(firstRow + i, firstColumn + j).setBackground(values[i][j]);
} catch (e) {
Logger.log(e);
}
}
}
// sets data validation
setDataValidation(createColorList());
getColumnData(activeSpreadsheet);
getFullColumn(columnIndex, startIndex);
}
解决方案
您只需要if
在执行脚本的其余部分之前实现一个评估已编辑列的语句。
使用方法indexOf()查找正确列的示例:
function onEdit(e) {
var sheet=e.source.getActiveSheet();
var headers=sheet.getRange(1,1,1, sheet.getLastColumn()).getValues; //assuming the headers are in row 1, otherwise change it accordingly
var column=headers[0].indexOf("CategoryColor")+1; //finds the column with the header "CategoryColor"
if(e.range.getColumn()==column){
// YOUR SCRIPT
var firstRow = e.range.getLastRow() - e.range.getHeight() + 1;
var firstColumn = e.range.getLastColumn() - e.range.getWidth() + 1;
var values = e.range.getValues();
for (var i = 0; i < e.range.getHeight(); i++) {
for (var j = 0; j < e.range.getWidth(); j++) {
try {
// changes background colour of cell
e.source.getActiveSheet().getRange(firstRow + i, firstColumn + j).setBackground(values[i][j]);
} catch (e) {
Logger.log(e);
}
}
}
// sets data validation
setDataValidation(createColorList());
getColumnData(activeSpreadsheet);
getFullColumn(columnIndex, startIndex);
}
}
笔记:
e.range
将是一个单元格,因此将只包含一个值。var values = e.range.getValues();
因此, 评估是否e.source.getActiveSheet().getRange(firstRow + i, firstColumn + j).setBackground(values[i][j]);
有意义。如果您只想更改已编辑单元格的背景颜色,也许您可以使用
var value = e.range.getValue();
和e.range.setBackground(value);
推荐阅读
- node.js - 使用创建反应应用程序的 npm-start 上未处理的错误
- c - 如何捕获 SIGINT 并让它只杀死 C 中的前台进程?
- markdown - 带有 Pandoc 和 Markdown 的 Beamer 演示文稿 - 波斯语字符无法正确显示
- c++ - 我如何从 Global Hook (WH_GETMESSAGE) GetRawInputDeviceInfo
- cmake - 评估值是多少
在如果( ) 在 CMake 中? - amazon-web-services - AWS EC2 在删除或终止实例时将在实例类型上重新创建:t2.micro,我该怎么办?
- android - Gradle 清理构建问题
- json - 向 JSON 文件添加属性
- vuejs2 - 如何使用 vee-validate 代码创建小提琴?
- go - gorilla/websocket 发送和读取字节数据