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

答案

这是非常愚蠢的,但万一它可能在将来帮助其他人(它不会,因为这种愚蠢程度可能无法复制但是):

在我的脚本的原始版本中,函数isMyExdoSend之外的全局范围*中声明或多或少如下:

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 中无效 [重复]

启动 jQuery 脚本在放置在控制台时有效,但在放置到站点代码时无效