Javascript 以编程方式将基于时间的触发器添加到Google Apps脚本中的加载项

Javascript 以编程方式将基于时间的触发器添加到Google Apps脚本中的加载项,javascript,google-apps-script,google-sheets,triggers,google-apps-script-addon,Javascript,Google Apps Script,Google Sheets,Triggers,Google Apps Script Addon,故事 我正在发布我的第一个电子表格插件。这是一个教师交流工具,我需要脚本在安装时添加一个基于时间的触发器。在过去的一天左右,我一直在做这个,我想我已经接近了,但是我基于时间的触发器/函数仍然不适合测试人员 设置创建触发器的安装逻辑 到目前为止,我的逻辑如下: onInstalle调用OnOpen 在OnOpen中,几行代码调用一个函数,该函数使用ScriptApp.getProjectTriggers检查触发器是否存在;方法调用所需函数 如果一个还不存在,它将调用另一个函数来创建触发器 代码基本

故事

我正在发布我的第一个电子表格插件。这是一个教师交流工具,我需要脚本在安装时添加一个基于时间的触发器。在过去的一天左右,我一直在做这个,我想我已经接近了,但是我基于时间的触发器/函数仍然不适合测试人员

设置创建触发器的安装逻辑

到目前为止,我的逻辑如下: onInstalle调用OnOpen 在OnOpen中,几行代码调用一个函数,该函数使用ScriptApp.getProjectTriggers检查触发器是否存在;方法调用所需函数 如果一个还不存在,它将调用另一个函数来创建触发器 代码基本上如下所示:

//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////标准安装逻辑//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// 函数onInstalle{ 紫罗兰烯; } 功能性紫罗兰烯{ //设置UI以防其未处于正确的身份验证模式 var menu=SpreadsheetApp.getUi.createAddonMenu; 如果e&&e.authMode!==ScriptApp.authMode.FULL{ menu.addItem设置加载项,初始化设置//添加一个在所有身份验证模式下工作的菜单项,以获得完全授权。 .addToUi; }否则{ 菜单 .AddItem菜单内容,someFunction .addToUi; var checkTrigger=triggerCheck;//确保已安装触发器 如果checkTrigger!=true{ 索具; } } } //////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////用于帮助设置触发器(如果触发器不存在)的函数//////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //如果用户尚未处于完全身份验证模式,则可从UI调用的函数 函数初始设置{ 触发检查; onOpen; SpreadsheetApp.getUi.alert“一切看起来都很好!您现在可以使用该插件了。” } //函数,以查看是否存在调用所需函数的触发器 功能触发检查{ var triggers=ScriptApp.getProjectTriggers;//获取当前项目的触发器 var triggerFunctions=[]; 触发器。forEachfunction触发器{ var handlerFunction=trigger.getHandlerFunction; triggerFunctions.pushhandlerFunction;//将触发器调用的函数推入数组 }; //检查数组以查看当前触发器函数之一是否为myFunction var correctTrigger=functionName{//设置筛选器 返回函数名==“myFunction”; } var triggerPresent=triggerFunctions.somecorrectTrigger; 返回触发器当前; } //函数来创建触发器(如果它还不存在) 函数createTrigger{ ScriptApp.newTrigger'myFunction' .ForPreadSheetPreadSheetApp.getActive .基于时间的 .每小时12 创造 返回true; } 奇怪的验证结果

我还设置了一个小函数,可以从用户的UI调用,它使用上面列出的triggerCheck函数来检查是否安装了触发器,然后就结果向他们发出警报。但奇怪的事情正在发生。在我的测试帐户中,它处于auth模式FULL,我可以运行这个菜单项,检查触发器是否存在,并查看它是否存在。然而,扳机仍然不会触发。为什么会发生这种情况

这些东西真的很难测试,因为当为测试帐户安装时,我无法看到加载项的活动触发器。有什么建议吗


关于SO is还有一个类似但不完全相同的问题,但我的问题是关于可安装的Google Add-ons,所以用例不同。

长话短说,您必须更改您的Add-on逻辑

为什么?

像onOpen这样的简单触发器,当它们被事件触发时,在本例中是在有限授权模式下打开运行的电子表格,这意味着某些操作(如获取项目触发器)是不可能的

提示

保持onOpen和其他简单的触发器来做简单的事情。首先限制onOpen以创建附加自定义菜单。 使用打开的可安装触发器执行附加脚本/电子表格/用户设置/初始化验证 签出以了解谷歌应用程序脚本项目的基本故障排除技术。在这种特定情况下,执行记录和错误登录可以帮助确定错误发生的位置和错误是什么。 评论

是的,附加组件很难测试,但并非只有您一人。在这里,我们有很多问题可以帮助你的旅程,比如

相关的


堆栈代码段应仅用于可执行的HMTL/CSS/JavaScript。谷歌应用程序脚本在此不可执行