Google apps script GMail API:脚本在手动运行时工作,但在触发时不工作

Google apps script GMail API:脚本在手动运行时工作,但在触发时不工作,google-apps-script,gmail,gmail-api,Google Apps Script,Gmail,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();

当我手动运行(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()
没有帮助,因为查看其输出的唯一方法是手动运行脚本,但手动运行脚本时,脚本不会出现任何问题

据我从谷歌网站(我不了解布局)上所知,存在问题的错误是:

这对我来说没有任何意义,因为调用
getMessage
方法的唯一时间是通过函数
isMyEx
中的
draft
,它不应该将
Object
作为它的原型,而是应该将它作为它的原型,它肯定有一个
getMessage
方法

到目前为止,我唯一的猜测是它与我不太了解的规则有关。但是我已经研究了几种排序函数的方法以及在哪里定义它们——当我手动运行脚本时,所有这些方法都起作用。同样,只有当脚本由Google自动触发时,才会出现这种失败,这让我非常困惑

相关问题:

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

在我的脚本的原始版本中,函数
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
)之后,当我再次单击脚本的触发器按钮时,在触发器
未找到选定函数的下方出现了一条红色消息。这对我来说一开始没有意义,因为我认为触发器适用于整个脚本,但后来我更仔细地查看了按钮,意识到这意味着触发器只是试图运行函数
isMyEx
,而不是整个脚本文件(我想这对于更大的脚本来说是有意义的)。无论如何,在从全局范围移动
isMyEx
之后,该函数再也找不到是有道理的

无论如何,在我将触发器改为
noSend
而不是
isMyEx
后,自动触发器的一切都很好/完美,而不仅仅是手动运行脚本

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;
};