我还在学习GoogleApp脚本。任何人都可以指导我如何在具有不同工作表名称的多个工作表的Google电子表格中应用相同的代码吗?也许我需要一个循环脚本?
提前感谢您的帮助!
这是我到目前为止的脚本:
function MakeRowGray() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var columnD = sheet.getRange(2, 2, sheet.getLastRow()-1, 1); // Row B
var dValues = columnD.getValues();
var columnE = sheet.getRange(2, 3, sheet.getLastRow()-1, 1); // Row C
var eValues = columnE.getValues();
for (var i = 2; i < dValues.length + 2; i++) {
if (dValues[i-2][0].toUpperCase() == 'Y' && eValues[i-2][0].toUpperCase() == 'Y') { // Checks for 'Y' in both D and E columns (Participated & Received)
// If they're both yes, make them gray...
sheet.getRange(i, 1, 1, 7).setBackgroundColor("#CCCCCC"); // Make A through H gray
}
else if (dValues[i-2][0].toUpperCase() == 'Y' && eValues[i-2][0].toUpperCase() != 'Y' && eValues[i-2][0].toUpperCase() != 'W' && eValues[i-2][0].toUpperCase() != 'W?') // IN PROGRESS CODE -- MAKE ROW BLUE??
{
sheet.getRange(i, 1, 1, 7).setBackgroundColor("#AAAAFF"); // Make A through H blue
}
else if (dValues[i-2][0].toUpperCase() == 'Y' && eValues[i-2][0].toUpperCase() == 'W?') // Not sure if Waiting or not (W?)
{
sheet.getRange(i, 1, 1, 7).setBackgroundColor("#FFBB00"); // Make A through H slightly orange
}
else if (dValues[i-2][0].toUpperCase() == 'X' && eValues[i-2][0].toUpperCase() == 'X') {
sheet.getRange(i, 1, 1, 7).setBackgroundColor("#FF0000"); // Red
}
else if (dValues[i-2][0].toUpperCase() == 'Y' && eValues[i-2][0].toUpperCase() == 'W') {
sheet.getRange(i, 1, 1, 7).setBackgroundColor("#FFFF00"); // Yellow
}
else
{ // Reset...
sheet.getRange(i, 1, 1, 7).setBackgroundColor("#FFFFFF");
}
}
};
答案 0 :(得分:1)
您已经确定需要更改自己编写的功能,以便能够以比目前支持的更广泛的方式应用它。此类工作通常称为重构。
在你的情况下,这可能是要遵循的思考过程......
由于您希望在多个工作表上执行相同的操作,因此请概括当前函数以对任意Sheet
进行操作。应更改MakeRowGray()
函数的定义以接受sheetName
作为参数。如果您仍希望保留现有行为,即在没有任何参数的情况下调用MakeRowGray()
将在Sheet1
上运行,这可以容纳。
function MakeRowGray(sheetName) {
sheetName = sheetName || 'Sheet1'; // Default to operate on Sheet1
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
...
进行更改,然后进行测试。该功能是否仍然像以前一样?你能传递其他一张床单的名称,并在那里工作吗?
接下来,编写一个新函数来处理迭代各种工作表的问题。此函数会将工作传递给重构的MakeRowGray()
。
function makeAllSheetsGray() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (var i=0; i<sheets.length; i++) {
MakeRowGray( sheet.getName() );
}
}
测试此功能是否符合您的预期。是否找到所有床单,无论名称如何?正确的名称是否传递给MakeRowGray()
?
改善/整理。
这是未来维护和重复使用的重要一步。
功能名称有意义吗?
例如,MakeRowGray()
没有清楚地表明函数实际在做什么,可能是因为之前的重构。像conditionallyColorSheetRows
这样的名称将是一种改进。新功能makeAllSheetsGray()
也应该适应,因为它基于之前不恰当的名称。
变量名称有意义吗?
你在做你不需要的工作吗?
例如,在makeAllSheetsGray()
中,我们获取了一个Sheet实例数组,然后将工作表的名称传递给MakeRowGray()
,我们使用该名称来获取Sheet实例的句柄。仅使用Sheet实例的进一步重构将节省一些处理。可能有理由保留原样,但由于Google Apps脚本的执行时间有限,因此寻找缩短周期的方法总是很明智。