0

我还在学习 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");

    }

  }
};
4

1 回答 1

1

您已经确定需要更改您编写的函数,以便可以以比当前支持的更广泛的方式应用它。这种类型的工作通常被称为重构

在你的情况下,这可能是要遵循的思考过程......

  1. 由于您想在多张纸上做同样的事情,所以将当前函数概括为对任意Sheet. MakeRowGray()应将函数的定义更改为接受 asheetName作为参数。如果您仍然希望保留现有行为,即MakeRowGray()不带任何参数的调用将在 上运行Sheet1,则可以进行调整。

    function MakeRowGray(sheetName) { 
      sheetName = sheetName || 'Sheet1';  // Default to operate on Sheet1
    
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
      ... 
    

    做出改变,并测试它。该功能是否仍然像以前一样运行?你能以你的另一张纸的名义传递,它在那里工作吗?

  2. 接下来,编写一个新函数来处理遍历各种工作表的问题。这个函数将把工作交给重构的MakeRowGray().

    function makeAllSheetsGray() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheets = ss.getSheets();
    
      for (var i=0; i<sheets.length; i++) {
        MakeRowGray( sheet.getName() );
      }
    }
    

    测试此功能是否符合您的预期。它是否找到所有工作表,无论名称如何?正确的名称是否传递给MakeRowGray()?

  3. 改善/收拾东西。

    这是未来维护和可重用性的重要一步。

    • 函数名有意义吗?

      例如,MakeRowGray()没有明确指出函数实际在做什么,可能是因为之前的重构。像这样的名字conditionallyColorSheetRows将是一个改进。新函数 ,makeAllSheetsGray()也应该适应,因为它是基于以前的不合适的名称。

    • 变量名有意义吗?

    • 你在做你不需要的工作吗?

      例如,makeAllSheetsGray()我们得到一个 Sheet 实例的数组,然后将工作表的名称传递到MakeRowGray()我们使用该名称来获取 Sheet 实例的句柄的位置。进一步重构以仅使用 Sheet 实例将节省一些处理。保留原样可能是有原因的,但由于 Google Apps 脚本的执行时间有限,因此寻找减少周期的方法总是很明智的。

于 2013-09-18T20:26:44.977 回答