google-apps-script - 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);
}
}
解决方案
请记住,每个人都会看到相同版本的电子表格
如果多个用户同时打开文件,您的脚本将导致冲突,因为不可能为不同用户隐藏不同的工作表
设想:
- 用户 A 首先打开电子表格
- 让我们假设脚本按预期工作,只显示“属于”用户 A 的工作表,其余的隐藏
- 现在用户 B 打开电子表格 - 这将再次触发触发器并隐藏用户 A 的工作表但显示用户 B 的工作表
- 现在用户 A 将能够看到用户 B 的工作表,但不再是他自己的工作表了!
工作区
- 我建议您采用不同的方法,即为每个用户创建单独的电子表格(仅包含用户应该有权访问的工作表),这些电子表格将与包含所有数据的主电子表格同步
- 主电子表格和单个用户电子表格之间的数据可以通过IMPORTRANGE或带
onEdit
触发器的 Apps 脚本同步 - 后者的优点是能够双向同步工作表
- 也就是说 - 如果您在主电子表格中执行编辑,则
onEdit
绑定到主电子表格的触发器会将值设置到用户电子表格中,反之亦然。如果您还在onEdit
suer 电子表格中实现了触发器,它将实现用户对主电子表格所做的编辑 - 不会有“乒乓效应”,因为只有手动编辑才会
onEdit
触发触发器
推荐阅读
- ubuntu-20.04 - 从 snapstore(ubuntu 商店)安装后 Flutter 桌面 Linux 应用程序不起作用
- flutter - 图像未在颤动中显示中心
- bash - 用于读取文件、排序和打印重复记录及其标识号的 Bash 脚本
- javascript - 通过谷歌脚本将谷歌表单目标设置为响应
- amazon-s3 - 如何保留有关使用的 StorageGrid 内存的信息?还有其他方法可以找出有关已用磁盘空间的数据吗?
- html - 我在对焦按钮方面遇到了一些问题
- python - 在新的熊猫数据框中进行更改时,旧熊猫数据框中的值正在发生变化
- python - 无法在 Python 3.8 32 位上将 win32gui 和 win32ui 模块导入我的项目
- pandas - alueError:未知标签类型:svc 技术的“连续”
- sql - 如何使用 linq 实体仅从 sql 表中选择最后一个条目