如何在Google电子表格中为多个/各种工作表名称应用循环?

时间:2013-09-18 18:06:31

标签: google-apps-script google-sheets google-spreadsheet-api

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

    }

  }
};

1 个答案:

答案 0 :(得分:1)

您已经确定需要更改自己编写的功能,以便能够以比目前支持的更广泛的方式应用它。此类工作通常称为重构

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

  1. 由于您希望在多个工作表上执行相同的操作,因此请概括当前函数以对任意Sheet进行操作。应更改MakeRowGray()函数的定义以接受sheetName作为参数。如果您仍希望保留现有行为,即在没有任何参数的情况下调用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脚本的执行时间有限,因此寻找缩短周期的方法总是很明智。