GMail API:脚本在手动运行时有效,但在触发时不起作用

时间:2018-07-15 04:05:58

标签: google-apps-script gmail 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()并没有帮助,因为我只能通过手动运行脚本来查看其输出,但是手动运行该脚本时不会出现任何问题。

据我可以从Google网站上得知的问题错误(我不了解其布局)是:

TypeError: Function getMessage in Object [object Object] was not found

对我来说没有任何意义,正弦函数getMessage中的draft唯一调用isMyEx方法的时间是{{1 }}作为其原型,而应该以GmailDraft作为其原型,而该原型肯定具有Object方法。

到目前为止,我唯一的猜测是它与function hoisting有关,我对它的规则不太了解。但是我已经尝试了几种排序函数以及在何处定义函数的方法-当我手动运行脚本时,所有方法都起作用。同样,当Google自动触发脚本时,此失败仅发生在 ,这使我无休止。

相关问题: Gmail API message.list from trigger
Function works only when launched manually (not when triggered) in Google Apps Script Form

1 个答案:

答案 0 :(得分:1)

这真是愚蠢,但万一将来可能对其他人有帮助(不会,因为这种愚蠢程度无法复制,但是):

在脚本的原始版本中,函数getMessageisMyEx之外的全局作用域*中或多或少地被声明为以下形式:

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下方有红色消息。起初这对我来说没有意义,因为我认为触发器是针对整个脚本的,但是随后我更加仔细地查看了按钮,并意识到这意味着触发器仅尝试运行函数{{1} },而不是整个脚本文件(我想这对于更大的脚本来说是有意义的)。无论如何,在将Selected function not found从全局范围中移出之后,就无法再找到该功能了。

无论如何,在将触发器更改为isMyEx而不是isMyEx后,使用自动触发器可以使一切正常/正常运行,而不仅仅是在我手动运行脚本时。