App Script - 如何加速我的 setBackground() 函数?
App Script - How can I Speed up My setBackground() function?
我在 App 脚本上的 setBackground()
函数上遇到了困难。我怎样才能加快速度?它正在运行,但执行速度非常慢。
我写了这个:
function changeColor(sheetName, startColorCol, sizeCellCol, totalCellCol) {
var sSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName)
for (z = startColorCol; z <= totalCellCol; z = z + sizeCellCol) {
// As this is called onEdit() we don't want to perform the entire script every time a cell is
// edited- only when a status cell is mofified.
// To ensure this, before anything else we check to see if the modified cell is actually in the status column.
if (sSheet.getActiveCell().getColumn() == z) {
var row = sSheet.getActiveRange().getRow();
var value = sSheet.getActiveCell().getValue();
var col = "white"; // Default background color
var colLimit = z; // Number of columns across to affect
switch (value) {
case "fait":
col = "MediumSeaGreen";
break;
case "sans réponse":
col = "Orange";
break;
case "proposition":
col = "Skyblue";
break;
case "Revisions Req":
col = "Gold";
break;
case "annulé":
col = "LightCoral";
break;
default:
break;
}
if (row >= 3) {
sSheet.getRange(row, z - 2, 1, sizeCellCol).setBackground(col);
}
}
}
}
我看到我可能需要使用批处理操作,但我不知道如何让它工作。
问题是,当一个单元格的值发生变化时,我需要为一系列单元格着色。有什么想法吗?
谢谢
问题:
- 您只想检查单个单元格,即已编辑的单元格 (
var value = sSheet.getActiveCell().getValue();
)。因此,使用循环没有意义。
解决方案:
- 使用 event object 获取有关编辑单元格的数据(sheet、列索引、行索引等),而不是使用循环并检查每个
getActiveCell().getColumn()
时间。默认情况下,此事件对象作为参数传递给 onEdit
(下面示例中的 e
),但您应该将其作为参数传递给 changeColor
函数。
- 在执行任何其他操作之前,检查编辑的单元格是否是您正在跟踪的范围内的编辑单元格之一(正确 sheet,第 3 行,
startColorCol
和 [= 之间的列17=].
- 如果编辑的单元格在正确的范围内,更新背景颜色。
代码示例:
function onEdit(e) {
// ...Some stuff...
changeColor(e, sheetName, startColorCol,sizeCellCol, totalCellCol);
}
function changeColor(e, sheetName, startColorCol,sizeCellCol, totalCellCol) {
const range = e.range;
const column = range.getColumn();
const row = range.getRow();
const sSheet = range.getSheet();
if (sSheet.getName() === sheetName && column >= startColorCol && column <= totalCellCol && row >= 3) {
const value = range.getValue();
let col = "white"; // Default background color
switch (value) {
case "fait":
col = "MediumSeaGreen";
break;
case "sans réponse":
col = "Orange";
break;
case "proposition":
col = "Skyblue";
break;
case "Revisions Req":
col = "Gold";
break;
case "annulé":
col = "LightCoral";
break;
default:
break;
}
sSheet.getRange(row, column-2, 1, sizeCellCol).setBackground(col);
}
}
我在 App 脚本上的 setBackground()
函数上遇到了困难。我怎样才能加快速度?它正在运行,但执行速度非常慢。
我写了这个:
function changeColor(sheetName, startColorCol, sizeCellCol, totalCellCol) {
var sSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName)
for (z = startColorCol; z <= totalCellCol; z = z + sizeCellCol) {
// As this is called onEdit() we don't want to perform the entire script every time a cell is
// edited- only when a status cell is mofified.
// To ensure this, before anything else we check to see if the modified cell is actually in the status column.
if (sSheet.getActiveCell().getColumn() == z) {
var row = sSheet.getActiveRange().getRow();
var value = sSheet.getActiveCell().getValue();
var col = "white"; // Default background color
var colLimit = z; // Number of columns across to affect
switch (value) {
case "fait":
col = "MediumSeaGreen";
break;
case "sans réponse":
col = "Orange";
break;
case "proposition":
col = "Skyblue";
break;
case "Revisions Req":
col = "Gold";
break;
case "annulé":
col = "LightCoral";
break;
default:
break;
}
if (row >= 3) {
sSheet.getRange(row, z - 2, 1, sizeCellCol).setBackground(col);
}
}
}
}
我看到我可能需要使用批处理操作,但我不知道如何让它工作。
问题是,当一个单元格的值发生变化时,我需要为一系列单元格着色。有什么想法吗?
谢谢
问题:
- 您只想检查单个单元格,即已编辑的单元格 (
var value = sSheet.getActiveCell().getValue();
)。因此,使用循环没有意义。
解决方案:
- 使用 event object 获取有关编辑单元格的数据(sheet、列索引、行索引等),而不是使用循环并检查每个
getActiveCell().getColumn()
时间。默认情况下,此事件对象作为参数传递给onEdit
(下面示例中的e
),但您应该将其作为参数传递给changeColor
函数。 - 在执行任何其他操作之前,检查编辑的单元格是否是您正在跟踪的范围内的编辑单元格之一(正确 sheet,第 3 行,
startColorCol
和 [= 之间的列17=]. - 如果编辑的单元格在正确的范围内,更新背景颜色。
代码示例:
function onEdit(e) {
// ...Some stuff...
changeColor(e, sheetName, startColorCol,sizeCellCol, totalCellCol);
}
function changeColor(e, sheetName, startColorCol,sizeCellCol, totalCellCol) {
const range = e.range;
const column = range.getColumn();
const row = range.getRow();
const sSheet = range.getSheet();
if (sSheet.getName() === sheetName && column >= startColorCol && column <= totalCellCol && row >= 3) {
const value = range.getValue();
let col = "white"; // Default background color
switch (value) {
case "fait":
col = "MediumSeaGreen";
break;
case "sans réponse":
col = "Orange";
break;
case "proposition":
col = "Skyblue";
break;
case "Revisions Req":
col = "Gold";
break;
case "annulé":
col = "LightCoral";
break;
default:
break;
}
sSheet.getRange(row, column-2, 1, sizeCellCol).setBackground(col);
}
}