GMail API:脚本在手动运行时有效,但在触发时无效
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GMail API:脚本在手动运行时有效,但在触发时无效相关的知识,希望对你有一定的参考价值。
Gmail API(script.google.com)的以下脚本在我手动运行时没有任何问题,但是当Google使用基于时间的触发器触发它时,它会失败。
function noSend(e) {
var drafts = GmailApp.getDrafts();
var callback = function(draft) {
function isMyEx(draft) {
var recipient = draft.getMessage().getTo();
var isTheirEmail = /nameofmyex/.test(recipient);
return isTheirEmail; };
if(isMyEx(draft)) {
draft.update('', '', '');
draft.deleteDraft();
} else { } };
drafts.forEach(callback); return;
};
问题:当我手动运行脚本时,如何在未发生错误时调试此问题?
即添加Logger.log()
没有帮助,因为我看到它的输出的唯一方法是我手动运行脚本 - 但是当我手动运行脚本时脚本运行没有任何问题。
有问题的错误,据我所知,谷歌网站(我不了解布局)是:
TypeError: Function getMessage in Object [object Object] was not found
这对我来说没有任何意义,正义getMessage
方法被调用的唯一一次是draft
函数isMyEx
,它不应该有Object
作为它的原型,而是应该有GmailDraft
作为它的原型,这绝对是有一个getMessage
方法。
到目前为止,我唯一的猜测是它与function hoisting有关,其规则我不太了解。但是我已经开始使用几种方式对函数进行排序以及在何处定义它们 - 当我手动运行脚本时,所有这些方法都有效。同样,只有在Google自动触发脚本时才会发生此故障,这让我感到困惑。
相关问题:Gmail API message.list from trigger Function works only when launched manually (not when triggered) in Google Apps Script Form
这是非常愚蠢的,但万一它可能在将来帮助其他人(它不会,因为这种愚蠢程度可能无法复制但是):
在我的脚本的原始版本中,函数isMyEx
在doSend
之外的全局范围*中声明或多或少如下:
function isMyEx(draft) {
var recipient = draft.getMessage().getTo();
var isTheirEmail = /nameofmyex/.test(recipient);
return isTheirEmail; };
function noSend(e) {
var drafts = GmailApp.getDrafts();
var callback = function(draft) {
if(isMyEx(draft)) {
draft.update('', '', '');
draft.deleteDraft();
} else { } };
drafts.forEach(callback); return;
};
由于isMyEx
是在noSend
之前定义的,当我点击按钮设置脚本的触发器时,要触发的默认函数是首先定义的isMyEx
。如果它在doSend
之外被调用,而不是作为回调内容,那当然会抛出我描述的错误。
*这可能被认为是不好的做法。如果是这样,请理解我是出于无知,而不是出于将恶意编码做法传播给本网站访问者的恶意。特别是,请不要对我大喊大叫。我已经为这种糟糕的编码习惯服务了我的惩罚,因为它已经回来咬我的背后,见下文。
故事的道德:触发器不适用于整个脚本。不仅可以,而且实际上必须单独为脚本中的每个函数设置触发器。因此,如果你不想看看你设置触发器的脚本中的哪个函数,请不要像我没有得到预期结果那样惊讶。
我只想出这个,因为在将isMyEx
的定义放入noSend
(然后在callback
内)之后,当我再次点击脚本的触发按钮时,触发器Selected function not found
下面有一条红色消息。起初这对我来说没有意义,因为我认为触发器是针对整个脚本的,但后来我仔细查看了按钮并意识到这意味着触发器只是试图运行isMyEx
函数,而不是整个脚本文件(我想这对于更大的脚本是有意义的)。无论如何,在从全球范围移动isMyEx
后,有意义的是无法再找到该功能。
无论如何,在我将触发器更改为noSend
而不是isMyEx
后,一切都可以正常/完美地使用自动触发器,而不仅仅是当我手动运行脚本时。
以上是关于GMail API:脚本在手动运行时有效,但在触发时无效的主要内容,如果未能解决你的问题,请参考以下文章
尽管脚本在手动运行时有效,但 Crontab 没有在 macOS 中运行我的 python 脚本
R autoplot 在逐行运行时有效,但在 source-ing R 脚本时无效
Vue 组件在“手动”多次使用时不会呈现......但在循环重复时有效
我在 index.html 中指向 manifest.json 的链接在我运行反应脚本“yarn start”时有效,但在我运行“python3 manage.py runserver”时无效
Json String Parsing 在从 MSDOS 运行时有效,但在 Windows 上的 Ubuntu 上的 Bash 中无效 [重复]