如何为多张工作表设置一个 onOpen 函数?

How can I set one onOpen function for several sheets?

我有一个包含 6 个相似工作表的工作簿。我有一个脚本可以帮助我根据 A 列中的日期保护行。每一行都有一个日期。这些行是根据日期排序的,我们几乎每天都会添加带有新日期和数据的信息。当日期早于今天时,该行将受到保护,因此我们可以在包含当前日期和未来日期的行中输入新信息。

因此,今天黄色行受到保护。这是 worksheet 的 link。

我使用的脚本:

    function onOpen(e) {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ISKUR");
  var dateRange = sh.getRange(6, 1, sh.getLastRow()-2, 1);
  var val = dateRange.getDisplayValues();
  var curDate = Utilities.formatDate(new Date(), "GMT+3", "MM/dd/YYYY");
  var protectRow;
  //check if date is less than the current date
  for(var i = 0; i < val.length; i++){
    if(val[i][0]>=curDate){
      protectRow = i;
      break;
    }
  }
  
  var protection = sh.getProtections(SpreadsheetApp.ProtectionType.RANGE);
  //If protection exists, update else add new one.
  if(protection.length > 0){
    var range = sh.getRange(6, 1, protectRow, 13);
    protection[0].setRange(range);
  }else{
    sh.getRange(6, 1, protectRow, 13).protect();
  }
}

function onOpen(e) {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var dateRange = sh.getRange(6, 1, sh.getLastRow()-2, 1);
  var val = dateRange.getDisplayValues();
  var curDate = Utilities.formatDate(new Date(), "GMT+3", "MM/dd/YYYY");
  var protectRow;
  //check if date is less than the current date
  for(var i = 0; i < val.length; i++){
    if(val[i][0]>=curDate){
      protectRow = i;
      break;
    }
  }
  
  var protection = sh.getProtections(SpreadsheetApp.ProtectionType.RANGE);
  //If protection exists, update else add new one.
  if(protection.length > 0){
    var range = sh.getRange(6, 1, protectRow, 13);
    protection[0].setRange(range);
  }else{
    sh.getRange(6, 1, protectRow, 13).protect();
  }
}

似乎有几个页面无法正常工作。如果所有工作表都具有相似的结构(A 列中的日期),我如何使用此脚本在多个工作表中保护行?

问题:

您不能有多个 onOpen 触发器。

解决方案:

解决方案 1(推荐):为多个 sheet 执行代码:

此代码假设您可以 运行 相同的 代码用于您在 sheetNames 数组中指定的每个 sheet:

function onOpen(e) {
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetNames = ['ISKUR','Sheet1']; // put the names of the sheets you want to run the script
  
  sheetNames.forEach(name=>{ 
         var sh = ss.getSheetByName(name);
         var dateRange = sh.getRange(6, 1, sh.getLastRow()-2, 1);
         var val = dateRange.getDisplayValues();
         var curDate = Utilities.formatDate(new Date(), "GMT+3", "MM/dd/YYYY");
         var protectRow;
         //check if date is less than the current date
         for(var i = 0; i < val.length; i++){
            if(val[i][0]>=curDate){
            protectRow = i;
            break;
            }
         }  
        var protection = sh.getProtections(SpreadsheetApp.ProtectionType.RANGE);
       //If protection exists, update else add new one.
       if(protection.length > 0){
         var range = sh.getRange(6, 1, protectRow, 13);
         protection[0].setRange(range);
       }else{
       sh.getRange(6, 1, protectRow, 13).protect();
       }                          
  });
}

解决方案 2:为每个 sheet 创建多个函数:

如果您想要 运行 不同 不同 sheet 代码:

,则推荐使用此解决方案
function onOpen(e){
  onOpen1(e);
  onOpen2(e);
}

function onOpen1(e) {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  // rest of the code
}

function onOpen2(e) {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ISKUR");
  // rest of the code
}

如果不同的 sheet 具有不同的结构,或者您想为各个 sheet 应用独特的逻辑,那么该解决方案会很方便。