GMail API:脚本在手动运行时有效,但在触发时无效

问题描述 投票:0回答:1

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

google-apps-script gmail gmail-api
1个回答
1
投票

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

在我的脚本的原始版本中,函数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后,一切都可以正常/完美地使用自动触发器,而不仅仅是当我手动运行脚本时。

© www.soinside.com 2019 - 2024. All rights reserved.