首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为多个工作表设置一个onOpen函数?

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

Stack Overflow用户
提问于 2021-02-24 10:56:46
回答 1查看 109关注 0票数 0

我有一本工作簿,里面有6张类似的工作表。我有一个脚本,它帮助我根据日期保护A列中的行。行按照日期进行排序,我们几乎每天都使用新的日期和数据添加信息。当日期在今天之前,行将受到保护,因此我们可以在行中输入新的信息,包括当前日期和未来。

所以,今天黄色的行是受保护的。下面是工作表的链接。

我使用的脚本:

代码语言:javascript
复制
    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列中),那么如何使用此脚本在几个工作表中保护行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-24 11:21:18

问题:

不能有多个onOpen触发器。

解决办法:

解决方案1(推荐):为多个工作表执行代码,如:

此代码假定您可以对在数组中指定的每个工作表运行相同的代码:

代码语言:javascript
复制
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:为每个工作表创建多个函数:

如果您想对不同的工作表运行不同的代码,建议使用此解决方案:

代码语言:javascript
复制
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
}

如果不同的工作表具有不同的结构,或者您希望为单个工作表应用独特的逻辑,则该解决方案变得非常方便。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66349448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档