首页 > 解决方案 > Google Apps 脚本 onOpen() 简单触发器不起作用

问题描述

我编写了一个简单的 onOpen 代码,用于在 Google 表格上为多个用户触发。这段代码的作用是隐藏与其他用户有关的工作表,但只打开属于该用户的工作表。但是,当我打开工作表时,此代码似乎工作正常,但不会为我的其他用户触发,它使工作表保持隐藏状态,原因是onOpen()代码永远不会触发。


    /** @OnlyCurrentDoc */


function onOpen() {

  var app = SpreadsheetApp;
  var ProjectSummary = app.getActiveSpreadsheet().getSheetByName("Project Summary (YTD)");
  var ProjectSummaryMonth = app.getActiveSpreadsheet().getSheetByName("Project Summary (Monthly)");
  var AdminInputs = app.getActiveSpreadsheet().getSheetByName("AdminInputs");
  var Project = app.getActiveSpreadsheet().getSheetByName("ProjectInputs");
  var TimeTracker = app.getActiveSpreadsheet().getSheetByName("Login");

  //User Sheets
  var SRSheet = app.getActiveSpreadsheet().getSheetByName("SR");
  var DSSheet = app.getActiveSpreadsheet().getSheetByName("DS");
  var GESheet = app.getActiveSpreadsheet().getSheetByName("GE");
  var JCSheet = app.getActiveSpreadsheet().getSheetByName("JC");
  var JISheet = app.getActiveSpreadsheet().getSheetByName("JI");
  var MCSheet = app.getActiveSpreadsheet().getSheetByName("MC");
  var MQSheet = app.getActiveSpreadsheet().getSheetByName("MQ");
  var NSSheet = app.getActiveSpreadsheet().getSheetByName("NS");
  var PJSheet = app.getActiveSpreadsheet().getSheetByName("PJ");
  var SPSheet = app.getActiveSpreadsheet().getSheetByName("SP");


  // Logic Begins Here, we are checking time stamp and choosing only sheets based on if the sheet was active within past 3 hours or not, if it was not we hide that sheet

  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

  var currDate = new Date();
  var currDateH = (currDate/1000)/(60*60);

  for(var i=0; i<=14; i++){ 
    for(var j = 2; j<=16; j++){
      if(sheets[i].getName()==TimeTracker.getRange("A"+(j)).getValue() && sheets[i].getName()!=="Login"  ){
        var userdatetime = (TimeTracker.getRange("B"+(j)).getValue()/1000)/(60*60);
        var diff = currDateH-userdatetime;
        if(diff>=0.5)
        {
          sheets[i].hideSheet();
        }
     }

   }
  }

  var SR = ['sr@neovialogistics.com'];
  var DS= ['ds@neovialogistics.com'];
  var GE = ['Ge@neovialogistics.com'];
  var JI = ['jaI@neovialogistics.com'];
  var JC = ['jc@neovialogistics.com'];
  var MC = ['mc@neovialogistics.com'];
  var MQ = ['mq@neovialogistics.com'];
  var NS = ['ns@neovialogistics.com'];
  var PJ = ['PJ@neovialogistics.com'];
  var SP = ['sp@neovialogistics.com'];


  if (SR.indexOf(Session.getEffectiveUser().getEmail()) >= 0){
    SRSheet.showSheet();
    TimeTracker.getRange("B11").setValue(currDate); 
  }

  if (DS.indexOf(Session.getEffectiveUser().getEmail()) >= 0){
    DSSheet.showSheet();
    TimeTracker.getRange("B2").setValue(currDate); 
  }

  if (GE.indexOf(Session.getEffectiveUser().getEmail()) >= 0){
    GESheet.showSheet();
    Project.showSheet();

    ProjectSummary.showSheet();
    ProjectSummaryMonth.showSheet();
    TimeTracker.getRange("B3").setValue(currDate);

    TimeTracker.getRange("B13").setValue(currDate);
    TimeTracker.getRange("B14").setValue(currDate);
    TimeTracker.getRange("B15").setValue(currDate);
  }

  if (JI.indexOf(Session.getEffectiveUser().getEmail()) >= 0){
    JISheet.showSheet();
    TimeTracker.getRange("B5").setValue(currDate); 
  }

  if (JC.indexOf(Session.getEffectiveUser().getEmail()) >= 0){
    JCSheet.showSheet();
    Project.showSheet();

    ProjectSummary.showSheet();
    ProjectSummaryMonth.showSheet();
    TimeTracker.getRange("B4").setValue(currDate);

    TimeTracker.getRange("B13").setValue(currDate);
    TimeTracker.getRange("B14").setValue(currDate);
    TimeTracker.getRange("B15").setValue(currDate);

  }

  if (MC.indexOf(Session.getEffectiveUser().getEmail()) >= 0){
    MCSheet.showSheet();
    TimeTracker.getRange("B6").setValue(currDate); 
  }

  if (MQ.indexOf(Session.getEffectiveUser().getEmail()) >= 0){
    MQSheet.showSheet();
    TimeTracker.getRange("B7").setValue(currDate); 
  }

  if (NS.indexOf(Session.getEffectiveUser().getEmail()) >= 0){
    NSSheet.showSheet();
    Project.showSheet();

    ProjectSummary.showSheet();
    ProjectSummaryMonth.showSheet();
    TimeTracker.getRange("B8").setValue(currDate);

    TimeTracker.getRange("B13").setValue(currDate);
    TimeTracker.getRange("B14").setValue(currDate);
    TimeTracker.getRange("B15").setValue(currDate);
  }

  if (PJ.indexOf(Session.getEffectiveUser().getEmail()) >= 0){
    PJSheet.showSheet();
    TimeTracker.getRange("B9").setValue(currDate); 
  }

  if (SP.indexOf(Session.getEffectiveUser().getEmail()) >= 0){
    SPSheet.showSheet();
    TimeTracker.getRange("B10").setValue(currDate); 
  }

}

标签: google-apps-scriptgoogle-sheetstriggers

解决方案


请记住,每个人都会看到相同版本的电子表格

如果多个用户同时打开文件,您的脚本将导致冲突,因为不可能为不同用户隐藏不同的工作表

设想:

  • 用户 A 首先打开电子表格
  • 让我们假设脚本按预期工作,只显示“属于”用户 A 的工作表,其余的隐藏
  • 现在用户 B 打开电子表格 - 这将再次触发触发器并隐藏用户 A 的工作表但显示用户 B 的工作表
  • 现在用户 A 将能够看到用户 B 的工作表,但不再是他自己的工作表了!

工作区

  • 我建议您采用不同的方法,即为每个用户创建单独的电子表格(仅包含用户应该有权访问的工作表),这些电子表格将与包含所有数据的主电子表格同步
  • 主电子表格和单个用户电子表格之间的数据可以通过IMPORTRANGE或带onEdit触发器的 Apps 脚本同步
  • 后者的优点是能够双向同步工作表
  • 也就是说 - 如果您在主电子表格中执行编辑,则onEdit绑定到主电子表格的触发器会将值设置到用户电子表格中,反之亦然。如果您还在onEditsuer 电子表格中实现了触发器,它将实现用户对主电子表格所做的编辑
  • 不会有“乒乓效应”,因为只有手动编辑才会onEdit触发触发器

推荐阅读