gpt4 book ai didi

javascript - 以编程方式向 Google Apps 脚本中的加载项添加基于时间的触发器

转载 作者:行者123 更新时间:2023-12-02 23:15:13 25 4
gpt4 key购买 nike

故事

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

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

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

////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////// Standard Install Logic ////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////

function onInstall(e) {
onOpen(e);
}

function onOpen(e) {
// sets up the UI in case it's not in the right auth mode
var menu = SpreadsheetApp.getUi().createAddonMenu();
if (e && e.authMode !== ScriptApp.AuthMode.FULL) {
menu.addItem("Set Up the Addon", "initialSetup") // Add a menu item that works in all auth modes to get to full authorization.
.addToUi();

} else {
menu
.addItem("Menu Stuff", "someFunction")
.addToUi();

var checkTrigger = triggerCheck(); // ensure the the trigger is installed
if (checkTrigger != true) {
createHoneybeeTrigger();
}
}
}


////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////// Functions to Help Set Up the Trigger if It's Not There ////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////

// function that's callable from the UI if the user isn't yet in auth mode FULL
function initialSetup () {
triggerCheck();
onOpen();
SpreadsheetApp.getUi().alert('Everything looks good! You can now use the addon.')
}

// function to see if a trigger yet exists that calls the desired function
function triggerCheck () {

var triggers = ScriptApp.getProjectTriggers(); // get current project's triggers
var triggerFunctions = [];
triggers.forEach(function (trigger) {
var handlerFunction = trigger.getHandlerFunction();
triggerFunctions.push(handlerFunction); // push the functions called by triggers into array
});

// check the array to see if one of the current trigger functions is myFunction
var correctTrigger = function(functionName) { // sets up the filter
return functionName == 'myFunction';
}
var triggerPresent = triggerFunctions.some(correctTrigger);

return triggerPresent;
}

// function to create the trigger if it's not yet there
function createTrigger () {
ScriptApp.newTrigger('myFunction')
.forSpreadsheet(SpreadsheetApp.getActive())
.timeBased()
.everyHours(12)
.create();
return true;
}

奇怪的验证结果

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

这个东西真的很难测试,因为在为测试帐户安装时,我无法深入了解该插件的事件触发器。有什么提示吗?

<小时/>

关于 SO 的一个类似但不准确的问题是 here ,但我的问题是关于可安装的 Google 插件,因此用例有所不同。

最佳答案

长话短说,你必须改变你的附加逻辑。

为什么?

像 onOpen 这样的简单触发器,当它们被事件触发时,在这种情况下打开在有限授权模式下运行的电子表格,这意味着无法执行某些操作(例如获取项目触发器)。

提示

  • 保持 onOpen 和其他简单的触发器来做“简单”的事情。首先限制 onOpen 创建附加自定义菜单。
  • 使用打开时可安装的触发器来执行插件(脚本)/电子表格/用户设置/初始化验证
  • 结账 https://developers.google.com/apps-script/support/troubleshooting了解 Google Apps 脚本项目的基本问题排查技术。在这种特定情况下,执行脚本和错误记录 https://scripts.google.com/executions可以帮助找出错误发生的位置以及错误是什么。

备注

是的,附加组件很难测试,但你并不孤单。这里我们有很多问题可以帮助您完成您的旅程,例如 How can I test a trigger function in GAS?

相关

关于javascript - 以编程方式向 Google Apps 脚本中的加载项添加基于时间的触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57191267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com